子链的监听及子链接口调用

SCS Monitor

Monitor是一种特殊的子链SCS节点,其主要可以用于监控子链的状态和数据。

Monitor不参与子链的交易共识,只是同步区块数据,提供数据查询

子链启动的方式与scs区别在于参数不同,主要定义了rpc接口的访问控制

scsserver-windows-4.0-amd64 --password "123456" --rpcdebug --rpcaddr 0.0.0.0 --rpcport 2345 --rpccorsdomain "*"

子链运行后,Monitor可以调用子链控制合约subchainbase中的registerAsMonitor方法进行注册

调用registerAsMonitor参数说明:

根据ABI chain3.sha3("registerAsMonitor(address)") = 0x4e592e2f6fc52405522577d357d824c923989a62e4916d9b689311d8b2a6192c
        取前4个字节 0x4e592e2f
参数address传scs keystore文件中的地址 (前面补24个0, 凑足32个字节)
data = '0x4e592e2f000000000000000000000000d135afa5c8d96ba11c40cf0b52952d54bce57363'

注意registerAsMonitor不同版本参数
> data = contractInstance.registerAsMonitor.getData('0xd135afa5c8d96ba11c40cf0b52952d54bce57363','127.0.0.1')

调用示例:

> amount = chain3.toSha(1,'mc')
> subchainaddr = '0x1195cd9769692a69220312e95192e0dcb6a4ec09';
> data = '0x4e592e2f000000000000000000000000d135afa5c8d96ba11c40cf0b52952d54bce57363';
> chain3.mc.sendTransaction({ from: chain3.mc.accounts[0], value:amount, to: subchainaddr, gas: "5000000", gasPrice: chain3.mc.gasPrice, data: data });

验证: 观察SCS monitor concole界面开始同步子链区块,或者调用子链合约的getMonitorInfo方法

> contractInstance = SubChainBaseContract.at('0xb877bf4e4cc94fd9168313e00047b77217760930')

> contractInstance.getMonitorInfo.call()

子链RPC接口

根据子链启动的参数,用户可以访问对应端口,调用接口获取子链相关数据

以调用接口GetScsId为列,获得当前的scs编号,即scs keystore文件中的地址。

关于rpc http的接口访问,可以用类似postman之类的工具进行快捷测试

header设置:
        Content-Type = application/json
        Accept = application/json

Body设置:
        {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetScsId","params":{}}

post返回结果:
        {
                "jsonrpc": "2.0",
                "id": 0,
                "result": "0xd135afa5c8d96ba11c40cf0b52952d54bce57363"
        }

同时也可以通过nodejs的方式调用

> request = require('request');
> url  = "http://127.0.0.1:2345/rpc";
> data = {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetScsId","params":{}};
> request({ url: url, method: "POST", json: true, body: data, headers: {"Content-Type": 'application/json', "Accept": 'application/json'}}, function(error, response, result) {if (!error && response.statusCode == 200) {console.log(result)}});

以下是几个常用的RPC接口及调用body示例

GetNonce:获得子链的nonce,这是调用子链DAPP合约的必要参数之一,每当子链交易发送后会自动加1

SubChainAddr: 子链合约地址
Sender:查询账号, 每个账号在子链有不同的nonce
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetNonce",
                        "params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
                                "Sender":"0x87e369172af1e817ebd8d63bcd9f685a513a6736"
                         }
          }

GetBlockNumber:获得当前子链的区块高度

SubChainAddr: 子链合约地址
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetBlockNumber",
                "params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09"}
          }

GetBlock: 获得当前子链的指定的区块信息

SubChainAddr: 子链合约地址
Sender:查询账号
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetBlock",
                "params":{"number":1000,"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09"}
          }

GetSubChainInfo:获得当前子链的信息

SubChainAddr: 子链合约地址
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetSubChainInfo",
                "params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09"}
          }

GetBalance:获得对应账号在子链中的余额

SubChainAddr: 子链合约地址
Sender:查询账号
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetBalance",
                "params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
                        "Sender":"0x87e369172af1e817ebd8d63bcd9f685a513a6736"
                        }
          }

GetDappState:获得子链DAPP合约的状态

SubChainAddr: 子链合约地址
Sender:子链合约地址创建者地址
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetDappState",
                "params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
                        "Sender":"0x87e369172af1e817ebd8d63bcd9f685a513a6736"
                 }
          }

getContractInfo:获得子链DAPP智能合约全局变量

SubChainAddr: 子链合约地址
Reqtype:  查询类型 0: 查看合约全部变量 , 1: 查看合约某一个数组变量 , 2: 查看合约某一个mapping变量 , 3: 查看合约某一个结构体变量, 4: 查看合约某一简单类型变量(单倍长度存储的变量), 5: 查看合约某一变长变量(如string、bytes)
Storagekey: 十六进制字符串,查询的变量在合约里面的index ,查询全部变量时可以不填
Position: 十六进制字符串,当Reqtype==1时,Position为数组维度(从0开始);当Reqtype==2时,Position为mapping下标
Structformat:针对结构体变量,1:single(简单类型变量单倍长度存储的变量), 2:list(简单类型数组变量)3:string变长变量(如string、bytes),若结构变量为ContractInfoReq,Structformat = []byte{‘1’,’3’,’3’,’3’}

获取合约 index 1 的 address 对应 Body:
{"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetContractInfo",
"params":{"subChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
        "Request":[{"Reqtype":4,
                  "Storagekey":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
                  "Position":[],
                  "Structformat":[]}
                  ]
        }
}