区块链时代的拜占庭容错:Tendermint (七)

时光怂恿深爱的人放手 提交于 2020-03-02 13:15:01

原文题目:《Tendermint: Byzantine Fault Tolerance in the Age of Blockchains》

原文作者:Ethan Buchman

本文为节选

 

软件实现

Tendermint采用Go语言实现,代码在https://github.com/tendermint/tendermint。Go是一个类C的语言,带有强大的标准库,可以很轻易的启动大量轻量级并发,并且提供了简单并安全的开发环境。

该代码使用了许多软件包,这些软件包足够模块化,可以作为自己的库进行隔离。这些软件包大部分由Jae Kwon编写,包含错误修复,测试以及作者提供的临时功能。以下小节将介绍这些软件包中最重要的软件包。

 

二进制序列化

Tendermint使用针对简单性和确定性而优化的二进制序列化算法。它支持所有整数类型(包括用一个字节长度前缀编码的varints),字符串,字节数组和时间(unix时间,精度为毫秒)。它还支持任何类型的数组和结构体(编码为有序值列表,忽略键)。它受到Go类型系统的启发,特别是它对接口类型的使用,它可以作为许多具体类型之一实现。可以注册接口,并且每个具体实现在其编码中给出前导类型字节。请在https://github.com/tendermint/go-wire中查看更多细节。

 

加密

诸如Tendermint之类的共识算法使用三种主要加密原语:数字签名,散列函数和经过身份验证的加密。虽然存在这些原语的许多实现,但选择用于企业软件的加密库并非易事,特别是考虑到世界上最常用的安全库OpenSSL的严重不安全性。

造成加密系统不安全的原因是政府机构(如美国国家安全局)可能会故意破坏其安全属性,后者与NIST合作,设计并标准化了当今使用的许多最流行的加密算法。鉴于这些机构明显不合法,例如,爱德华·斯诺登所显示的,以及试图破坏公共密码标准的历史,密码学界的许多人更喜欢使用在开放式设计的,学术环境下的算法。类似地,Tenminmint仅使用这样的算法。

Tendermint采用RIPEMD160作为其hash算法,此算法会产生一个20字节的输出。它被用于交易的Merkle树,验证人的签名,计算区块hash。Go语言在其扩展库中提供了算法的实现。RIPEMD160还被比特币用作从公钥导出地址的两个散列函数之一。

作为其数字签名方案,Tendermint在ED25519椭圆曲线上使用Schnorr签名。ED25519由Dan Bernstein公开设计,旨在实现高性能且易于实施而不会引入漏洞。Bernstein还引入了NaCl,这是一个高级库,用于使用ED25519曲线来做认证加密。Tendermint采用Go自身扩展库的实现。

 

Merkle Hash树

Merkle树的功能与其他基于树的数据结构非常相似,其附加功能是可以生成树中键的成员资格证明,该证书的大小与树的大小成对数。这是通过成对地递归连接和散列密钥来完成的,直到只剩下一个散列,即树的根散列。对于树中的任何叶子,从它到根部的一串哈希作为其成员资格的证明。这使得Merkle树对于p2p文件共享应用程序特别有用,其中大文件的各个部分可以被验证为属于该文件,而不需要拥有所有数据。Tendermint利用此机制来处理在网络Gossip区块的部分,其中根哈希包含在提议区块。

Tendermint还提供了一个自平衡的Merkle二叉树,以AVL树为模型,作为一个名为Merkleeyes的TMSP服务。IAVL树可用于存储动态大小的状态,允许以对数时间查找,插入和删除。

 

RPC

Tendermint提供HTTP API接口,用于查询区块链,网络信息,共识状态和广播交易。同样的API可以通过三种方法进行访问:利用URI编码参数的GET请求,利用标准JSONRPC的POST请求,利用标准JSONRPC的Websocket。Websockets是高事务吞吐量的首选方法,是接收事件所必需的。

 

P2P网络

Tendermint使用的P2P子协议在本系列第三篇“Tendermint子协议”中有更全面的描述。

 

反应器

Tendermint节点是由多个并行的反应器组成,每个反应器管理状态机通过网络向对等节点的信息发送和收取,就如本系列第三篇描述的一样,反应器根据锁定共享数据结构来进行同步,但同步点保持在最小,因此每个反应器大部分情况下和别的反应器是并行的。

 

内存池

内存池反应器管理内存池,它将交易在打包入块和提交前进行缓存。内存池使用应用程序状态机的子集来检查交易的有效性。交易保存在并发链表结构中,允许安全写入和许多并发读取。新的有效交易被加入到列表的末尾。每个对等节点的例程遍历列表,按顺序将每个交易发送给对等节点一次。列表同样被扫描用于为新提议收集交易,当新提议块被提交确认后列表会按照如下规则进行更新:删除被确认提交的交易,未确认的交易重新通过一次CheckTX方法的确认,并删除那些无效的交易。

 

共识

共识反应器管理共识状态机,它处理提议,投票,锁定和块的实际提交。状态机使用一些持久的例程来管理,这些例程排序接收的消息并使它们能够被确定地重放以调试其状态。这些例程包括readloop,用于读取接受消息的队列,timeoutLoop用于注册和触发超时事件。

共识状态机中的转换是在收到完整的提议和区块时,或者在给定轮次中收到超过三分之二的预选票或预先提交时进行的。在广播中的提议,区块数据,或者投票的交易结果被加入internalQueue队列,并和从对等节点接受的信息一起顺序的被readLoop处理。这使内部消息和对等节点消息在共享状态机的输入上处于平等的地位,但允许更快地处理内部消息,当它们不与来自对等节点的消息位于同一队列中。

 

区块链

区块链反应器以一种比共识反应器更快的技术来同步区块链。也就是说,验证者请求增加区块高度直到所有对等节点都没有更高高度为止。块在块池中收集并通过工作例程同步到区块链,该例程定期从池中获取块并针对当前链验证它们。

一旦区块链反应器完成同步,它就会切换到共识反应器。

 

总结

Tendermint实现利用了语言的并发原语,垃圾收集和类型安全,提供了一个清晰,模块化,易于阅读的代码库以及许多可重用的组件。如下一章所示,该实现获得了高性能并且对许多不同类型的故障具有稳健性。

 

推荐阅读:

区块链时代的拜占庭容错:Tendermint(一)

区块链时代的拜占庭容错:Tendermint(二)

区块链时代的拜占庭容错:Tendermint(三)

区块链时代的拜占庭容错:Tendermint (四)

区块链时代的拜占庭容错:Tendermint (五)

区块链时代的拜占庭容错:Tendermint(六)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!