$ pip install -r requirements.txt
可通过运行如下命令查看:
./admintool.sh --help
结果如下:
usage: ./admintool.sh -a admin_id -l ip_list -n consensus_name -m crypto_method -d block_duration -t -b block_tx_limit -f tx_filter_size
option:
-a admin_id admin identifier
default value is 'admin'
-l ip_list list all the node's IP and port
default value is '127.0.0.1:4000,127.0.0.1:4001,127.0.0.1:4002,127.0.0.1:4003'
-n consensus_name name of consensus algorithm
default value is 'tendermint', other is 'raft' and 'poa'
-m crypto_method name of crypto algorithm
default value is 'SECP'
-d block_duration block generating duration(millisecond)
default value is '3000'
-t consensus test flag, only valid for tendermint
-b block_tx_limit the limit of tx count in one block
default value is '300'
-f tx_filter_size the range of hisory tx to check duplication
default value is '100000'
-c tx_pool_size flow control for tx pool
default value is '0'
-h enable jsonrpc http
default enable 'true'
-w enable jsonrpc websocket
default enable 'false'
-P define jsonrpc HTTP port or websocket port
default port is '1337' or '4337'
当前默认初始配置为四个节点,如果需要在admintool.sh脚本里初始配置N个节点,可通过如下命令,比如配置五个节点:
./admintool.sh -l "127.0.0.1:4000,127.0.0.1:4001,127.0.0.1:4002,127.0.0.1:4003,127.0.0.1:4004"
$ ./admintool.sh
运行之后会生成release
文件夹,里面包含节点文件以及相关的配置文件,具体如下:
- 生成私钥和地址,私钥存放在
admintool/release/nodeID/privkey
,其中nodeID为节点号;而所有节点地址都存放在admintool/release/authorities
; - 生成网络配置文件,存放在
admintool/release/nodeID/network.toml
,文件内容主要为总节点数、本地节点端口以及其它节点的ip和端口号; - 生成genesis块文件,存放
在admintool/release/nodeID/genesis.json
, 其中timestamp为时间戳,秒为单位;prevhash指前一个块哈希,这里是默认值;而alloc指部署到创世块的合约内容; - 生成节点配置文件,存放在
admintool/release/nodeID/consensus.json
,主要包含共识算法的相关参数; - 生成jsonrpc配置文件,存放在
admintool/release/nodeID/jsonrpc.json
,主要包含jsonrpc模块的相关参数。
系统合约是从genesis块开始就部署到链上的用来实现特定功能的合约,它的合约地址写在genesis块里,是固定的地址。CITA里主要的系统合约有节点管理合约、配额管理合约和权限管理合约等。
用户可选择自定义初始化系统合约数据及使用系统默认数据,其中release文件下的init_data.json
为初始化系统合约数据文件。
用户可在本目录下创建init_data.json
文件来自定义系统合约的初始化数据。格式参考init_data_example.json
文件,如下:
{
"0x00000000000000000000000000000000013241a2": [[], ["0x4b5ae4567ad5d9fb92bc9afd6a657e6fa13a2523"]],
"0x00000000000000000000000000000000013241a3": "0xd3f1a71d1d8f073f4e725f57bbe14d67da22f888",
"0x00000000000000000000000000000000013241a4": [["0x1a702a25c6bca72b67987968f0bfb3a3213c5688"], ["0x0dbd369a741319fa5107733e2c9db9929093e3c7"]]
}
其中:
-
0x00000000000000000000000000000000013241a2
: 代表共识节点管理系统合约地址,二维数组内[]
内为节点地址列表,由系统生成,忽略此选项,用户可修改["0x4b5ae4567ad5d9fb92bc9afd6a657e6fa13a2523"]
值为自己生成的地址, 其为管理员地址,由此地址进行共识节点的增删。 须保存好对应的私钥 -
0x00000000000000000000000000000000013241a3
: 代表配额管理系统合约地址,用户可修改0xd3f1a71d1d8f073f4e725f57bbe14d67da22f888
值为自己生成的地址,其为配额管理的管理员地址, 可由此地址进行配额的管理。 须保存好对应的私钥 -
0x00000000000000000000000000000000013241a4
: 代表权限管理系统合约地址,第一个数组为拥有发送交易权限的地址列表,第二个数组为拥有创建合约权限的地址列表。 用户可分别填入多个地址。 须保存好对应的私钥
用户可使用系统默认的初始化数据,即init_data_example.json
文件,地址及其对应的私钥如下表所示:
privkey | address |
---|---|
5f0258a4778057a8a7d97809bd209055b2fbafa654ce7d31ec7191066b9225e6 | 0x4b5ae4567ad5d9fb92bc9afd6a657e6fa13a2523 |
61b760173f6d6b87726a28b93d7fcb4b4f842224921de8fa8e49b983a3388c03 | 0xd3f1a71d1d8f073f4e725f57bbe14d67da22f888 |
866c936ff332228948bdefc15b1877c88e0effce703ee6de898cffcafe9bbe25 | 0x1a702a25c6bca72b67987968f0bfb3a3213c5688 |
352416e1c910e413768c51390dfd791b414212b7b4fe6b1a18f58007fa894214 | 0x0dbd369a741319fa5107733e2c9db9929093e3c7 |
用户可在本目录下创建chain.json
文件来自定义发送交易时是否检查账户的nonce、permission等,默认两者都需要检查的。格式参考chain_check_example.json
文件,如下:
{
"nonce": true,
"permission": true
}
其中:
nonce
: 表示发送交易时,是否检查账户的nonce值符合要求,其中true表示打开检查,false表示关闭检查,默认为true。permission
: 表示发送交易时,是否检查账户拥有相应的权限,其中true表示打开检查,false表示关闭检查,默认为true。
节点管理合约存放在cita/contracts/node_manager.sol
,函数签名可通过solc node_manager.sol --hashes
编译得到,也可以在remix上查看.
node_manager.sol合约详情如下所示:
contract address: 0x00000000000000000000000000000000013241a2
Function signatures:
dd4c97a0: approveNode(address)
2d4ede93: deleteNode(address)
30ccebb5: getStatus(address)
609df32f: listNode()
ddad2ffe: newNode(address)
645b8b1b: status(address)
节点管理合约的目的是为了能够动态增删节点,即在已经运行的一些节点中增加或删除节点,这可以通过调用合约中的方法实现。 合约中节点有三种状态:Close,Ready,Start,初始默认为Close,可以通过调用合约里的函数来改变节点状态。 比如,增加节点,申请者首先调用newNode()方法,审批者(共识节点)调用approveNode来同意该节点成为共识节点。下面介绍下合约中主要的几种方法:
-
newNode(address)
,该方法功能是申请成为共识节点,其中参数address表示申请节点的地址,申请者通过cita_sendTransaction调用合约上的该方法,此时节点状态变更为Ready; -
approveNode(address)
,该方法功能是同意其成为共识节点,其中参数address表示状态为Ready的节点地址,审批者(共识节点)通过cita_sendTransaction 调用该方法来同意节点状态为Ready的节点加入共识,此时节点状态变更为Start; -
deleteNode(address)
, 该方法功能是删除共识节点,其中参数address表示状态Start的节点地址,状态为Start的节点可通过cita_sendTransaction调用合约上的该方法来退出共识, 此时节点状态变更为Close。
配额管理合约存放在cita/contracts/quota.sol
,合约详情如下所示:
contract address: 0x00000000000000000000000000000000013241a3
70480275: addAdmin(address)
dae99b3a: getAccountGasLimit()
776dd3b6: getAccountQuota(address)
54f6127f: getData(bytes32)
6cf72948: getSpecialUsers()
7a490f7e: getUsersQuota()
3a5b5cf3: getblockGasLimit()
24d7806c: isAdmin(address)
dfa87425: setAccountGasLimit(address,uint256)
a69257f3: setBlockGasLimit(uint256)
eb93eddf: setGlobal(bytes32,bytes32)
c9bcec77: setGlobalAccountGasLimit(uint256)
748ba8dd: setIsGlobal(bytes32,bool)
50f2ee97: setSpecial(address,bytes32,bytes32)
配额管理合约为每个block和account设置gasLimit,其中block中的gasLimit有效地控制该区块中的交易数量,account中的gasLimit有效地控制该用户在当前区块中发送的交易数量, 显然,account中的gasLimit是小于等于block中的gasLimit。用户分为specialUser和globalUser,其中specialUser的gasLimit默认值等于block的gasLimit,即只要不达到区块的gasLimit, 可以任意发送交易。而globalUser的gasLimit默认值要远小于block的gasLimit。另外,还有一类管理员账户,可设置block和account的gasLimit。 合约的主要方法如下:
-
addAdmin(address)
,该方法为添加管理账户,只有发送交易的用户为管理员才能成功添加其他用户为管理员,通过cita_sendTransaction调用。 -
setAccountGasLimit(address,uint256)
,该方法为设置其他用户的gasLimit,只有身份为管理员的地址才可以通过cita_sendTransaction成功调用。 -
setBlockGasLimit(uint256)
,该方法为设置区块的gasLimit,只有身份为管理员的地址才可以通过cita_sendTransaction成功调用。 -
getData(bytes32)
,该方法为查询用户或区块的gasLimit,所有地址都可以通过eth_call成功调用此方法。 -
getSpecialUsers()
,该方法为查询所有specical用户,所有地址都可以通过eth_call成功调用此方法。 -
getUsersQuota()
,该方法为查询special用户对应的gasLimit,即配额,所有地址都可以通过eth_call成功调用此方法。 -
getAccountQuota(address)
,该方法为查询指定用户对应的gasLimit,即配额,所有地址都可以通过eth_call成功调用此方法。 -
getAccountGasLimit()
,该方法为查询AccountGasLimit,即配额,所有地址都可以通过eth_call成功调用此方法。 -
getblockGasLimit()
,该方法为查询blockGasLimit,即配额,所有地址都可以通过eth_call成功调用此方法。
权限管理合约存放在cita/contracts/permission_manager.sol
,该合约将权限管理引进系统,有效控制用户交易的权限,合约详情如下所示:
contract address: 0x00000000000000000000000000000000013241a4
Function signatures:
301da870: grantPermission(address,uint8)
54ad6352: queryPermission(address)
6f4eaf7a: queryUsersOfPermission(uint8)
dd8a8a05: revokePermission(address,uint8)
目前该合约的权限管理功能比较简单,权限共有两种:发送交易和创建合约(Send, Create)。每个地址默认没有这两种权限,可通过有权限的地址授权获得其中一种或两种权限。 比如,授予Create权限,已经拥有Create权限的地址可调用合约中的grantPermission()方法,来给其他地址授予Create权限。 合约中的方法介绍如下:
-
grantPermission(address,uint8)
,该方法是授予某种权限,其中参数中的address表示授予权限的地址,uint8表示权限名称,拥有该权限的地址可 通过cita_sendTransaction调用该方法来授予其他地址该权限。 -
revokePermission(address,uint8)
,该方法是取消某种权限,其中参数address表示取消权限的地址,uint8表示权限名称,拥有该权限的地址可 通过cita_sendTransaction调用该方法来取消其他地址该权限。 -
queryPermission(address)
,该方法是查询指定地址的权限,可通过eth_call调用该方法来查询。 -
queryUsersOfPermission(uint8)
, 该方法是查询拥有指定权限的所有用户,可通过eth_call调用该方法来查询。