-
Notifications
You must be signed in to change notification settings - Fork 61
Achain_RPC
Achain edited this page Sep 20, 2017
·
3 revisions
目前支持两种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
}