主页 > imtoken钱包劫持 > 【深度知识】Tendermint共识算法原理及框架流程

【深度知识】Tendermint共识算法原理及框架流程

imtoken钱包劫持 2023-08-21 05:10:48

一、总结

Tendermint是跨链Cosmos项目的核心技术。本文主要介绍以下内容:(1)Tendermint的网络层次框架图(2)Tendermint模块组成及共识算法原理(3)Tendermint工作流程

2. Tendermint 概述

Cosmos 的开发团队 Tendermint 其实早在 2014 年就意识到了它的不足,并继续专注于寻找一种不依赖于挖矿等高功耗,并提供快速交易处理能力的共识机制。 区块链提供速度、安全性和可扩展性。 目前,Tendermint 已加入微软 Azure 区块链即服务平台,也成为以太坊区块链联盟的成员。 同时,Tendermint 也是跨链技术 Cosmos 的核心技术。 两者的大致关系如下:

从图中不难看出,Cosmos是在Tendermint的基础上增加一些插件功能实现的。

2.1 Tendermint的概念

Tendermint 的概念总结如下: (1) Tendermint 是一种可以在不同机器上安全一致地复制应用程序的软件,其中安全性和一致性也是分布式账本的关键概念。 (2) Tendermint具有拜占庭容错能力,是一种拜占庭容错的共识算法。 (3)Tendermint主要由两部分组成: 1)Tendermint Core:区块链共识引擎,负责节点间的数据传输和拜占庭共识。 2)ABCI:应用区块链接口(Application BlockChain Interface),也是一种支持任何语言的交易处理协议。 一般来说,Tendermint可以理解为一个模块化的区块链软件框架,支持开发者定制自己的区块链,无需考虑共识和网络传输的实现。

2.2 Tendermint 设计原则

区块链是一种确定性状态机,可以在不受信任的节点之间复制状态,包括应用程序的状态和改变状态的事务。 从架构层面,区块链可以简单分为三个概念层: (1)网络层(Networking):负责交易和数据的传输与同步。 (2) 共识算法(Consensus):负责不同的验证节点保证交易处理后状态的一致性,即将交易打包到区块中。 (3) 应用:交易的真正执行者。

比特币采用的共识算法_比特币挖矿算法_比特币算法作用

总体框架如下:

目前区块链实现大多采用上述框架实现单体程序,但这容易出现两个问题:(1)代码复用困难比特币采用的共识算法,代码库的分支管理变得复杂。 (2) 限制应用程序开发的语言。

如何避免这两个问题? Tendermint 设计了自己的一套框架。 其设计原则是易用、易懂、高性能,适用于各种分布式应用。 其创新之处在于将区块链应用(状态)与底层共识分离,将共识引擎和P2P网络层进行封装,形成Tendermint Core。 同时提供ABCI接口与应用层进行交互。 应用程序逻辑可以用任何语言编写,应用程序所做的实际上是状态机控制。 基于这种架构,应用开发者可以轻松实现自己的区块链。

Tendermint的框架一般分为两部分:ABCI Application和Tendermint Core,通过ABCI连接。

3. Tendermint核心模块 3.1 ABCI应用

开发者开发的区块链应用不受开发语言的限制,可以用任何语言开发,但必须实现为ABCI Server,即需要满足以下几点:

(1) 是Socket Server,需要支持TSP或GRPC其中之一。 (2) 能够处理ABCI Message。 所有 ABCI 消息类型都由 protobuf 定义。 具体报文格式请参考(3)实现区块链应用接口(ABCI)。 ABCI 是 Tendermint 中定义的一个协议,用于 Application 和 Tendermint Core 之间的交互。 详细定义如下(版本:0.10.3):

比特币挖矿算法_比特币算法作用_比特币采用的共识算法

ABCI接口可分为信息查询、交易验证、共识相关处理三类。 当Tendermint Core作为ABCI Client启动时,会与ABCI Server建立三个连接,分别用于处理这三类接口消息。

在 Tendermint Core 与 Application 交互的所有消息类型中,主要有 3 种消息类型: (1) CheckTx 消息用于验证交易。 Tendermint Core 中的内存池通过这条消息验证交易的合法性,通过后会将交易广播给其他节点。 (2) DeliverTx 消息是应用程序的主要工作流程,通过它实际执行交易,包括验证交易和更新应用程序的状态。 (3) Commit消息通知应用程序计算当前事件状态并存储在下一个区块头中。

3.2 Tendermint 核心

Tendermint共识引擎,包括区块链,需要实现大部分功能,主要包括:

3.2.1 共识算法

Tendermint 是一种易于理解的拜占庭容错共识协议。 该协议遵循一个简单的状态机,如下所示:

协议中有两种角色: (1) Validator:协议中的角色或节点。 不同的验证者在投票过程中拥有不同的权力(投票权)。 (2) Proposer:由验证者依次产生。 验证者轮流提议交易区块并对提议的区块进行投票。 区块被提交到链上,每个区块是一个区块高度。 但是,区块也有可能提交失败。 在这种情况下比特币采用的共识算法,协议将选择下一个验证者在相同高度提议一个新区块并重新开始投票。

比特币采用的共识算法_比特币挖矿算法_比特币算法作用

从图中可以看出,一个区块的成功提交必须经过两个阶段的投票,称为pre-vote和pre-commit。 当超过 2/3 的验证者在同一轮提案中对同一个区块进行预提交时,该区块将被提交。

由于离线或网络延迟等原因,提议者可能无法提议区块。 这种情况在 Tendermint 中也是允许的,因为验证者会等待一定的时间,收到提议者提议的区块后,才会进入下一轮提议。

假设只有不到三分之一的验证者是拜占庭节点,Tendermint 可以保证验证者永远不会在同一高度重复提交区块而造成冲突。 为了做到这一点,Tendermint 引入了一种锁定机制,一旦验证者对一个区块进行了预投票,那么该验证者就会被锁定在这个区块中。 然后: (1) 验证者必须对预提交的块进行预投票。 (2) 当上一轮预提议和预投票未能提交区块时,验证人将被解锁,然后进行下一轮新区块的预提交。

可以看出,Tendermint 共识算法与 PBFT 非常相似。 可以说是PBFT的一个变种。 让我们比较一下:

(1) 相同点: 1) 都属于BFT系统。 2)抗1/3拜占庭节点攻击。 3)三阶段提交,第一阶段广播交易(区块),最后两阶段广播签名(确认)。 4)两者都需要法定人数才能提交区块。

(2) 区别: 1) Tendermint 与PBFT 的区别主要在于1/3 以上的节点是拜占庭节点。 当拜占庭节点数量在验证者数量的 1/3 到 2/3 之间时,PBFT 算法无法提供保证,允许攻击者向客户端返回任意结果。 Tendermint 共识模型认为提交区块需要超过 2/3 的预提交确认数。 例如,如果 1/2 的验证者是拜占庭节点,那么 Tendermint 中的这些拜占庭节点可以阻止块的提交,但他们自己不能提交恶意块。 在 PBFT 中,拜占庭节点可以向客户端提交区块。 简单地说,比特币网络存在分叉的可能性,但 Tendermint 不会出现这种情况。 2)另一个区别在于拜占庭节点的概念。 PBFT指的是节点数,而Tendermint代表的是节点的权益数,即投票权。 3) 最后,PBFT 需要一组固定的验证者,而 Tendermint 支持验证者的动态变化,需要超过 2/3 的验证者法定人数才能批准成员变更。

锁机制详解 例如有四个验证者节点,A、B、C、D。在某个R轮中,在提议阶段,(1)提议者节点广播一个新的区块blockX; (2) A的超时 如果没有收到新的区块,向外部广播pre-vote nil,B、C、D已经收到,将pre-vote广播给blockX; (3) 现在四个节点都进入了pre-commit阶段,A在红色内圈,B、C、D在蓝色外圈; (4) 假设A由于网络不好,在规定的时间内没有收到超过2/3的blockX投票,所以只能向一个空块发出pre-commit nil voting message (5) D收到了pre-commit nil voting message B 和 C 的投票消息,加上他自己的,超过 2/3,所以 D 在本地区块链中提交了 blockX ( 6) 假设此时 B 和 C 的网络出现问题,D 无法收到预提交消息。 这意味着B和C只能看到2票给blockX,1票给空块,都小于2/ 3。所以B和C都只能commit空块,高度不变。 进入R+1轮后,A只能看到2票给blockX,1票给空块,只能commit空块。 (7) 在R+1轮,由于有新的提议者,提出了新的区块block Y,A、B、C可能达成共识,提交blockY,所以在同一高度,有两个区块blockX和blockY,导致分叉? 事实上,Tendermint 已经加入了锁定机制,具体来说,在第 7 步中,即使提议者产生了新的区块 Y,A,B,C 也只能在第 6 步中被锁定在他们的 pre-commit 区块中,即 A如果在第6步投了一个空块,那么只能在R+1轮继续投一个空块。 如果B在第6步投票给了blockX,那么在新一轮中,你永远只能投票给blockX,C.类似。 这样,在R+1轮中,空块会有1票,blockX有2票,最终对blockX达成共识,A、B、C都会commit blockX,与D一致,并且没有冲突。

比特币采用的共识算法_比特币算法作用_比特币挖矿算法

3.2.2 P2P网络

Tendermint 的 P2P 网络协议借鉴了比特币的点对点发现协议。 更准确地说,Tendermint 使用的是 BTCD 的 P2P 地址簿(Address Book)机制。 当连接建立后,新节点将自己的Address信息(包括IP、Port、ID等)发送给它的邻居节点。

此外,为了保证节点间数据传输的安全性,Tendermint采用了基于Station-to-Station协议的鉴权加密方案。 该协议是基于经典DH算法的密钥协商方案,提供相互密钥和实体认证。 大致流程如下:

(1) 每个节点必须生成一对ED25519密钥对作为自己的ID。 (2) 当两个节点建立TCP连接时,都会生成一个临时的ED25519密钥对,并将临时公钥发送给对方。 (3) 两个节点将自己的私钥与对方的临时公钥相乘,得到共享密钥。 此共享秘密是对称加密密钥。 (4)将两个临时公钥按照一定的规则排序,将两个临时公钥拼接在一起,然后使用Ripemd160进行哈希运算,在后面补上4个0,这样就可以得到一个24字节的随机数。 (5) 将得到的随机数作为加密种子,但是为了保证同一个随机数不会被同一个私钥使用两次,我们将随机数的最后一位设置为1,这样就得到了两个随机数,同时约定高阶的公钥使用反向随机数加密自己的消息,另外一个用于解密对方节点的消息。 (6)用排序后的临时公钥拼接在一起,进行SHA256哈希得到挑战码。 (7) 每个节点使用自己的私钥对挑战码进行签名,并将自己的公钥和签名发送给其他节点进行验证。 (8) 验证通过后,双方身份验证成功。 后续通信使用共享密钥和随机数加密,以保护数据安全。

3.3 应用实例

Tendermint 官方项目内置了 ABCI Application 的两个简单实现,counter 和 kvstore。 这两个demo的逻辑很简单,运行起来也很简单。 以kvstore为例,只需要下面三个简单的指令就可以轻松运行:

tendermint 初始化

比特币采用的共识算法_比特币算法作用_比特币挖矿算法

abci-cli kvstore

tendermint节点

稍微复杂一点,假设你想用 Tendermint 实现一套类以太坊的应用,最终应该是这样的:

Tendermint Core 负责交易和区块共享以及共识处理。 开发者只需要将go-ethereum和ABCI Server集成到一个ABCI应用中即可。 Ethermint 项目是由 Tendermint 团队开发的类似应用程序。 你可以参考一下。 遗憾的是,Ethermint 目前只支持低版本的 abci 和 go-ethereum。

4. Tendermint 工作流程

上图简要描述了 Tenermint 的工作流程。 大致:(1)客户端通过RPC接口broadcast_tx_commit提交交易; (2) 内存池调用ABCI接口CheckTx验证交易的合法性,如交易号、发送方余额等,并在交易执行后订阅事件,等待监听。 (3) 共识 从内存池中获取交易开始共识排序,打包区块,确认后调用ABCI相关接口更新当前事件状态并触发事件。 (4) 最后将交易信息返回给客户端。

5. 参考资料

本文转载自《深入剖析Tendermint,快速融入Cosmos生态》。

更多Tendermint资料参考:(1)拜占庭共识Tendermint简介及简单介绍(2)Tendermint文档(3)Tendermint GIT地址(4)深度剖析Tendermint,快速融入Cosmos生态【高质量】(5)区块链框架Tendermint入门教程(六)Tendermint共识算法详解(七)分布式共识协议介绍(Paxos、Raft)