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

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]
                        }
          }