pbft协议可以处理拜占庭错误,即可以处理以下错误:
- 节点故意不回复
- 节点故意发送误导的信息
拜占庭错误的协议不仅要在多个节点之中确定一个提议,还要防止这个提议是假的,例如:这个提议的发送者是一个坏的节点,故意给一些节点发送A提议,给另外一些节点发送B提议,这样这个集群就产生了不一致,俗称脑裂。这是共识协议最严重的错误。
如何才能处理拜占庭错误
非拜占庭错误需要:
- 二阶段协议
- n >= 2f + 1,即错误节点不能超过一半,集群要有大多数是正确的。
拜占庭错误需要:
- 三阶段协议。可以理解为,其中的两阶段用于确定一个值,第三阶段用于验证这个值是否与其他人一致。
- n >= 3f + 1。可以理解为,只有大多数并不能确定一个值,因为这个大多数中可能有恶意节点故意装的。我们需要另外的f节点再帮我们验证。
流程
pbft是一个leader-based协议,即集群中有一个leader节点,也主节点。主节点发送错误后,重新选择一个主节点,这个过程叫view-change。
正常的协议有下面三个阶段:
pre-prepare
主节点将请求发送给所有其他节点
prepare
其他节点收到后,验证消息有效性。然后将请求发送给所有其他节点
commit
其他节点收到后,验证消息有效性。然后将请求发送给所有其他节点
当主节点收到2f+1的commit消息后,就可以返回确定信息给客户端。