Deploy DPOS consensus sub-chain network
1. Genesis block
{
"config": {
"chainId": 10388,
"dpos": {
"period": 3,
"epoch": 300,
"maxSignersCount": 21,
"minVoterBalance": 100000000000000000000,
"genesisTimestamp": 1554004800,
"signers": [
"3d50e12fa9c76e4e517cd4ace1b36c453e6a9bcd",
"f97df7fe5e064a9fe4b996141c2d9fb8a3e2b53e",
"ef90068860527015097cd031bd2425cb90985a40"
],
"pbft": false,
"voterReward": true
}
},
"nonce": "0x0",
"timestamp": "0x5ca03b40",
"extraData": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x1",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"3d50e12fa9c76e4e517cd4ace1b36c453e6a9bcd": {
"balance": "0x21e19e0c9bab2400000"
},
"ef90068860527015097cd031bd2425cb90985a40": {
"balance": "0x21e19e0c9bab2400000"
},
"f97df7fe5e064a9fe4b996141c2d9fb8a3e2b53e": {
"balance": "0x21e19e0c9bab2400000"
}
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
perioddpos block-out interval, in secondsepochHow many blocks are there in the dpos interval to regularly clear the votes (after clearing, the voters need to re-initiate the voting transaction)maxSignersCountMaximum number of producers allowed for dposminVoterBalanceThe minimum amount of votes allowed by dpos. Unit: WeivoterRewardWhether dpos voters can get rewards (if enabled, voters can also get dividends when producers issue blocks)genesisTimestampdpos allows the initial block output time, and calculates the subsequent block output time and the producer based on this time.signersdpos initial producer listpbftWhether dpos uses pbft to confirm each block after each round of block outputallocdpos initial producer mortgage vote amount
2. Sub-chain initialization process
Method 1. Use sipe to initialize
1.Create or import a producer account
```shell script sipe --datadir=dposdata account new
2.Write the created or imported producer address into genesis.json, and write the initial voting amount at the same time (refer to 1. genesis block)
3.Initialize sub-chain nodes
```shell script
sipe --datadir=dposdata --role=subchain init genesis.json
Method 2. Use the consensus tool to initialize the cluster with one click
in cmd/consensus run under directoryinit_dpos.sh
```shell script cd cmd/consensus ./init_dpos.sh --numNodes 3
+ `numNodes` Number of cluster nodes generated
After initialization is completed `cmd/consensus/dposdata` create corresponding node files under the Directory
### 3. Sub-chain startup process
1. Startup node
```bash
sipe --datadir=dposdata --mine --etherbase=<生产者地址> --unlock=<生产者地址> --password=<密码文件> --port=30303 --role=subchain --v5disc
- Connect to other nodes
sipe --datadir=dposdata --mine --etherbase=<生产者地址> --unlock=<生产者地址> --password=<密码文件> --port=30304 --role=subchain --v5disc --bootnodesv5={enode1} --bootnodesv4={enode1}
4. Votes and proposals
4.1 initiate voting transaction
> eth.sendTransaction({from:"<投票地址>",to:"<被投票地址>",value:0,data:web3.toHex("dpos:1:event:vote")})
4.2 initiate the cancellation of voting transaction
> eth.sendTransaction({from:"<投票地址>",to:"<投票地址>",value:0,data:web3.toHex("dpos:1:event:devote")})
4.3 initiate a proposal to change miner rewards
Change the miner block reward ratio666‰
> eth.sendTransaction({from:"<提案地址>",to:"<提案地址>",value:0,data:web3.toHex("dpos:1:event:proposal:proposal_type:3:mrpt:666")})
4.4 initiate a proposal to change the minimum allowed vote limit
- Change the minimum allowed vote limit
10ether
> eth.sendTransaction({from:"<提案地址>",to:"<提案地址>",value:0,data:web3.toHex("dpos:1:event:proposal:proposal_type:6:mvb:10")})
4.5 pass or oppose the proposal
yesthrough the proposal,noobjection proposal
> eth.sendTransaction({from:"<投票地址>",to:"<投票地址>",value:0,data:web3.toHex("dpos:1:event:declare:hash:<提案hash值>:decision:yes")})
5. View consensus status
> dpos.getSnapshot()
candidatesMiner candidate listconfirmedNumberConfirmed block heighthistoryHashThe block hash of the last two rounds of block output, which is used to calculate the block output order of the producer in the new round.minerRewardThe reward percentage of each block producer, if enabledvoterReward, the rest is the reward of voterssignersList producers and block orderpunishedList the punishment information of each producer for not releasing blocks on timetallyList the total votes of each candidatevotesList voting informationvotersThe height of the block where the voters voteproposalsProposal list
Deploy PBFT consensus sub-chain network
1. Genesis block
{
"config": {
"chainId": 10388,
"istanbul": {
"epoch": 30000,
"policy": 0
}
},
"nonce": "0x0",
"timestamp": "0x0",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f843f83f941c46d10e91eafaac430718df3658b1a496b827bd94b67ee9395542b227c99941eb4168e3f3c6502dd8949d6510b637970085962c908c69e63e9d36a36cb480c0",
"gasLimit": "0xe0000000",
"difficulty": "0x1",
"mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
epochHow many blocks are there at pbft intervals to regularly clear votespolicyThe polling method of pbft proposer: 0 is roundRobin (replaced in order), and 1 is sticky (if the proposer is not wrong, do not replace the proposer)mixHashpbft block shall mixhash specified as 0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365extraDataheader.extra calculated by the initial pbft producerallocpbft does not have a block reward currently, so tokens need to be allocated in advance.
2. Sub-chain initialization process
Method 1. Use sipe to initialize
1.Create or import a producer account
```shell script sipe --datadir=pbftdata account new
2.Use the consensus tool to generate extraData and write it to genesis.json (refer to 1. genesis block)
```shell script
cd cmd/consensus
./init_pbft.sh --numNodes 1 --validator <生产者地址>
3.Initialize sub-chain nodes
```shell script sipe --datadir=pbftdata --role=subchain init genesis.json
4.Write the node's nodekey to pbftdata/static-nodes.json (the nodekey public key is the producer public key)
#### Method 2. Use the consensus tool to initialize the cluster with one click
Run init_pbft.sh in the cmd/consensus Directory
```bash
cd cmd/consensus
./init_pbft.sh --numNodes 3 --ip 127.0.0.1 127.0.0.2 127.0.0.3 --port 21001 21002 21003
numNodesNumber of cluster nodes generatedipList of ip addresses of the specified node (the default ip address is 127.0.0.1)portThe list of ports for the specified node. The default port is 21001 ~ 2100x, and x is numNodes.
After initialization is completedcmd/consensus/pbftdataCreate corresponding node files under the Directory
3. Sub-chain startup process
sipe --datadir=pbftdata --istanbul.requesttimeout=10000 --istanbul.blockperiod=5 --syncmode=full --mine --minerthreads=1 --port=21001 --role=subchain
portMust be consistent with the enode configured in static-nodes.jsonistanbul.requesttimeoutThe expiration time of each view in milliseconds. The default value is 10000.istanbul.blockperiodpbft block output interval, in seconds, the default value is 1
4.View consensus status
```shell script
istanbul.getSnapshot() ```
validatorspbft Block producer listvotesVotes for adding or removing validatorstallyTotal voting situation
Deploy RAFT consensus sub-chain network
1. Genesis block
{
"config": {
"chainId": 10,
"raft": true
},
"nonce": "0x0",
"timestamp": "0x0",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0xe0000000",
"difficulty": "0x0",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
"1e69ebb349e802e25c7eb3b41adb6d18a4ae8591": {
"balance": "0x21e19e0c9bab2400000"
},
"73ce1d55593827ab5a680e750e347bf57485a511": {
"balance": "0x21e19e0c9bab2400000"
},
"b8564a5657fa7dc51605b58f271b5bafad93b984": {
"balance": "0x21e19e0c9bab2400000"
}
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
rafttrue indicates the use of raft consensusallocThe raft consensus packages blocks only when a transaction exists. Therefore, tokens need to be allocated in advance.
2. Sub-chain initialization process
Method 1. Use sipe to initialize
1.Create or import a producer account
sipe --datadir=raftdata account new
2.Initialize sub-chain nodes
sipe --datadir=raftdata --role=subchain init genesis.json
4.nodekey Write raftdata/static-nodes.json (The nodekey public key is the producer public key)
Method 2. Use the consensus tool to initialize the cluster with one click
under cmd/consensuRun under the Directorinit_pbft.sh
cd cmd/consensus
./init_raft.sh --numNodes 3 --ip 127.0.0.1 127.0.0.2 127.0.0.3 --port 21001 21002 21003 --raftport 50401 50402 50403
numNodesNumber of cluster nodes generatedipList of ip addresses of the specified node (the default ip address is 127.0.0.1)portThe list of ports for the specified node. The default port is 21001 ~ 2100x, and x is numNodes.raftportList of raft communication ports for the specified node (the default port is 50401 ~ 5040x, and x is numNodes)
After initialization, the corresponding node file is created in the cmd/consensus/raftdata directory.
3. Sub-chain startup process
sipe --datadir=raftdata --raft --port=21001 --raftport=50401 --role=subchain
portMust be consistent with the enode configured in static-nodes.jsonraftUse raft moderaftportraft port number, which must be consistent with the enode configured in static-nodes.json
4.View consensus status
> istanbul.getSnapshot()
validatorspbft Block producer listvotesVotes for adding or removing validatorstallyTotal voting situation