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
BlockID

Merkle树 ✅ 很多思想保存数据用到了,包括在做的公链改动,实际也是利用了其原理保存部分数据

需要对签名有个详细的理解✅

双签举证

1个公钥对应两个投票,并且这个必须是放在区块中上链的。

tendermint core

反应器

不同的消息处理实现不同的反应器

这一部分先大概得过了,后面回头再看✅

hook使用✅ (回调接口)