简介
区块链是一个分布式系统,在分布式系统中,各个节点达需要到达一致性。在区块链中,达到一致性根据不同的场景会有不同的共识算法。根据容错性可以将共识算法分为拜占庭容错算法和非拜占庭容错算法。常见的非拜占庭容错算法有: raft和paxos(私有链策略,效率高,中心化).拜占庭容错算法有:PBFT(联盟链策略,介于中间)和POW(公链策略,效率低,去中心化高)等。区块链目前主流的共识模型为以下四步:
- 选主:选择唯一的区块进行记账,目前的主要方式有:选举、证明、随机等
- 造块:从交易集中选择一批交易进行打包
- 验证:代表节点广播区块后,其他节点进行验证
- 上链:节点将区块添加到主链,若主链中存在分叉链,则通过各个节点共识算法的链选择机制来决定,如pow的最长链原则
拜占庭问题
非拜占庭问题指的是分布式系统不存在作恶节点。当系统部分节点存在故障时,只会不响应,而不会做出错误的“指令”,不会影响到整个系统的正确执行。拜占庭问题恰恰相反,分布式系统中存在作恶节点,发错错误的执行,从而导致整个系统做出错误的执行。
解决拜占庭问题
解决拜占庭问题的算法统一称为拜占庭算法,缩写BFT。经过证明:
消息传递的采用:
- 口头消息:n(节点总数) > 3 * m(作恶节点) + 1,那么系统是拜占庭容错的
- 将军向副官发送执行v, 忠诚节点向其他节点发送相同的命令,作恶节点会作恶
- 最终所有副官会得到一个集合V{v0,v1…vi}
- 少数服从多数原则majority(V)
- 签名消息:n(忠诚节点) > m (作恶节点) + 1,那么系统是拜占庭容错了
- 将军向所有副官发送命令v0,并签上自己的签名x0
- 副官收到签名后向其他副官发送命令,并签上xi
- 当收到带x0…xi的签名后,该节点向除了X0…xi的节点发送命令xk并带上签名
- 由于签名不可伪造,很容易判断出谁是叛徒,相较于口头传递无法判断出将军是叛徒还是副官是叛徒
区块链中实现的拜占庭算法
PBFT
- 全称Practical Byzantine Fault Tolerant(拜占庭实用容错)。包括五阶段共识:
- Request
- Pre-Prepare
- Prepare
- Commit
- Relay
如下图所示