专栏名称: Hi区块链
可能是最靠谱不忽悠的区块链资讯平台
目录
相关文章推荐
51好读  ›  专栏  ›  Hi区块链

Cosmos互联链通信技术规范【上】

Hi区块链  · 公众号  ·  · 2017-11-16 16:12

正文


导读

Cosmos IBC(互联链通信)协议在2016年6月Cosmos白皮书中有过首次描述,本文阐述了Cosmos IBC协议的要求和结构,目标是提供足够的细节来充分理解和分析协议的安全性。


原文:CosmosIBCSpecification.pdf

译者:奚海峰

校对:曹恒


摘要

本文给出了Cosmos IBC(互联链通信)协议的技术规范,这个协议在2016年6月Cosmos白皮书中有过首次描述[1]。其它一些技术也可以在一个原子操作中涵盖两个链,比如“哈希时间锁定合同”[2],不过很多(此类技术)都仅限于保证两个交易同时成功或失败。IBC则创建了完整的双向“侧链”,真正地允许跨链传递价值,并充分利用Tendermint的即时最终性来实现代币的快速传递。

IBC使用消息传递范式,并允许参与链保持独立。每个链都维护一个局部的部分顺序,而消息则用于跟踪所有跨链的因果关系。一旦两个链之间注册了信任关系,就可以安全地将数据包从一个链发送到另一个链上,代表从一个链上的一个账户转移代币到另一个链上的账户。该协议也可扩展到代币转移之外(的其它功能) – 尽管为其他应用类型设计安全的通信逻辑还待深入研究。该协议对链之间传输数据包时的阻塞时间或网络延迟不做假设,因此在异构环境中具有很强的鲁棒性。

本文阐述了Cosmos IBC协议的要求和结构,目标是提供足够的细节来充分理解和分析协议的安全性。


1 简介

Cosmos IBC是围绕Cosmos网络和Tendermint共识引擎而设计的,从根本上依赖于Tendermint的即时最终性属性(意味着永远不会创建分叉)。Cosmos网络将由Cosmos枢纽和多个独立的分区组成,这些分区都通过IBC与枢纽进行通信。Cosmos枢纽还可以通过在它们之间中继IBC消息来桥接不同的分区。

我们从一个简单情形的具体例子入手,它可用于为后续的抽象解释提供一个形式框架。在此之后,将解释这个例子中使用的消息传递语义。接下来就是安全证明和数据包传输所依赖的技术基础。

在此之后,将讨论更高级的消息类型,例如超时和路由(以使更大的网络在相当长时间内能高效运作),还要对协议处理所有可能情况的能力予以充分考虑。

除了为IBC协议提供理论理解和参考文档之外,本文还旨在为协议的安全基础提出令人信服的论据。本文是对正在进行的Cosmos项目的一个报告,随着来自实践的数据不断更新理论,我们也将持续调整它的内容。


2 示例场景

为了使讨论不那么抽象,这里用例子说明一个具体情形是如何工作的。Alice想从她在Cosmos分区X上的账户发送30个wink币(示例代币名称)给Cosmos枢纽上的Bob。假设分区X已经跟枢纽建立了一个IBC连接,Alice将在分区X上创建一个交易来发起传输。分区X会将那些代币冻结在某个托管账户,然后创建一个IBC数据包请求枢纽在Bob的账户中创建相应数量的代币。本质上,分区X上的验证节点集合会保证销毁这些代币以换取在枢纽上重铸它们。

一个独立的中继进程(任何人都可运行的客户端软件)可以从分区X提取那个IBC数据包的证明并将其发布到枢纽。枢纽将验证区块头,Merkle证明和顺序号来确保这是一个从分区X来的有效的IBC数据包。这下我们面临两个选择:要么分区X在枢纽上有足够信用来铸这30个wink币从而数据包被接受,要么信用不够而数据包被拒绝。如果数据包被接受,枢纽就在Bob的账户中铸30个新鲜的wink币,并将数据包连同成功记录存在它的传入队列中;如果数据包被拒绝,则不会创建代币,且队列中会存入一个失败记录。

我说的“信用”指的是什么?我们不希望每个连接到枢纽的链都能在枢纽上随意创建任意数量的任意代币,否则所有经济保证很快就变得毫无意义。枢纽必须使用它自己的逻辑来验证它是否足够信任分区X并接受那30个wink币。如果分区X是wink币的本源(X的原生代币),那么在发送wink币到枢纽这件事上,它将得到枢纽的极大信任。如果枢纽之前已经向分区X发送过500个wink币,那么它必须记住这个信息并允许分区X将(不超过)那500个wink币发送回枢纽,从而实现代币的自由流动。这个逻辑可以为代币传输提供安全性,其它应用则需要在不完全信任网络中所有分区的情况下,运用它们自己的逻辑来维护全局约束条件。

在枢纽成功或不成功地执行了那个交易之后,我们希望将交易的收据(连同证明)传回到分区X以完成这个循环。此收据只是另一种类型的IBC数据包,其执行方式与发送一样。唯一区别是,在发起分区处理收据绝不能产生错误。(根据收据内容)如果交易是成功的,则分区X将销毁托管的30个wink币,代币在分区间转移成功;如果交易因任何原因被拒绝,那么托管代币就会释放回Alice的账户 – 就像什么都没有发生过一样。

这意味着,在收到响应(成功或失败)之前,谁也不能碰分区X上的托管代币。除非我们有证据证明该数据包被接收链拒绝,已经发出的代币不会被释放。没有代币会被无端创建或销毁,也不可能执行双花,代币不会莫名消失在跨链操作中。发送方只需要等待两个数据包的转发和执行(很多情况下是十来秒钟)。对处理硬分叉分区(如ETH/ETC或BTC/BCH)的考虑会在下面的高级章节讨论。


3 消息传递语义

在试图扩展区块链时,必须找到一种不违反任何安全保证的可行方法,来增加并行写的数量。防止双花需要为任何给定账户提供严格的串行访问(读和写),但是我们需要一些安全的方法来允许多个交易同时执行,而又不给恶意利用竞态条件提供可能性。

通过IBC协议,我们寻求避免一个问题,那就是允许多个独立节点将交易应用到相同的状态空间。如果你不想丢失任何数据(比如:强最终一致性),这个问题即便不考虑拜占庭角色也是困难的,在面对恶意行动人寻求利用任何不一致为自身牟利的情况下,则变得极其困难。安全地将不同的部分排序协调成一致的全局排序的最严谨方法是CRDTs(无冲突数据复制类型),它保证一组固定交易的所有可选的部分排序都将收敛到相同结果。CRDTs确实很有趣,但由于其固有特性,不允许在区块链用例中强制执行约束条件(例如,账户余额永远不能为负数)。

这个问题的另一个解决方案是使用分片,每个分片都只能访问状态空间的一部分。这可以增加吞吐量,但也会使任何涉及多个分片的交易极难正确执行。触及多个分片并需要一致视图的查询可以通过使用快照来执行,但是在高度分布的环境中这可能很困难。如果您想在两个分片上安全地、原子地查询和修改数据,就需要类似锁和三阶段提交的机制,这在许多数据库中都使用过。但是,如果您想要保证顺序并在通信层引入同步和定时假设,这就是一个阻塞操作,这使得它不适合分布式(多)区块链的场景。

我们通过定义“分区”而走了一条不同的路。每个分区都是一个独立的区块链,有自己的应用逻辑,自己的交易和数据存储。分区应该沿使用界线分开,因此绝大多数交易只影响一个分区,但我们可以保证任何跨链交易拥有安全和非阻塞的语义。每个分区都是一个完整的独立系统,它们使用消息传递进行通信。它们能够保证本地分区中的交易正确排序和执行,同时允许其它分区里的交易并行执行。唯一需要全局排序的东西是系统之间发送的消息。

分布式系统中的消息传递是一个已经被深入研究的领域,也是许多其它系统的搭建基础。我们能够对异步消息进行建模,且对信道不做时序假设。这样的结果是,我们允许每个分区以自己的速度行动,不被任何其它分区阻塞,却能够以当时网络允许的最快速度通信。

使用消息传递作为原语的另一个好处是,接收方能够对传入的消息应用自己的安全检查。仅仅因为一个我们了解的分区发送了一条消息给某个特定帐户添加50个以太币,并不意味着我们必须增加余额。我们可以在接收消息时添加我们自己的业务逻辑,以决定我们是否想拒绝该消息,以及我们想如何处理它(如果我们接受它)。在一个共享状态的场景中,很难甚至不可能做到这一点。消息传递允许每个分区确保其安全性和自治性,同时允许不同的系统作为一个整体协同工作。这可以看作是微服务体系架构的一个类比,但是跨越了组织边界。

为了在一个可证明的异步消息传递原语上构建有用的算法,我们需要定义一些更高阶的结构在所有系统间共享,从而允许我们和一些更容易的保证打交道。


3.1 可靠消息队列

我们在这里引入的第一个原语是可靠的消息队列(以下简称队列),这是异步消息传递的典型构造,它使我们能够确保因果排序并避免阻塞。







请到「今天看啥」查看全文