子链的监听及子链接口调用¶
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":[]}
]
}
}