Skip to content

Achain_RPC

Achain edited this page Sep 20, 2017 · 3 revisions

JsonRpc的支持

目前支持两种JsonRpc模式,一种是Tcp-JsonRpc模式,另一种是Http-JsonRpc模式。

如何启动

在Windows系统中,打开命令提示符,进入到Achain钱包的目录下,输入启动命令:
Achain-c --rpcuser <usr-name> --rpcpassword <usr_pwd> --rpcport <port> --httpdendpoint <ip_addr> --server --data-dir <data-path>
    其中,rpcport为启动Tcp-JsonRpc模式,只需输入监听的端口号即可。
    httpdentpoint为Http-JsonRpc模式,需要配置监听的ip及端口号,并且在启动命令中需要加入--server才可启动rpc监听。
示例:启动rpc服务监听,rpcuser为admin,密码为123456,端口号8298为Tcp-JsonRpc监听端口,8299位Http-JsonRpc监听端口,数据保存在d:\config中,启动命令为:
    Achain-c --rpcuser admin --rpcpassword 123456 --rpcport 8298 --httpdendpoint 127.0.0.1:8299 --server --data-dir d:\config

RPC交互

1.Tcp-JsonRpc交互
    (1)发起一个TCP连接
    (2)将RPC请求做为数据流,发送登录(login)的RPC请求,并接收到正确的RPC返回
    (3)进行RPC交互
    (4)连接断开
    示例:
        #!/usr/bin/env python
        # encoding: utf-8

        import socket

	def is_receive_complete(data):
		if data is None or data == '':
			return False
		json_start = False
		json_tag_count = 0
		for c in data:
			if c == '{':
				if not json_start:
					json_start = True
				json_tag_count += 1
			elif c == '}':
				json_tag_count -= 1
			if json_start and json_tag_count == 0:
				return True
		return False

	def recv_until_json_complete(sd):
		left_data = ""
		while not is_receive_complete(left_data):
			data = sd.recv(4096)
			left_data += data
		return left_data


	login_payload = ''' { "jsonrpc": "2.0", "params": [ "admin", "123456" ], "id": "1", "method": "login" } '''
	get_info_payload = ''' { "jsonrpc": "2.0", "params": [], "id": "2", "method": "get_info" } '''

	RpcServerEndpoint = "127.0.0.1:10086"
	conn_tuple = RpcServerEndpoint.split(":")
	endpoint_tuple = (conn_tuple[0], int(conn_tuple[1]))

	sd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	sd.connect(endpoint_tuple)

	sd.sendall(login_payload)
	recv_data = recv_until_json_complete(sd)
	print recv_data

	sd.sendall(get_info_payload)
	recv_data = recv_until_json_complete(sd)
	print recv_data

	sd.close    
	
2.Http-JsonRpc交互
    (1)新增一个http header,key为Authorization,value为随机6个字节 + base64(rpcuser:rpcpassword)
    (2)将RPC请求做为HTTP包的包体,发起一个HTTP POST请求
    (3)获取HTTP返回,包体内容就是RPC的返回
    示例:
        #!/usr/bin/env python
        # encoding: utf-8

        import base64
        from requests import Request, Session

        get_info_payload = {"jsonrpc": "2.0", "params": [], "id": "2", "method": "info"}

        rpc_auth = "000000" + base64.b64encode("%s:%s" % ("admin", "123456"))
        auth_headers = {'Content-Type': 'application/json', 'Authorization': rpc_auth}
        post_url = "http://127.0.0.1:8080/rpc"

        s = Session()
        req = Request('POST', post_url, json=get_info_payload, headers=auth_headers)
        prepped = req.prepare()
        resp = s.send(prepped)

        print resp.text

RPC相关命令

1.rpc_start_server	临时启动客户端rpc模式
	调用前提:需要断开这次rpc的链接,重新进行rpc链接才能看出API执行效果
	入参:port,rpc端口服务号
	Rpc返回:
		{
			"id": 20,
			"result": null
		}
		
2.rpc_set_username	临时设置rpc的登录用户名
	调用前提:需要使用rpc_start_server指令让这条指令生效
	入参:username,rpc登录用户名
	Rpc返回:
		{
			"id": 60,
			"result": null
		}

3.rpc_set_password	临时设置rpc登录用户密码
	调用前提:需要使用rpc_start_server指令让这条指令生效
	入参:password,rpc登录密码
	Rpc返回:
		{
			"id": 60,
			"result": null
		}
		
Clone this wiki locally