操作指南
1. 合约调用方式
用户可以通过如下两种方式调用合约:
-
直接使用ctool invoke,通过合约地址的方式调用
ctool invoke --addr "$contractAddress" --func '$functionName' --param "$para" --abi $abiFilePath --config $configFilePath
-
部署的合约在合约管理服务(CNS)注册后,可以通过合约名的方式调用指定合约。
ctool cnsInvoke --cns "$contractName" --func '${functionName}(${param})' --abi $abiFilePath --config $configFilePath
2. 合约管理服务(CNS)
- 功能描述:
合约管理服务提供了对系统中合约的管理功能,包括合约的注册和注销,合约注册信息和地址的查询等功能。
-
操作:
-
注册合约[cnsRegister(contractName, version)]:
CNS合约的默认地址:0x0000000000000000000000000000000000000011
参数1:注册合约的名称,需要字母数字或者下划线打头,合约名的所有者为第一次注册合约的部署者
参数2:注册合约的版本,需满足[num].[num].[num].[num]的格式,如1.0.0.0
参数3:注册合约的地址,合约地址必须符合以太坊合约地址标准格式,"0x"前缀可写可不写
ctool invoke --addr "0x0000000000000000000000000000000000000011" --func 'cnsRegister' --param "test" --param "1.0.0.0" --param "0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f" --abi cnsManager/cnsManager.cpp.abi.json --config cnsManager/config.json
-
注销合约[cnsUnregister(contractName, version)]:
参数1:合约名称,同上需要字母数字或者下划线打头
参数2:合约版本,同上需满足[num].[num].[num].[num]的格式,如1.0.0.0
ctool invoke --addr "0x0000000000000000000000000000000000000011" --func 'cnsUnregister' --param "test" --param "1.0.0.0" --abi cnsManager/cnsManager.cpp.abi.json --config cnsManager/config.json
-
查询合约注册信息和地址:
1)查询系统中已注册的合约[getRegisteredContracts(pageNum, pageSize)]:
参数1:输出页码(从0开始)
参数2:展示条目
ctool invoke --addr "0x0000000000000000000000000000000000000011" --func 'getRegisteredContracts' --param 0 --param 10 --abi cnsManager/cnsManager.cpp.abi.json --config cnsManager/config.json
输出结果:
result: {"code":0,"msg":"ok","data":{"total":8,"contract":[{"name":"__sys_NodeManager","version":"1.0.0.0","address":"0xa94ad954e17606b8c254065c2317139f9cc593d0","origin":"0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5","create_time":1556176237528,"enabled":true},{"name":"__sys_NodeRegister","version":"1.0.0.0","address":"0x0331920e4c9aa382fa901e1c29f7199c54e351c7","origin":"0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5","create_time":1556176340642,"enabled":true},{"name":"__sys_ParamManager","version":"1.0.0.0","address":"0x46f59b9ee012455a8ee5623eb287c2221f1a15ee","origin":"0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5","create_time":1556176604980,"enabled":true},{"name":"__sys_RoleManager","version":"1.0.0.0","address":"0x1df9e46ccaf981f993fe26a6eb52a6c3fd7193df","origin":"0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5","create_time":1556176386721,"enabled":true},{"name":"__sys_RoleRegister","version":"1.0.0.0","address":"0xf8f1bec07e2556e6be2371f441f0a1ce9c8b737b","origin":"0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5","create_time":1556176464844,"enabled":true},{"name":"__sys_UserManager","version":"1.0.0.0","address":"0x6c990c0f1ae07222c7b7dcb2b68b936d0008ca57","origin":"0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5","create_time":1556176530910,"enabled":true},{"name":"__sys_UserRegister","version":"1.0.0.0","address":"0xf7e769f67be5bf06d5712c355e293ef0d4c685fc","origin":"0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5","create_time":1556176561942,"enabled":true},{"name":"test","version":"1.0.0.0","address":"0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f","origin":"0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5","create_time":1556258758307,"enabled":false}]}}
2)查询账户部署的所有合约[getRegisteredContractsByAddress(userAddress, pageNum, pageSize)]:
参数1:账户地址,必须符合以太坊账户标准格式
参数2:输出页码
参数3:展示条目
ctool invoke --addr "0x0000000000000000000000000000000000000011" --func 'getRegisteredContractsByAddress' --param "0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5" --param 0 --param 10 --abi cnsManager/cnsManager.cpp.abi.json --config cnsManager/config.json
3)查询合约的历史版本信息[getHistoryContractsByName(contractName)]:
参数:合约名称,同上需要字母数字或者下划线打头
ctool invoke --addr "0x0000000000000000000000000000000000000011" --func 'getHistoryContractsByName' --param "test" --abi cnsManager/cnsManager.cpp.abi.json --config cnsManager/config.json
输出结果:
result: {"code":0,"msg":"ok","data":{"total":1,"contract":[{"name":"test","version":"1.0.0.0","address":"0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f","origin":"0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5","create_time":1556258758307,"enabled":false}]}}
4)查询合约注册情况:
可以通过合约地址和合约名称两种查询条件查询合约注册情况。
[ifRegisteredByAddress(contractAddress)]:
参数:合约地址,同上必须符合以太坊合约地址标准格式,"0x"前缀可写可不写
ctool invoke --addr "0x0000000000000000000000000000000000000011" --func 'ifRegisteredByAddress' --param "0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f" --abi cnsManager/cnsManager.cpp.abi.json --config cnsManager/config.json
[ifRegisteredByName(contractName)]:
参数:合约名称,同上需要字母数字或者下划线打头
ctool invoke --addr "0x0000000000000000000000000000000000000011" --func 'ifRegisteredByName' --param "test" --abi cnsManager/cnsManager.cpp.abi.json --config cnsManager/config.json
输出:1表示已注册,0表示未注册。
5)查询合约地址[getContractAddress(contractName, version)]:
参数1:合约名称,同上需要字母数字或者下划线打头
参数2:合约版本,同上需满足[num].[num].[num].[num]的格式,如1.0.0.0
ctool invoke --addr "0x0000000000000000000000000000000000000011" --func 'getContractAddress' --param "test" --param "1.0.0.0" --abi cnsManager/cnsManager.cpp.abi.json --config cnsManager/config.json
输出:合约地址
3. 参数管理
-
功能描述: 参数管理合约提供了对链上系统参数的设置和查询功能,系统参数包括:每笔交易消耗的gas上限(TxGasLimit),区块中打包的所有交易消耗的gas上限(BLockGasLimit),共识过程中单个节点出块时长和区块间隔(Duration,BlockInterval)。
-
操作:
-
TxGasLimit查询和设置
ctool cnsInvoke --cns "__sys_ParamManager" --func 'getTxGasLimit()' --abi paramManager/paramManager.cpp.abi.json --config cnsManager/config.json
ctool cnsInvoke --cns "__sys_ParamManager" --func 'setTxGasLimit("5000000000000")' --abi paramManager/paramManager.cpp.abi.json --config cnsManager/config.json
-
BLockGasLimit查询和设置
ctool cnsInvoke --cns "__sys_ParamManager" --func 'getBlockGasLimit()' --abi paramManager/paramManager.cpp.abi.json --config cnsManager/config.json
ctool cnsInvoke --cns "__sys_ParamManager" --func 'setBlockGasLimit("10000000000000000")' --abi paramManager/paramManager.cpp.abi.json --config cnsManager/config.json
-
共识时间参数查询和设置
ctool cnsInvoke --cns "__sys_ParamManager" --func 'getCBFTTimeParam()' --abi paramManager/paramManager.cpp.abi.json --config cnsManager/config.json
ctool cnsInvoke --cns "__sys_ParamManager" --func 'setCBFTTimeParam("20","1")' --abi paramManager/paramManager.cpp.abi.json --config cnsManager/config.json
4. 平台用户管理
4.1. 用户申请
- 功能描述:
新用户通过提交注册信息,待链管理员审核通过后,成为平台用户。平台用户可以申请不同的角色,待链管理员审核通过后,被授予对应的角色,并拥有相应的权限。
系统中内置的角色有:
角色中文名 | 角色英文名 |
---|---|
链创建者(超管) | chainCreator |
链管理员(普管) | chainAdmin |
节点管理员 | nodeAdmin |
合约管理员 | contractAdmin |
合约部署者 | contractDeployer |
合约调用者 | contractCaller |
- 操作:
1)新用户申请[registerUser(RegisterInfo)]:
检查用户申请中各参数的合法性,并写入合约中。
参数说明:
- string address:用户地址
- string name:用户名, 不能重复
- string mobile: 手机号
- string email:用户邮箱
- string[] roles:角色
- string remark:备注
ctool invoke --addr "0xf7e769f67be5bf06d5712c355e293ef0d4c685fc" --func 'registerUser' --param '{"address":"0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe","name":"xiaoluo","mobile":"13111111111","email":"123@126.com","roles":["chainAdmin"],"remark":"平台用户申请"}' --abi userRegister/userRegister.cpp.abi.json --config cnsManager/user.json
2)管理员审核[approve(userAddress, status)]:
管理员验证用户合法性后,修改用户状态并保存到用户管理合约。
参数1:待审核用户的地址
参数2:审核状态,1:待审核,2:已批准,3:已拒绝
ctool invoke --addr "0xf7e769f67be5bf06d5712c355e293ef0d4c685fc" --func 'approve' --param '0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe' --param 2 --abi ./userRegister/userRegister.cpp.abi.json --config cnsManager/config.json
4.2. 用户管理
- 功能描述:
用户管理合约提供对平台用户信息的查询,删除和更新。
- 操作:
1)通过用户地址和用户名称两种查询条件查询用户信息
参数:用户地址
ctool invoke --addr "0x6c990c0f1ae07222c7b7dcb2b68b936d0008ca57" --func 'getAccountByAddress' --param "0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe" --abi userManager/userManager.cpp.abi.json --config cnsManager/config.json
参数:用户名称
ctool invoke --addr "0x6c990c0f1ae07222c7b7dcb2b68b936d0008ca57" --func 'getAccountByName' --param "xiaoluo" --abi userManager/userManager.cpp.abi.json --config cnsManager/config.json
输出:
result: {"code":0,"msg":"succeed","data":{"address":"0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe","name":"xiaoluo","mobile":"1312222","email":"123@qq.com","status":2}}
2)查询用户是否合法
参数:用户地址
ctool invoke --addr "0x6c990c0f1ae07222c7b7dcb2b68b936d0008ca57" --func 'isValidUser' --param "0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe" --abi userManager/userManager.cpp.abi.json --config cnsManager/config.json
输出:1表示合法,0表示非法。
3) 更新用户信息
参数1:用户地址
参数2:用户信息(与新增用户时类似)
ctool invoke --addr "0x6c990c0f1ae07222c7b7dcb2b68b936d0008ca57" --func 'update' --param "0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe" --param '{"address":"0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe","name":"xiaoluo","mobile":"1312222","email":"123@qq.com","status":0}' --abi userManager/userManager.cpp.abi.json --config cnsManager/config.json
4) 禁用和激活用户
参数:用户地址
ctool invoke --addr "0x6c990c0f1ae07222c7b7dcb2b68b936d0008ca57" --func 'disable' --param "0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe" --abi userManager/userManager.cpp.abi.json --config cnsManager/config.json
ctool invoke --addr "0x6c990c0f1ae07222c7b7dcb2b68b936d0008ca57" --func 'enable' --param "0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe" --abi userManager/userManager.cpp.abi.json --config cnsManager/config.json
5)删除用户
参数:用户地址
ctool invoke --addr "0x6c990c0f1ae07222c7b7dcb2b68b936d0008ca57" --func 'delUser' --param "0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe" --abi userManager/userManager.cpp.abi.json --config cnsManager/config.json
4.3. 角色申请
- 功能描述:
平台用户申请在系统中的角色,待链管理员审核通过后,被授予对应的角色,并拥有相应的权限。
- 操作:
1)用户申请角色
参数:申请的角色名
ctool invoke --addr "0xf8f1bec07e2556e6be2371f441f0a1ce9c8b737b" --func 'registerRole' --param '["nodeAdmin"]' --abi roleRegister/roleRegister.cpp.abi.json --config cnsManager/user.jso
2)管理员审核
ctool invoke --addr "0xf8f1bec07e2556e6be2371f441f0a1ce9c8b737b" --func 'approveRole' --param '0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe' --param 2 --abi roleRegister/roleRegister.cpp.abi.json --config cnsManager/config.json
参数1:待审核用户的地址
参数2:审核状态,1:待审核,2:已批准,3:已拒绝
4.4. 角色管理
- 功能描述:
角色管理合约提供对用户角色的查询和撤销。
- 操作:
1)通过用户地址和用户名称两种查询条件查询用户角色信息
参数:用户地址
ctool invoke --addr "0x1df9e46ccaf981f993fe26a6eb52a6c3fd7193df" --func 'getRolesByAddress' --param "0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe" --abi roleManager/roleManager.cpp.abi.json --config cnsManager/config.json
参数:用户名称
ctool invoke --addr "0x1df9e46ccaf981f993fe26a6eb52a6c3fd7193df" --func 'getRolesByName' --param "xiaowang" --abi roleManager/roleManager.cpp.abi.json --config cnsManager/config.json
输出:
result: {"code":0,"msg":"Success","data":["contractDeployer","contractAdmin"]}
2)查询用户是否有某个角色
参数1:用户地址
参数2:角色名
ctool invoke --addr "0x1df9e46ccaf981f993fe26a6eb52a6c3fd7193df" --func 'hasRole' --param "0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe" --param "chainAdmin" --abi roleManager/roleManager.cpp.abi.json --config cnsManager/config.json
输出:1表示拥有,0表示没有。
3) 查询系统中某个角色的地址
参数:角色名
ctool invoke --addr "0x1df9e46ccaf981f993fe26a6eb52a6c3fd7193df" --func 'getAccountsByRole' --param "chainAdmin" --abi roleManager/roleManager.cpp.abi.json --config cnsManager/config.json
输出:
result: {"code":0,"msg":"Success","data":[{"name":"xiaoluo","address":"0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe"}]}
4)撤销用户角色
参数1:用户地址
参数2:角色名
ctool invoke --addr "0x1df9e46ccaf981f993fe26a6eb52a6c3fd7193df" --func 'removeRole' --param "0x39f5ddcd8956e57b7fe6290e008f845f59dde8fe" --param '["nodeAdmin"]' --abi roleManager/roleManager.cpp.abi.json --config cnsManager/config.json
5. 节点管理
5.1. 节点申请
- 功能描述:
管理所有节点的申请信息以及审核信息,节点申请审核后,节点信息才会登记于节点管理合约。
-
操作:
-
注册节点信息[registerNode(RegisterInfo)]
参数说明: + name:节点名称 + owner :申请者的地址 + desc:节点描述 + type: + 1:共识节点 + 0:观察者节点 + publicKey :节点公钥 + externalIP :外网 IP + internalIP:内网 IP + rpcPort:rpc 端口 + p2pPort :p2p端口 + status : + 0:未审核 + 1:申请通过 + 2:拒绝申请 + approver:审核人的地址 + registerTime:申请时间 + root: + true:是根节点 + false:不是根节点
```
./bin/ctool invoke --addr "0x743bc6816b2fa897d60b657b7eee3aaf2e3ca253" --func 'registerNode' --param '{"name":"nodeB","desc":"i am nodeB","type":0,"publicKey":"7caae651e633769fa693f633e3a468775bf19699ccdc014eb9449c2eb0f82ebde4a7d28c9b846d2df02d1e7f7e1460fbb31eb83c6faf208dcbfd4f2944d31c61","externalIP":"127.0.0.1","internalIP":"127.0.0.1","rpcPort":6793,"p2pPort":16793,"root":false}' --abi ./conf/contracts/nodeRegister.cpp.abi.json --config ./user2.json
```
-
审核节点信息 [approve(publicKey,status)]
参数说明: + publicKey:待审核节点公钥 + status: + 1:通过
- 2:拒绝
./bin/ctool invoke --addr "0x743bc6816b2fa897d60b657b7eee3aaf2e3ca253" --func 'approve' --param "7caae651e633769fa693f633e3a468775bf19699ccdc014eb9449c2eb0f82ebde4a7d28c9b846d2df02d1e7f7e1460fbb31eb83c6faf208dcbfd4f2944d31c61" --param 1 --abi ./conf/contracts/nodeRegister.cpp.abi.json --config ./user2.json
-
根据公钥获取申请信息[getRegisterInfoByPublicKey(publicKey)]
参数说明:
- publicKey: 待查看节点公钥
./bin/ctool invoke --addr "0x743bc6816b2fa897d60b657b7eee3aaf2e3ca253" --func 'getRegisterInfoByPublicKey' --param "7caae651e633769fa693f633e3a468775bf19699ccdc014eb9449c2eb0f82ebde4a7d28c9b846d2df02d1e7f7e1460fbb31eb83c6faf208dcbfd4f2944d31c61" --abi ./conf/contracts/nodeRegister.cpp.abi.json --config ./user2.json
5.2. 节点管理
- 功能描述:
管理所有的节点信息,节点包括共识节点和非共识节点,节点信息包括公钥,证书,管理员,名称等
-
操作:
-
添加节点信息[add(nodeJsonStr)]
参数说明:
- nodeJsonStr:节点信息的JSON结构体字符串
首先需要添加主节点信息
./bin/ctool invoke --addr "0x7b821b3d871426eb79d6e7145126f7d0b5fb4356" --func 'add' --param '{"name":"root","owner":"0x96307a6168921cefd50d66e1921a029fe1982394","approver":"0x96307a6168921cefd50d66e1921a029fe1982394","desc":"root","publicKey":"feffe2938d427088f5fcce94a9245760b92c468d3ca25ab5ef2b1cdccf0ed911963b74ca2dffef20ef135966e34ebcc905d1f12c1df09f05974a617cf8afe8e8","root":true,"type":1,"externalIP":"127.0.0.1","internalIP":"127.0.0.1","rpcPort":6791,"p2pPort":16791,"status":1}' --abi ./conf/contracts/nodeManager.cpp.abi.json --config ./user2.json
-
返回所有节点信息[getAllNodes()]
./bin/ctool invoke --addr "0x7b821b3d871426eb79d6e7145126f7d0b5fb4356" --func 'getAllNodes' --abi ./conf/contracts/nodeManager.cpp.abi.json --config ./user2.json
-
根据特定条件返回符合条件的节点信息[getNodes(nodeJsonStr]
如下面的例子中,返回name为 "nodeC"的节点信息
./bin/ctool invoke --addr "0x7b821b3d871426eb79d6e7145126f7d0b5fb4356" --func 'getNodes' --param '{"name":"nodeC"}' --abi ./conf/contracts/nodeManager.cpp.abi.json --config ./user2.json
-
更新节点信息[update(name,nodeJsonStr)]
参数说明:
- name:节点名称
- nodeJsonStr:待更新字段
更新name为"nodeC"的节点为共识节点
./bin/ctool invoke --addr "0x7b821b3d871426eb79d6e7145126f7d0b5fb4356" --func update --param "nodeC" --param '{"type":1}' --abi ./conf/contracts/nodeManager.cpp.abi.json --config ./user2.json
5.3. 共识&观察者节点
-
case1:nodeA 未申请成为观察者节点 or 共识节点,所以不能同步链上信息,不断发生roundchange,且区块高度始终为1
....... DEBUG[04-26|16:24:37.221] updateRoundState roundChange current="&{round:0xc01d0e4a60 sequence:0xc01d0e4a80 Preprepare:<nil> Prepares:[] Commits:[] lockedHash:[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 0] pendingRequest:0xc01d474150 lockedRound:0xc01d0e4b00 lockedPrepares:<nil> mu:0xc002c55280 hasBadProposal:0xb8ed70}" INFO [04-26|16:24:37.221] ====== roundChange round: 10, height:1 ====== ......
-
case2:nodeB申请成为观察者节点
-
首先申请成为观察者节点
./bin/ctool invoke --addr "0x743bc6816b2fa897d60b657b7eee3aaf2e3ca253" --func 'registerNode' --param '{"name":"nodeB","desc":"i am nodeB","type":0,"publicKey":"7caae651e633769fa693f633e3a468775bf19699ccdc014eb9449c2eb0f82ebde4a7d28c9b846d2df02d1e7f7e1460fbb31eb83c6faf208dcbfd4f2944d31c61","externalIP":"127.0.0.1","internalIP":"127.0.0.1","rpcPort":6793,"p2pPort":16793,"root":false}' --abi ./conf/contracts/nodeRegister.cpp.abi.json --config ./user2.json
-
由管理员进行审核
./bin/ctool invoke --addr "0x743bc6816b2fa897d60b657b7eee3aaf2e3ca253" --func 'approve' --param "7caae651e633769fa693f633e3a468775bf19699ccdc014eb9449c2eb0f82ebde4a7d28c9b846d2df02d1e7f7e1460fbb31eb83c6faf208dcbfd4f2944d31c61" --param 1 --abi ./conf/contracts/nodeRegister.cpp.abi.json --config ./user2.json
-
审核通过后, 此时nodeB可以同步链上的区块信息,但是并不能出块,具体的log信息为:
... DEBUG[04-26|19:13:02.088] startNewRound address=0x3225DF011bfAAB4C87D7ab4dDd94Daf830B8D809 old_round=0 old_seq=11144 old_proposer=0x96307A6168921cefd50D66E1921a029fE1982394 roundChange=false DEBUG[04-26|19:13:02.088] updateRoundState roundChange current="&{round:0xc034e7f760 sequence:0xc034e7f720 Preprepare:<nil> Prepares:[] Commits:[] lockedHash:[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 0] pendingRequest:<nil> lockedRound:0xc034e7fd00 lockedPrepares:<nil> mu:0xc04ab4fba0 hasBadProposal:0xb8ed70}" INFO [04-26|19:13:02.089] ====== roundChange round: 0, height:11145 ====== DEBUG[04-26|19:13:02.089] newRoundChangeTimer round=0 timeout=2s INFO [04-26|19:13:02.089] New round address=0x3225DF011bfAAB4C87D7ab4dDd94Daf830B8D809 old_round=0 old_seq=11144 old_proposer=0x96307A6168921cefd50D66E1921a029fE1982394 new_round=0 new_seq=11145 new_proposer=0x96307A6168921cefd50D66E1921a029fE1982394 valSet=[0x96307A6168921cefd50D66E1921a029fE1982394] size=1 IsProposer=false DEBUG[04-26|19:13:02.088] reset txpool RoutineID=39 oldHash=4b29f8…6ae5d3 oldNumber=11143 newHash=2a5fb0…d575d7 newNumber=11144 DEBUG[04-26|19:13:02.089] Reinjecting stale transactions count=0 DEBUG[04-26|19:13:03.006] Received a message[NewBlockMsg]------------ GoRoutineID=3082 ...
-
case3:nodeC申请成为共识节点
-
首先申请成为观察者节点
./bin/ctool invoke --addr "0x743bc6816b2fa897d60b657b7eee3aaf2e3ca253" --func 'registerNode' --param '{"name":"nodeC","desc":"i am nodeC","type":0,"publicKey":"2e11b2ad3aa6ba38b0979d023d148d16d4bb8afee22432259bfba8c6c5f7d43bd42859158575477e0037743f288d63aef94cbb25d3646a25ddcefa1c4e400f89","externalIP":"127.0.0.1","internalIP":"127.0.0.1","rpcPort":6794,"p2pPort":16794,"root":false}' --abi ./conf/contracts/nodeRegister.cpp.abi.json --config ./user2.json
-
管理员审核
./bin/ctool invoke --addr "0x743bc6816b2fa897d60b657b7eee3aaf2e3ca253" --func 'approve' --param "2e11b2ad3aa6ba38b0979d023d148d16d4bb8afee22432259bfba8c6c5f7d43bd42859158575477e0037743f288d63aef94cbb25d3646a25ddcefa1c4e400f89" --param 1 --abi ./conf/contracts/nodeRegister.cpp.abi.json --config ./user2.json
-
更新为共识节点
./bin/ctool invoke --addr "0x7b821b3d871426eb79d6e7145126f7d0b5fb4356" --func update --param "nodeC" --param '{"type":1}' --abi ./conf/contracts/nodeManager.cpp.abi.json --config ./user2.json
-
此时nodeC成为共识节点,且参与出块,具体的log信息为:
... INFO [04-28|08:27:19.596] New round address=0x96307A6168921cefd50D66E1921a029fE1982394 old_round=0 old_seq=145147 old_proposer=0x96307A6168921cefd50D66E1921a029fE1982394 new_round=0 new_seq=145148 new_proposer=0x96307A6168921cefd50D66E1921a029fE1982394 valSet=[0x96307A6168921cefd50D66E1921a029fE1982394] size=1 IsProposer=true DEBUG[04-28|08:27:20.522] +++++++++++++++++++++++++++++++++++ShouldSeal() -> true INFO [04-28|08:27:20.522] parentBlock Number: 145147 DEBUG[04-28|08:27:20.522] Begin consensus for new block number=145148 gasLimit=10240000000000000 parentHash=122645…89e935 parentNumber=145147 parentStateRoot=fe6dce…24e38c timestamp=1556411240522 INFO [04-28|08:27:20.522] Fetch pending transactions success pendingLength=0 time=5.058µs INFO [04-28|08:27:20.522] Commit new mining work number=145148 sealhash=ba6e11…292c9c receiptHash=56e81f…63b421 txs=0 gas=0 fees=0 elapsed=145.102µs
6. 合约防火墙
- 功能描述:
合约防火墙主要实现了对防火墙白名单和黑名单的管理功能,使得合约的部署者可以设置合约的防火墙规则,使特定的用户获得调用合约指定函数的权限或者禁止特定用户调用合约指定函数。
- 操作:
1)合约防火墙激活
参数addr:合约地址
ctool fwInvoke --addr "0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f" --func '__sys_FwOpen()' --config cnsManager/config.json
2)合约白名单和黑名单的管理
创建白名单和黑名单:
参数说明:
- Accept:设置白名单;Reject:设置黑名单
- 过滤规则:”{地址}:{函数名}“
ctool fwInvoke --addr "0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f" --func '__sys_FwAdd("Accept","*:getName")' --config cnsManager/config.json
ctool fwInvoke --addr "0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f" --func '__sys_FwAdd("Reject","0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5:invokeNotify")' --config cnsManager/config.json
清空白名单和黑名单:
ctool fwInvoke --addr "0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f" --func '__sys_FwClear("Accept")' --config cnsManager/config.json
ctool fwInvoke --addr "0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f" --func '__sys_FwClear("Reject")' --config cnsManager/config.json
重置名单:
ctool fwInvoke --addr "0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f" --func '__sys_FwSet("Reject","*:invokeNotify")' --config cnsManager/config.json
删除指定合约的白/黑名单里的指定地址:
ctool fwInvoke --addr "0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f" --func '__sys_FwDel("Reject","0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5:invokeNotify")' --config cnsManager/config.json
3)合约防火墙状态查询
ctool fwInvoke --addr "0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f" --func '__sys_FwStatus()' --config cnsManager/config.json
输出:
result: {"ContractAddress":"0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f","FwActive":true,"AcceptedList":[{"Addr":"0xffffffffffffffffffffffffffffffffffffffff","FuncName":"getName"}],"DeniedList":[{"Addr":"0x01a369998e4a141c5e2b40dbcbaf4a601d57cfa5","FuncName":"invokeNotify"}]}
4)合约防火墙关闭
ctool fwInvoke --addr "0x08644ba5e0dd71d3d7cbb58913a099c2f3ca403f" --func '__sys_FwClose()' --config cnsManager/config.json