2. 接口设计

Hyperchain接口主要由六块接口组成: 1. 交易服务,方法名前缀为 "tx"; 2. 合约服务,方法名前缀为 "contract"; 3. 区块服务,方法名前缀为 "block"; 4. 消息订阅服务,方法名前缀为 "sub"; 5. 节点服务,方法名前缀为 "node"; 6. 证书服务,方法名前缀为 "cert";

接口设计基于JSON-RPC 2.0规范。所有HTTP请求均为POST请求,请求的参数包括:

  • jsonrpc: 指定JSON-RPC协议版本的字符串,如果是2.0版本,则必须准确写为 “2.0”。
  • namespace: 表示该条请求发送给哪个分区去处理。
  • method: 表示所要调用方法名称的字符串,格式为:(服务前缀)_(方法名)。
  • params: 调用方法所需要的结构化参数值,该成员参数可以被省略。
  • id: 已建立客户端的唯一标识id,该值必须包含一个字符串、数值。
  1. # Request
  2. curl -X POST -d '{"jsonrpc":"2.0","method":"block_latestBlock","namespace":"global","params":[],"id":1}' localhost:8081

返回值格式为:

  • jsonrpc: 指定JSON-RPC协议版本的字符串,如果是2.0版本,则必须准确写为 “2.0”。
  • namespace: 表示该条请求所属分区。
  • code: 状态码。若成功,则为0,其他状态码详见表5-1。
  • message: 错误信息。若成功,则为“SUCCESS”,否则为错误详细信息。
  • result: 被调用方法成功执行返回的结果。
  • id: 该值应与请求对象中的id值保持一致。
  1. # Response
  2. {
  3. "jsonrpc": "2.0",
  4. "namespace": "global",
  5. "id": 1,
  6. "code": 0,
  7. "message": "SUCCESS",
  8. "result": {
  9. "version": "1.4",
  10. "number": "0x3",
  11. "hash": "0x00acc3e13d8124fe799d55d7d2af06223148dc7bbc723718bb1a88fead34c914",
  12. "parentHash": "0x2b709670922de0dda68926f96cffbe48c980c4325d416dab62b4be27fd73cee9",
  13. "writeTime": 1481778653997475900,
  14. "avgTime": "0x2",
  15. "txcounts": "0x1",
  16. "merkleRoot": "0xc6fb0054aa90f3bfc78fe79cc459f7c7f268af7eef23bd4d8fc85204cb00ab6c",
  17. "transactions": [
  18. {
  19. "version": "1.4",
  20. "hash": "0xf57a6443d08cda4a3dfb8083804b6334d17d7af51c94a5f98ed67179b59169ae",
  21. "blockNumber": "0x3",
  22. "blockHash": "0x00acc3e13d8124fe799d55d7d2af06223148dc7bbc723718bb1a88fead34c914",
  23. "txIndex": "0x0",
  24. "from": "0x17d806c92fa941b4b7a8ffffc58fa2f297a3bffc",
  25. "to": "0xaeccd2fd1118334402c5de1cb014a9c192c498df",
  26. "amount": "0x0",
  27. "timestamp": 1481778652973000000,
  28. "nonce": 3573634504790373,
  29. "extra": "",
  30. "executeTime": "0x2",
  31. "payload": "0x81053a70000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000001c8"
  32. }
  33. ]
  34. }
  35. }

比如,接口调用成功的话,返回的字段有:jsonrpc、namespace、id、code、message、result,且code值为0,message值为“SUCCESS”,用户可通过这两个字段的值来判断接口调用是否成功,若调用失败,则code为非0值,message为错误信息。code值的定义如下:

code含义
0请求成功
-32700服务端接收到无效的json。该错误发送于服务器尝试解析json文本
-32600无效的请求(比如非法的JSON格式)
-32601方法不存在或者无效
-32602无效的方法参数
-32603JSON-RPC内部错误
-32000Hyperchain内部错误或者空指针或者节点未安装solidity环境
-32001查询的数据不存在
-32002余额不足
-32003签名非法
-32004合约部署出错
-32005合约调用出错
-32006系统繁忙
-32007交易重复
-32008合约操作权限不够
-32009(合约)账户不存在
-32010namespace不存在
-32011账本上无区块产生,查询最新区块的时候可能抛出该错误
-32012订阅不存在  (预留状态码)
-32013数据归档、快照相关错误
-32098请求未带cert或者错误cert导致认证失败
-32099请求tcert失败