拜占庭共识Tendermint和应用区块链接口(ABCI)

区块链基础 11/09 阅读 5886 views次 人气 0
摘要:

区块链应用接口(Application BlockChain Interface,ABCI)允许应用的拜占庭容错复制可以由任意一种编程语言编写。

Tendermint是什么?

Tenermint是一个软件,用于在多台机器安全一致地复制一个应用。所谓安全,指的是即使有多达1/3的机器出现任意故障的情况下, Tendermint仍然能够正常工作。所谓一致,指的是每一个正常工作的机器都会有着同样的交易日志,计算相同的状态。安全一致的复制是分布式系统中一个至关重要的问题:从货币到选举,到基础设施规划,它在广泛应用的容错中承担了一个极其重要的角色。

能够容忍机器以任何一种,甚至包括危害系统的方式发生故障,被称为拜占庭容错(BFT)

拜占庭理论已经有几十年的历史,但是很大程度上,直到最近像比特币,以太坊这样区块链技术的成功,它的软件实现才得以进一步发展。区块链技术只是以一种现代化的方式对BFT的再形式化,而且重点关注p2p网络和密码验证。区块链这个名词来源于交易的处理方式,通过区块的批量方式处理交易,每个块包含了前一个块的加密哈希,以此来形成一个链。实际上,区块链数据库真正地优化了BFT设计。

Tendermint包含了两个主要的技术组件:一个区块链共识引擎和一个通用的应用程序接口。

共识引擎,叫做Tendermint Core,保证了每一台机器以相同的顺序记录同一笔交易。应用程序接口,叫做应用程序区块链接口(ABCI),保证了交易可以通过任何一种编程语言进行处理。与其他预先打包内置状态机(比如键值存储或者一个奇怪的脚本语言)的区块链和共识方案不同,开发者可以使用Tendermint实现应用的BFT状态机复制,而这些应用可以用任何语言编写,而且开发环境对开发者也十分友好。 

Tendermint的设计原则是易使用,易理解,高性能,对于各种分布式应用都十分有用。

Tendermint 说明文档:https://tendermint.readthedocs.io/en/master/ 

Tendermint 地址:https://github.com/tendermint/tendermint


ABCI是什么?

Motivation

迄今为止,所有的区块链“栈”(比如,比特币)都有着大一统的设计。这就是说,每个区块链栈都是一个单一的程序,这个程序处理了去中心化账本的所有事务。它还包括了P2P连接,交易的“内存池”广播,在最新块上的共识,账户余额,图灵完备的合约,用户级别的许可权等。

在计算机科学中,使用大一统的架构,是一个典型的错误实践。这会使得代码重用变得困难,而且如果真的去这么做时,会导致代码库分支的维护变得十分复杂。尤其当代码设计并非模块化时,会产生难以维护的“意大利面条式代码”。

大一统设计的另一个问题是,它限制了区块链栈的语言。比如在以太坊中,它支持一个图灵完备的字节码虚拟机,它限制你必须使用可以编译为那种类型字节码的语言。目前,它所支持的语言是Serpent和Solidity。

相反,我们的方式是从特定区块链应用的应用状态细节中,将共识引擎和P2P层分离开来。我们通过将应用细节抽象为一个借口来实现这一点,这个接口被实现为一个socket协议。

所以,我们就有了一个接口,应用区块链接口(ABCI),和它的主要实现,Tendermint Socket Protocol (TSP, 或 Teaspoon)。

Intro to ABCI

Tendermint Core (“共识引擎”)通过一个满足 ABCI 标准的 socket 协议与应用进行交流。

举个大家比较熟悉的例子,比特币。比特币是一个加密货币区块链,其中的每个节点维护了一个完全经过审计的 UTXO数据库。如果有人想要在ABCI之上创建一个类似比特币的系统,Tendermint Core 将会负责:

·在节点间共享区块和交易。

·建立交易(区块链)的标准/不可变顺序。

而应用将会负责:

·维护 UTXO 数据库。

·验证交易的加密签名。

·阻止花费尚未存在的交易。

·允许客户端查询 UTXO 数据库。

Tendermint能够通过在应用过程和共识过程之间,提供一个非常简单的API(也就是 ABCI)来分解区块链设计。

ABCI 包含了 3 个主要的消息类型,它们由 core 发送至应用。应用会对消息产生相应的回复。

消息的详细说明:

ABCI消息类型:https://github.com/tendermint/abci#message-types

DeliverTx 消息是应用的主要部分。链中的每笔交易都通过这个消息进行传送。应用需要基于当前状态,应用协议,和交易的加密证书上,去验证接收到 DeliverTx 消息的每笔交易,。一个经过验证的交易然后需要去更新应用状态 – 比如通过将绑定一个值到键值存储,或者通过更新 UTXO 数据库。

CheckTx消息类似于 DeliverTx,但是它仅用于验证交易。Tendermint Core 的内存池首先通过 CheckTx 检验一笔交易的有效性,并且只将有效交易中继到其他节点。比如,一个应用可能会检查在交易中不断增长的序列号,如果序列号过时,CheckTx 就会返回一个错误。又或者,他们可能使用一个基于容量的系统,该系统需要对每笔交易重新更新容量。

Commit消息用于计算当前应用状态的一个加密保证(cryptographic commitment),这个加密保证会被放到下一个区块头。这有一些比较方便的属性。现在,更新状态时的不一致性会被认为是区块链的分支,分支会捕获所有的编程错误。这同样也简化了保障轻节点客户端安全的开发,因为 Merkel-hash 证明可以通过在区块哈希上的检查得到验证,区块链哈希由一个 quorum 签署。

一个应用可能有多个 ABCI socket 连接。Tendermint Core 给应用创建了三个 ABCI 连接:一个用于内存池广播时的交易验证,一个用于运行提交区块时的共识引擎,还有一个用于查询应用状态。

很显然,在创建区块链时,应用的设计者需要非常小心地设计他们的消息处理,这个架构提供一个范例。下图阐释了通过 ABCI 的消息流:

区块链2.png

A Note on Determinism

区块链交易处理的逻辑必须是确定性的。如果应用逻辑不确定,就无法在 Tendermint Core 复制节点间达成共识。

在以太坊上的 Solidity 是用于区块链应用一个非常好的语言选择,除了一些其他因素,它还是一个完全确定性的编程语言。但是,通过使用现有的一些语言,比如 Java,C++,Python 和 Go 也是可以创建确定性应用的。对通过避免非确定性来源创建确定性程序,游戏程序员和区块链开发者都已经很熟悉了,比如:

随机数生成器(没有确定性的种子)

·线程上的竞争条件(或者避免多线程)。

·系统时钟。

·未初始化的内存(在像 C 或者 C++ 这样的不安全语言)。

·浮点数算法。

·随机的语言特性(比如 Go 语言的 map 迭代)。

尽管程序员可以通过加倍小心来避免非确定性,但是给每个语言创建一个特殊的语法检查器或静态分析器,用它们来检查确定性也是有可能的。在未来,我们可能会与合作者一起创造出这样的工具。


评论

表情

分享到: