Commit 788e9c8e authored by 张振华's avatar 张振华

update

parent a8b98fa2
...@@ -133,6 +133,9 @@ SignBlock 蜃ス謨ー蟇ケ蛹コ蝮怜、エ霑幄。檎ュセ蜷,蟷カ譖エ譁ー蛹コ蝮怜、エ逧ュセ蜷榊ュ玲ョオ縲 ...@@ -133,6 +133,9 @@ SignBlock 蜃ス謨ー蟇ケ蛹コ蝮怜、エ霑幄。檎ュセ蜷,蟷カ譖エ譁ー蛹コ蝮怜、エ逧ュセ蜷榊ュ玲ョオ縲
# 六、Tendermint的共识机制 # 六、Tendermint的共识机制
Tendermint的共识是一种类Pos共识,由指定的validator,根据设定的权重值选择节点出块。
其状态机运行如下:
![Tendermint共识状态机示意图](./tendermint-state.png) ![Tendermint共识状态机示意图](./tendermint-state.png)
...@@ -200,7 +203,7 @@ Period蛻困譌カ瑚ヲ∝ッケ蟾イ逕滓蛹コ蝮礼。ョ隶、悟ケカ霑幄。瑚鰍轤ケ驥肴眠騾我クセ梧 ...@@ -200,7 +203,7 @@ Period蛻困譌カ瑚ヲ∝ッケ蟾イ逕滓蛹コ蝮礼。ョ隶、悟ケカ霑幄。瑚鰍轤ケ驥肴眠騾我クセ梧
### (2). Voting状态处理逻辑: ### (2). Voting状态处理逻辑:
1.3s周期检查投票状态,未超过2/3,则切换状态到Init状态。 1.3s周期检查投票状态,未超过2/3,则切换状态到Init状态。
2.如果收到超时消息,则认为是超时未达成共识,切换到Init状态,重新开始新一轮投票。 2.如果收到超时消息,则认为是超时未达成共识,切换到Init状态,重新开始新一轮投票。
3.如果收到投票消息,则判断是否有节点票数超过2/3,如果超过,则达成共识,切换状态到Voted状态,对于出块节点设定出块定时器;对于非出块节点设定周期超时定时器,并同步出块节点生成的区块。 3.如果收到投票消息,则判断是否有节点票数超过2/3,如果超过,则达成共识,切换状态到Voted状态,对于出块节点设定出块定时器;对于非出块节点设定周期超时定时器,并同步出块节点生成的区块。如果没有节点票数超过2/3,且未收到所有投票,则继续等待投票直到超时。
### (3). Voted状态处理逻辑: ### (3). Voted状态处理逻辑:
1.对于出块节点: 1.对于出块节点:
...@@ -209,7 +212,7 @@ Period蛻困譌カ瑚ヲ∝ッケ蟾イ逕滓蛹コ蝮礼。ョ隶、悟ケカ霑幄。瑚鰍轤ケ驥肴眠騾我クセ梧 ...@@ -209,7 +212,7 @@ Period蛻困譌カ瑚ヲ∝ッケ蟾イ逕滓蛹コ蝮礼。ョ隶、悟ケカ霑幄。瑚鰍轤ケ驥肴眠騾我クセ梧
2.对于非出块节点: 2.对于非出块节点:
周期定时器超时,则切换状态到WaitNotify状态,等待出块节点发来的notify消息,如果高度不同步,需要进行区块同步。 周期定时器超时,则切换状态到WaitNotify状态,等待出块节点发来的notify消息,如果高度不同步,需要进行区块同步。
3.如果收到出块节点发来的notify消息,直接切换状态到WaitNotify状态,检查区块高度,如果高度不同步,需要进行区块同步。 3.如果收到出块节点发来的notify消息,直接切换状态到WaitNotify状态,检查区块高度,如果高度不同步,需要进行区块同步。
4.如果收到投票消息,则返回本周期的本地票,以帮助新启动节点完成投票及状态切换。 4.如果收到投票消息,则返回本周期的本节点投票,以帮助新启动节点完成投票及状态切换。
### (4). WaitNotify状态处理逻辑: ### (4). WaitNotify状态处理逻辑:
1.2s周期检查是否收到Notify。 1.2s周期检查是否收到Notify。
...@@ -217,9 +220,10 @@ Period蛻困譌カ瑚ヲ∝ッケ蟾イ逕滓蛹コ蝮礼。ョ隶、悟ケカ霑幄。瑚鰍轤ケ驥肴眠騾我クセ梧 ...@@ -217,9 +220,10 @@ Period蛻困譌カ瑚ヲ∝ッケ蟾イ逕滓蛹コ蝮礼。ョ隶、悟ケカ霑幄。瑚鰍轤ケ驥肴眠騾我クセ梧
如果超时前收到,则记录相关结果,如果区块高度未同步则进行区块同步,并进入Init状态,参与新一轮投票。 如果超时前收到,则记录相关结果,如果区块高度未同步则进行区块同步,并进入Init状态,参与新一轮投票。
## 3 DPos共识相关配置 ## 3 DPos共识相关配置
当前实现,对于受托节点采用了配置制定的方式,各受托节点的公钥配置在genesis.json文件中,各个受托节点使用相同的genesis.json文件;各受托节点自身的私钥、地址信息保存在各自的priv_validator.json文件中。 当前实现,对于受托节点采用了配置指定的方式,各受托节点的公钥配置在genesis.json文件中,各个受托节点使用相同的genesis.json文件;
各受托节点自身的私钥、地址信息保存在各自的priv_validator.json文件中。
这种配置方式借鉴了tendermint的配置方式,后续可以进一步修改为投票选举受托节点的方式,则通过智能合约来对受托节点进行管理。 这种配置方式借鉴了tendermint的配置方式,后续可以进一步修改为投票选举受托节点的方式,通过智能合约来对受托节点进行动态管理。
1.genesis.json: 1.genesis.json:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment