时间:2023-07-28|浏览:211
用戶喜愛的交易所
已有账号登陆后会弹出下载
在计算机科学中,采用大一统的架构是一个典型的错误实践。这会导致代码重用变得困难,而且如果真的这么做了,代码库分支的维护会变得十分复杂。尤其当代码设计不是模块化时,会产生难以维护的“意大利面条式代码”。
大一统设计的另一个问题是它限制了区块链栈的语言。在以太坊中,它支持一个图灵完备的字节码虚拟机,这限制了你必须使用可以编译为该字节码类型的语言。目前,它支持的语言是Serpent和Solidity。
相反的是,我们的方法是将共识引擎和P2P层与特定区块链应用的应用状态细节分离开来。我们通过将应用细节抽象为一个借口来实现这一点,这个接口被实现为一个socket协议。
所以,我们有了一个接口,应用区块链接口(ABCI),以及它的主要实现,TendermintSocketProtocol(TSP,或Teaspoon)。
举个大家比较熟悉的例子,比特币。比特币是一个加密货币区块链,每个节点维护一个完全经过审计的UTXO数据库。如果有人想要在ABCI之上创建一个类似比特币的系统,TendermintCore将负责:
- 在节点间共享区块和交易 - 建立交易(区块链)的标准/不可变顺序
而应用将负责:
- 维护UTXO数据库 - 验证交易的加密签名 - 阻止花费尚未存在的交易 - 允许客户端查询UTXO数据库
Tendermint能够通过提供一个非常简单的API(即ABCI)在应用过程和共识过程之间分解区块链设计。
ABCI包含三个主要的消息类型,由核心发送给应用。应用对消息产生相应的回复。
消息的详细说明在这里:ABCI消息类型。
DeliverTx消息是应用的主要部分。链中的每笔交易通过这个消息进行传送。应用需要基于当前状态、应用协议和交易的加密证书验证接收到的每笔交易。验证通过的交易需要更新应用状态,例如通过将一个值绑定到键值存储,或通过更新UTXO数据库。
CheckTx消息类似于DeliverTx,但它仅用于验证交易。TendermintCore的内存池首先通过CheckTx验证交易的有效性,只将有效交易传输到其他节点。例如,一个应用可能会检查不断增长的交易序列号,如果序列号过时,CheckTx会返回一个错误。或者它们可能使用一个基于容量的系统,该系统需要对每笔交易进行容量检查。
Commit消息用于计算当前应用状态的一个加密保证,并将该加密保证放到下一个区块头中。这具有一些方便的属性。现在,状态更新的不一致性被视为区块链的分叉,分叉会捕获所有的编程错误。这也简化了保障轻节点客户端安全的开发,因为可以通过检查区块哈希来验证Merkel-hash证明,区块链哈希由一个quorum签署。
一个应用可以有多个ABCI socket连接。TendermintCore为应用创建了三个ABCI连接:一个用于内存池广播时的交易验证,一个用于运行提交区块时的共识引擎,还有一个用于查询应用状态。
显然,在创建区块链时,应用的设计者需要小心地设计他们的消息处理。以下图阐释了通过ABCI的消息流。
在以太坊上,Solidity是用于区块链应用的一个非常好的语言选择,除了其他一些因素外,它还是一种完全确定性的编程语言。但是,通过使用现有的一些语言,如Java,C++,Python和Go,也可以创建确定性应用。游戏程序员和区块链开发者已经熟悉了通过避免非确定性来源来创建确定性程序的方法,例如:
- 无确定性种子的随机数生成器 - 线程上的竞争条件(或避免多线程) - 系统时钟 - 未初始化的内存(在不安全的语言如C或C++中) - 浮点数算法 - 随机的语言特性(如Go语言中的map迭代)
尽管程序员可以通过非常小心来避免非确定性,但也有可能为每种语言创建一个特殊的语法检查器或静态分析器,用于检查确定性。在将来,我们可能会与合作者一起创造这样的工具。