共识算法(二)—— DPoS(股份授权证明)、PBFT(实用拜占庭容错)

DPoS简介

DPoS(Delegated-Proof-of-Stake)即股份授权证明,目的是解决PoS和PoW的不足,DPoS是由被社区选取的可信账户(受托人,得票数为所有委托人得前101位)来创建区块,为了成为正式委托人,用户要去社区拉票,获得足够多的用户信任,用户根据自己持有的加密货币数量占有总量的百分比来进行投票。它就像一个股份制公司,普通员工进不去董事会,但可以推选代表(受托人)代他们做决策。这前101位受托人可以理解为101个矿池,而这101个矿池彼此的权力是相等的,那些拥有加密货币的用户可以随时更换这些矿池。

代币

EOS

优点

  1. 能耗底

  2. 更加的去中心化

  3. 更快的确认速度。

缺点

  1. 投票的积极性不高

  2. 社区选举可能存在网络安全问题。

 


 

 

PBFT简介

PBFT(Practical Byzantine Fault Tolerance),即实用拜占庭容错算法,是解决拜占庭将军问题的一种方案。比起最开始的BFT算法,PBFT额外要求网络封闭,即节点数目确定并提前互通,但将复杂度从指数级降低到多项式级,使得BFT系列算法真正具有可行性。。PBFT算法的核心理论是 y>=3x+1,y是系统的总节点数,x是允许出现故障的节点数,换句话说如果整个系统拥有x个节点是出错了,那么,这个系统必须包含y个节点,才能解决故障。

PBFT4个阶段:

request:client请求阶段(有些说法不包括这个阶段)。总司令给军长下命令。

预准备(pre-prepare):主节点向所有backup节点发送预准备消息,其中包括当前视图编号,client请求以及请求摘要,签名是否一致等。军长对各位师长说:现在是我的时代(视图),我是军长,你们都是师长,所有人都得听我的。现在公布总司令的命令(先说说总司令是谁,命令摘要)。

准备(prepare):包括主节点在内的所有副本节点在收到准备消息之后,对消息的签名是否正确,视图编号是否一致,以及消息序号是否满足水线限制这三个条件进行验证,如果验证通过则把这个准备消息写入消息日志中。backup节点核对签名信息,比如其他师长听到总司令的名字,说对,总司令就是这个人没错,然后核对总司令曾经任命这家伙当军长,好吧,那就听他的吧。

确认(commit):每个副本接受确认消息的条件是:1)签名正确;2)消息的视图编号与节点的当前视图编号一致;3)消息的序号n满足水线条件,在h和H之间。一旦确认消息的接受条件满足了,则该副本节点将确认消息写入消息日志中。每个师长都经过上述核对,确认无误,就会接受命令进行执行。
回复(reply):结果反馈。

 代币

NEO

优点

与POW、POS等大家耳熟能详的共识不同,BFT系列的共识不需要“Proof”,亦即不需要节点投入算力或其他资源来确权,因此不需要代币激励便可完成共识。

缺点

原始的BFT效率太低,只能存在于理论而无法应用。而改进的PBFT虽然效率大大提高,却对节点数量和状态提出了要求,导致合格的记帐节点太少,并且也只能维持在少数,过多的节点会拖慢网络速度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于DPoS是区块链技术中的一种共识算法,实现DPoS需要涉及区块链的一些基础概念和相关操作。这里提供一个简单的DPoS共识算法的实现,包括以下步骤: 1. 定义区块链节点的数据结构 节点包括ID、地址、投票数等信息,使用Python的类来定义节点的结构。 ``` class Node: def __init__(self, id, addr): self.id = id self.addr = addr self.vote_count = 0 ``` 2. 初始化区块链节点 在初始化区块链节点时,需要创建一些节点,并对节点进行一定的初始化操作,如设置超级节点和初始化投票数。 ``` def init_nodes(): nodes = [] super_nodes = [] node_num = 10 total_voter_count = 100 voter_count_per_node = total_voter_count // node_num for i in range(node_num): node_id = i + 1 node_addr = 'node_' + str(i) node = Node(node_id, node_addr) node.vote_count = voter_count_per_node nodes.append(node) if node_id <= 3: super_nodes.append(node) return nodes, super_nodes ``` 3. 实现投票功能 对每个节点进行投票操作,使用Python的字典来记录节点的投票情况。 ``` def vote(node_id, voted_node_id, nodes_dict): if node_id not in nodes_dict: raise Exception('Node not found') if voted_node_id not in nodes_dict: raise Exception('Voted node not found') if nodes_dict[node_id].vote_count <= 0: raise Exception('No vote count') nodes_dict[node_id].vote_count -= 1 if 'votes' not in nodes_dict[voted_node_id]: nodes_dict[voted_node_id]['votes'] = 1 else: nodes_dict[voted_node_id]['votes'] += 1 ``` 4. 计算出票结果 通过对投票结果进行统计,计算出每个节点获得的票数,选出得票最多的前N个节点作为超级节点。 ``` def calculate_vote_result(nodes_dict, super_node_num): sorted_nodes = sorted(nodes_dict.items(), key=lambda x:x[1].get('votes', 0), reverse=True) super_nodes = [x[1] for x in sorted_nodes[:super_node_num]] return super_nodes ``` 5. 实现DPoS共识算法 将节点进行分组,每个节点可以随机被分组到不同的组中,计算出每个组的超级节点,并用超级节点来验证区块的合法性。 ``` def dpos_consensus(nodes, super_nodes_num): nodes_dict = dict(zip([node.id for node in nodes], nodes)) for i in range(20): # 模拟节点投票操作 for node_id in nodes_dict: voted_node_id = random.choice(list(nodes_dict.keys())) vote(node_id, voted_node_id, nodes_dict) # 计算出票结果 super_nodes = calculate_vote_result(nodes_dict, super_nodes_num) # 将节点分组,每个组由前super_nodes_num个超级节点组成 groups = [] group_size = super_nodes_num for i in range(0, len(super_nodes), group_size): groups.append(super_nodes[i:i+group_size]) # 随机分组 random.shuffle(groups) # 对于每个分组,随机选择一个超级节点来验证区块的合法性 for group in groups: validator_id = random.choice([node.id for node in group]) validate_block(validator_id) def validate_block(validator_id): # TODO: 区块验证逻辑 pass ``` 这是一个简单的DPoS共识算法的实现,实际应用中还需要考虑更多因素,如节点的可信度、选举周期、超级节点奖励等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值