共识机制比较

本文深入探讨了区块链中的共识机制,包括CAP理论、Tendermint、PAXOS、RAFT、ZAB、Casper和HotStuff等。通过对这些协议的工作原理和特点的分析,展示了不同共识机制如何确保区块链的安全性和一致性。
摘要由CSDN通过智能技术生成

共识

CAP理论

一致性consistency

服务可用性availability:请求在一定时间内得到响应,可终止、不会一直等待

分区容错性partition-tolerance:网络分区情况下,被分割的节点仍能对外服务

tendermint

在这里插入图片描述

协议中的参与者叫着 “验证人”(validator)。他们轮流对交易区块进行提议,并对这些区块进行投票。区块会被提交到链上,每一个块占据一个“高度”(height)。提交块可能会失败,如果失败,协议就会开始下一轮的提交,并且一个新的验证人会继续提交那个高度的区块。要想成功提交一个块,需要有两个阶段的投票:“预投票”(pre-vote)和“预提交”(pre-commit)。在同一轮提交中,只有超过 2/3 的验证人对同一个块进行了预提交,这个块才能被提交到链上。
  上图右下角有一对夫妇在跳波卡舞,因为验证人做的事情就像是在跳波卡舞。当超过 2/3 的验证人对同一个块进行了预投票,我们就把它叫做一个“波卡”(polka)。每一个预提交都必须被同一轮中的一个波卡所证明。
  由于一些原因,验证人可能在提交一个块时失败:当前提议者可能离线了,或者网络非常慢。Tendermint 允许他们证实一个验证人应该被跳过。在进行下一轮的投票前,验证人会等待一小段时间从提议者那里接收一个完整的提议块。这种对于超时的依赖,使得 Tendermint 成为了一个弱同步协议,而非一个异步协议。但是,协议的剩余部分都是异步的,只有在接收到超过 2/3 的验证人集合时,验证人才会采取下一步操作。Tendermint 能够简化的一个原因就是它使用了同样的机制来提交一个块和跳过直接进入下一轮。
  基于不到 1/3 的验证人是拜占庭节点的前提,Tendermint 保证了永远都不会违背其安全性 – 也就是说,验证人永远不会在同一高度提交冲突块。为了达到这一点,它引入了一些 “锁定”(locking)的规则,这些规则对流程图中的路径进行了模块化。一旦一个验证人预提交了一个块,它就被“锁定”在了那个块上。然后,

  1. 它必须为被锁定的那个块进行预投票
  2. 只有在之后的轮中,有了那个块的一个波卡,它才能够解锁,并为一个新块进行预提交。

PAXOS

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

raft

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PBFT共识算法是一种拜占庭容错的共识算法,它可以保证在最多 f 个节点故障的情况下依然能够达成一致。PBFT算法的实现比较复杂,需要涉及到消息传递、状态转移等方面的问题。下面是一个简单的 Python 实现: 1. 定义节点的状态 节点的状态包括三个部分:视图号、当前操作序号和对应序号的操作。 ```python class NodeState: def __init__(self): self.view = 0 self.seq_num = 0 self.op = None ``` 2. 定义消息类型 根据 PBFT 算法的规则,需要定义四种不同类型的消息:PrePrepare、Prepare、Commit 和 ViewChange。 ```python class PrePrepare: def __init__(self, view, seq_num, op): self.view = view self.seq_num = seq_num self.op = op class Prepare: def __init__(self, view, seq_num, digest): self.view = view self.seq_num = seq_num self.digest = digest class Commit: def __init__(self, view, seq_num, digest): self.view = view self.seq_num = seq_num self.digest = digest class ViewChange: def __init__(self, view, op_log): self.view = view self.op_log = op_log ``` 3. 定义节点类 节点类包含了节点的 ID、状态和网络通信模块。节点需要实现四个方法:`pre_prepare`、`prepare`、`commit` 和 `view_change`,分别对应四种不同类型的消息。 ```python class Node: def __init__(self, node_id, nodes): self.node_id = node_id self.nodes = nodes self.state = NodeState() self.net = Network() def pre_prepare(self, seq_num, op): msg = PrePrepare(self.state.view, seq_num, op) self.net.broadcast(msg) def prepare(self, seq_num, digest): msg = Prepare(self.state.view, seq_num, digest) self.net.broadcast(msg) def commit(self, seq_num, digest): msg = Commit(self.state.view, seq_num, digest) self.net.broadcast(msg) def view_change(self, op_log): msg = ViewChange(self.state.view, op_log) self.net.broadcast(msg) ``` 4. 定义网络通信模块 网络通信模块负责将消息发送给其他节点,以及处理来自其他节点的消息。在这个例子中,我们只需要实现一个简单的广播机制。 ```python class Network: def __init__(self): self.nodes = [] def add_node(self, node): self.nodes.append(node) def broadcast(self, msg): for node in self.nodes: node.receive(msg) class Message: def __init__(self, sender, receiver, content): self.sender = sender self.receiver = receiver self.content = content ``` 5. 定义主函数 在主函数中,我们可以创建节点并添加到网络中。然后,我们可以模拟一些操作,例如发送 PrePrepare 消息、Prepare 消息、Commit 消息和 ViewChange 消息。 ```python if __name__ == '__main__': nodes = [Node(i, nodes) for i in range(4)] network = Network() for node in nodes: network.add_node(node) nodes[0].pre_prepare(1, 'op1') nodes[1].prepare(1, 'digest1') nodes[2].commit(1, 'digest1') nodes[3].view_change(['op1', 'op2', 'op3']) ``` 这是一个非常简单的 PBFT 算法实现,它只考虑了一些基本的操作。在实际应用中,还需要考虑更多的问题,例如节点故障、消息丢失、网络延迟等等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值