现在很多区块链项目,包括比特币,以太坊,EOS等等,都是一整套代码,包括了区块链的方方面面:p2p网络通讯,rpc服务,共识算法,区块组织等等。显然从计算机软件的角度看,这样的设计庞杂且不能复用。
Tendermint原本设计是为了在多台机器上安全同步应用的(基于拜占庭(BFT)共识算法)。区块链的共识,逻辑上就是在多个节点同步区块数据。Tendermint天生可以用来做区块链中的BFT的共识机制引擎,区块链可以看成是该引擎上的一个应用。Tendermint可以复用,实现共识机制引擎以及框架。
Tendermint的官方介绍,可以查看网址:
http://tendermint.readthedocs.io/projects/tools/en/master/introduction.html
本文介绍一下Tendermint的基础知识:
1)Tendermint Core/ABCI/应用
Tendermint框架由两部分组成:Tendermint Core以及ABCI (Application BlockChain Interface)。Tendermint Core也就是Tendermint的核心,是POS+BFT共识引擎。应用是指基于Tendermint Core的区块数据的具体应用。ABCI是Tendermint Core和应用间的接口。
如上图,左边是Tendermint Core共识引擎,最右边的黄色方块代表应用逻辑,这两者之间通过ABCI连接,处理各种ABCI消息,其中主要的几个消息:
a)CheckTx消息:在共识引擎收到一笔交易,放入Mempool之前,发送给应用程序,应用程序认为是合法交易返回后,共识引擎将该交易放入Mempool。
b)DeliverTx以及Commit消息:在共识引擎达成共识生成一个区块后,把区块中的交易通过DeliverTx消息发送给应用程序,让应用程序更新状态,最后发送Commit消息,让应用返回最新状态。
2)节点以及共识算法
节点分两种:能生成区块的节点(validator)和不能生成区块的节点。不能生成区块的节点,主要的工作是广播节点/区块等信息以及投票。Tendermint使用的是POS+BFT算法,具体流程如下:
上图中的绿色方块代表共识机制的一个状态。Tendermint使用POS机制选举出一个节点Propose当前的区块。整个区块共识的过程分为两步:pre-vote以及pre-commit。只有这两步都能及时获取2/3的投票,区块生成成功(Commit),否则此轮出块失败,进入下一轮。
3)区块链结构
Tendermint使用如下的区块链结构保存区块链信息。区块包括三部分:Header(区块头),Data(区块中的交易信息)以及LastCommit(上一个区块的Commit信息)。
区块头中包括:
a)区块高度 b)上个区块ID(LastBlockID),也就是上一个区块Header的hash c)Data Hash,所有区块交易信息hash d)App State Hash,应用程序当前状态的hash,这个hash是通过ABCI接口的Commit的返回值。e)Validator Hash,生成区块时所有validator信息的hash f)LastCommit hash,上一个区块的Commit的hash。
4)RPC服务
Tendermint Core提供RPC服务,以供其他模块通过RPC访问区块以及应用的相关信息。
总结:Tendermint是POS+BFT的共识引擎框架。通过编写该框架的应用,可以方便快捷地实现基于Tendermint共识引擎的区块链。因为基于BFT算法的共识,Tendermint可以在不超过1/3的错误节点的情况下,保证区块的一致性。
领取专属 10元无门槛券
私享最新 技术干货