Cosmos-sdk
Tendermint core 0.33.3
cosmo-sdk 0.38.4
Iavl 0.13.3
Gaia 2.0.11
共识协议
半同步网络模型
- 正确性
- 一致性
- 可结束性
n: 总人数 f:拜占庭节点
n > 3f ,可以完成共识 ⇒ n>=3f+1 ⇒ n-f >= 2f+1
CAP证明过程
通过聚合签名将签名信息压缩成一个签名信息,可以降低通信量。常见的聚合签名的库
tendermint 协议
pbft中收到的是2f+1节点,tendermint则是总投票权重2/3,并且基于p2p网络进行广播通信,并且存在round的概念,也就是说在一个高度失败了,会进行切换round并重试。
- Prposer 离线
- 区块不合法
- 区块未及时广播
- 未在有效的时间收集2/3的预投票
- 未在有效时间收集2/3预提交
如果一直收集不到,实际就会不断地round,直到收集全,一旦收集全,就是最终一致性,不需要重组区块。
lock-unlock
lock:
当验证者对一个区块进行了预提交投票之后,则该验证者必须锁定在此区块上,也就意味着不管什么原因全网未共识,则在后续round的投票过程中必须投给自己当前锁定的区块。即使自己成为新的提案者,也必须提交该区块。这是为了验证者在同一个区块高度对不同的区块进行预投票。
unlock:
验证者在看到一个具有更高轮数的polka时可以从自己当前锁定的区块解锁。从而避免死锁。
validator轮换
被选中的概率与投票权重成正比,根据优先级选取(根据当前valset更新),若优先级相等,则根据地址最小选取。
需要满足:
- 相同高度的valset 想通,且投票权重一致
- 不同高度以上都是不同的
- 概率与投票权重占比一致
轮换机制需要进一步确认✅
tendermint将当前区块的投票签名存储到下一个高度区块中,因为投票过程中当前区块内容是不允许发生变化的。 用lastCommit保存,结构如下:
signature
height
round
BlockIDMerkle树 ✅ 很多思想保存数据用到了,包括在做的公链改动,实际也是利用了其原理保存部分数据
需要对签名有个详细的理解✅
双签举证
1个公钥对应两个投票,并且这个必须是放在区块中上链的。
tendermint core
反应器
不同的消息处理实现不同的反应器
这一部分先大概得过了,后面回头再看✅
hook使用✅ (回调接口)