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 seconds
- epochHow 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 dpos
- minVoterBalanceThe minimum amount of votes allowed by dpos. Unit: Wei
- voterRewardWhether 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 list
- pbftWhether dpos uses pbft to confirm each block after each round of block output
- allocdpos 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 list
- confirmedNumberConfirmed block height
- historyHashThe 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 enabled- voterReward, the rest is the reward of voters
- signersList producers and block order
- punishedList the punishment information of each producer for not releasing blocks on time
- tallyList the total votes of each candidate
- votesList voting information
- votersThe height of the block where the voters vote
- proposalsProposal 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 votes
- policyThe 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 0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365
- extraDataheader.extra calculated by the initial pbft producer
- allocpbft 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 generated
- ipList 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.json
- istanbul.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 list
votesVotes for adding or removing validators
tallyTotal 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 consensus
- allocThe 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 generated
- ipList 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.json
- raftUse raft mode
- raftportraft port number, which must be consistent with the enode configured in static-nodes.json
4.View consensus status
> istanbul.getSnapshot()
- validatorspbft Block producer list
- votesVotes for adding or removing validators
- tallyTotal voting situation