子链的监听及子链接口调用¶
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参数说明:
> data = subchainbase.registerAsMonitor.getData('0xd135afa5c8d96ba11c40cf0b52952d54bce57363','127.0.0.1:2345')
调用示例:
> subchainbase = SubChainBaseContract.at('0xb877bf4e4cc94fd9168313e00047b77217760930')
> amount = chain3.toSha(1,'mc')
> subchainaddr = '0x1195cd9769692a69220312e95192e0dcb6a4ec09';
> data = subchainbase.registerAsMonitor.getData('0xd135afa5c8d96ba11c40cf0b52952d54bce57363','127.0.0.1:2345')
> chain3.mc.sendTransaction({ from: chain3.mc.accounts[0], value:amount, to: subchainaddr, gas: "5000000", gasPrice: chain3.mc.gasPrice, data: data });
验证: 观察SCS monitor concole界面开始同步子链区块,或者调用子链合约的getMonitorInfo方法
> subchainbase = SubChainBaseContract.at('0xb877bf4e4cc94fd9168313e00047b77217760930')
> subchainbase.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示例(v1.0.9)
*通用类*
此部分接口和子链区块本身相关,业务逻辑无关。
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"}
}
GetBlocks: 获取某一区间内的区块信息
SubChainAddr: 子链合约地址
Start: 开始block
End: 结束block
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetBlocks",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09"
"Start":10, "End":20}
}
GetSubChainInfo:获得当前子链的信息
SubChainAddr: 子链合约地址
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetSubChainInfo",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09"}
}
GetTxpool:获得子链交易池信息
SubChainAddr: 子链合约地址
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetTxpool",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09"
}
}
GetTxpoolCount:获得子链交易池中不同类型交易的数量
SubChainAddr: 子链合约地址
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetTxpoolCount",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09"
}
}
GetBalance:获得对应账号在子链中的余额
SubChainAddr: 子链合约地址
Sender:查询账号
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetBalance",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
"Sender":"0x87e369172af1e817ebd8d63bcd9f685a513a6736"
}
}
GetDappState:获得子链基础合约合约的状态
SubChainAddr: 子链合约地址
Sender:子链合约地址创建者地址
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetDappState",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
"Sender":"0x87e369172af1e817ebd8d63bcd9f685a513a6736"
}
}
GetDappAddrList:通过subchainaddr获取子链内所有多合约的地址列表,需要子链业务逻辑合约调用基础合约registerDapp方法后才能生效,具体请参见“母子链货币交互简介”中的示例
SubChainAddr: 子链合约地址
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetDappAddrList",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09"
}
}
返回result中,第零位是dappbase的地址,从第一位开始时业务逻辑合约地址
*充提类*
GetExchangeInfo:获得子链指定数量正在充提的信息
SubChainAddr: 子链合约地址
EnteringRecordIndex: 正在充值记录的起始位置(0)
EnteringRecordSize: 正在充值记录的长度
RedeemingRecordIndex: 正在提币记录的起始位置(0)
RedeemingRecordSize: 正在提币记录的长度
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetExchangeInfo",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
"EnteringRecordIndex":0, "EnteringRecordSize": 10,
"RedeemingRecordIndex":0, "RedeemingRecordSize", 10
}
}
返回中,XXXRecordCount是指总数量
GetExchangeByAddress:获得子链指定账号指定数量的充提信息
SubChainAddr: 子链合约地址
Sender:需要查询的账号地址
EnterRecordIndex: 已经充值记录的起始位置(0)
EnterRecordSize: 已经充值记录的长度
RedeemRecordIndex: 已经提币记录的起始位置(0)
RedeemRecordSize: 已经提币记录的长度
EnteringRecordIndex: 正在充值记录的起始位置(0)
EnteringRecordSize: 正在充值记录的长度
RedeemingRecordIndex: 正在提币记录的起始位置(0)
RedeemingRecordSize: 正在提币记录的长度
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetExchangeByAddress",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
"EnterRecordIndex":0, "EnterRecordSize": 10,
"RedeemRecordIndex":0, "RedeemRecordSize", 10
"EnteringRecordIndex":0, "EnteringRecordSize": 10,
"RedeemingRecordIndex":0, "RedeemingRecordSize", 10
}
}
返回中,XXXRecordCount是指总数量
*交易类*
此部分接口和交易相关,当有子链交易发生(sf>0),即可以在这里查看交易和交易结果
GetTransactionByNonce: 通过账号和Nonce获取子链的tx信息
SubChainAddr: 子链合约地址
Sender:查询账号
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetTransactionByNonce",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
"Sender":"0x87e369172af1e817ebd8d63bcd9f685a513a6736", "Nonce":9,
}
}
GetTransactionByHash: 通过交易hash获取子链的tx信息
SubChainAddr: 子链合约地址
Hash: 交易hash
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetTransactionByHash",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
"Hash":"0x87e369172af1e817ebd8d63bcd9f685a513a6736fsne3lkgkvu65kkwlcd"
}
}
GetReceiptByNonce: 通过账号和Nonce获取子链的tx执行结果
SubChainAddr: 子链合约地址
Sender:查询账号
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetReceiptByNonce",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
"Sender":"0x87e369172af1e817ebd8d63bcd9f685a513a6736", "Nonce":9
}
}
注意:如果这是个合约部署的交易,则在contractAddress将会显示合约地址;如果是一个有返回值的方法调用,则在result中显示调用结果
GetReceiptByHash: 通过交易hash获取子链的tx执行结果
SubChainAddr: 子链合约地址
Sender:查询账号
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.GetReceiptByHash",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
"Hash":"0x87e369172af1e817ebd8d63bcd9f685a513a6736fsne3lkgkvu65kkwlcd"
}
}
注意:如果这是个合约部署的交易,则在contractAddress将会显示合约地址;如果是一个有返回值的方法调用,则在result中显示调用结果
*业务类*
此部分合约需要指明是哪个业务逻辑合约
AnyCall: 获取dapp合约函数的返回值,调用此接口前必须将dapp注册入dappbase
Params: 第一个参数是调用的方法,之后是方法传入参数
SubChainAddr: 子链合约地址
Sender:查询账号
DappAddr:子链业务逻辑地址
Body: {"jsonrpc":"2.0","id":0,"method":"ScsRPCMethod.AnyCall",
"params":{"SubChainAddr":"0x1195cd9769692a69220312e95192e0dcb6a4ec09",
"DappAddr":"0xcc0D18E77748AeBe3cC6462be0EF724e391a4aD9",
"Sender":"0x87e369172af1e817ebd8d63bcd9f685a513a6736", "Params" :["funcA", "param1", param2]
}
}