Tendermint 中有几个重要概念:
需要注意,Tendermint 判断的是投票权比例,而不是节点数量。一个拥有 30% 投票权的验证者,其影响力相当于总投票权的 30%。
Proposer 不是通过临时选举产生的,而是通过确定性的加权轮询算法产生。
每个验证者都有一个 ProposerPriority。简化后的算法如下:
1. 每轮:priority += votingPower
2. 选择 priority 最大的验证者作为 Proposer
3. 被选中的验证者:priority -= 总投票权
假设验证者集合为:
| 验证者 | 投票权 |
|---|---|
| A | 5 |
| B | 3 |
| C | 2 |
初始优先级均为 0:
第 1 轮增加后:A=5,B=3,C=2
选择 A,A 减去总投票权 10
结果:A=-5,B=3,C=2
第 2 轮增加后:A=0,B=6,C=4
选择 B
结果:A=0,B=-4,C=4
第 3 轮增加后:A=5,B=-1,C=6
选择 C
因此,投票权越大,成为 Proposer 的频率越高,但不会因为投票权最大就永远担任 Proposer。
由于所有节点拥有相同的验证者集合、投票权和优先级状态,所以能够独立计算出相同的 Proposer,不需要额外执行一次选举共识。