Bitcoin 网络的诞生推动具有不同设计决策和用例的区块链出现了寒武纪爆发式的增长。虽然这些分布式账本服务于不同的目的,但它们是作为一座座孤岛存在的,彼此之间的交互十分有限。与互联网促进世界不同地区、不同类型的计算机相互通信类似,采用一种类似的技术充当区块链之间的连接组织,对于实现真正的价值增长是很有必要的。跨链通信协议(IBC)正是旨在服务于这一互联目标。
IBC 是一种通用的互操作性协议,允许两个不同的区块链进行相互通信。IBC 能够保证跨链通信是可靠、有序并经过验证的。
IBC 最重要的属性之一也许是信任最小化。在区块链中,信任最小化的属性本质上与安全性相关。没有哪种分布式系统是完全「无需信任」的。因此,安全问题最终会被归结为信任谁或信任什么,以及怎样判定违反信任,即破坏受信任的实体需要付出何种代价。
从这个意义上说,与大多数桥接解决方案不同,IBC 无需受信任的第三方。这意味着,如果用户信任两条特定的链,并使用它们提供的功能(以及默认信任它们的共识机制),那么当使用 IBC 在受信任的链之间进行交互时,则无需额外的信任假设。
IBC 不仅仅是一个便于资产转移的桥梁。它是一种通用性的消息传递协议。也就是说,任何形式的数据都可以通过 IBC 进行传输。
IBC 的工作原理什么?
为了理解 IBC 的工作原理,首先需要区分 IBC 的两个不同分层,即 1)传输层和 2)应用层。
图 1:两个区块链之间 IBC 数据包流程的高层描述
图 2
图 3
1. 传输层
通过 IBC 通信的消息在数据包中完成传输。传输层负责传输、验证与排序这些数据包。
数据包定义:
https://computersciencewiki.org/index.php/Data_packet
传输层没有规定数据包中的数据应该是什么,或者接收链应该如何解析数据包。从传输层的角度来看,数据包中的信息只是随机字节。
传输层的关键组件是轻客户端(light clients)、中继器(relayers)、连接(connections)和通道(channels)。
轻客户端是区块链的轻量级版本。与全节点不同,轻客户端不会存储区块链中包含的所有消息的全部历史记录,也不会执行事务。相反,轻客户端用于连接全节点,并验证区块头(区块中所包含数据的摘要)。这使轻客户端能够高效地进行存储和计算。
全节点定义:
https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#what-is-a-full-node
通过 IBC 交互的两条独立区块链 A 和 B 互相运行对方链的轻客户端。这意味着 A 链在其链上有一个轻客户端,充当 B 链的轻量级版本。当 A 链想要将「X」消息跨链传输到 B 链时,它会将包含该消息的区块的区块头,以及该消息的承诺证明(commitment proof)发送给 B 链。承诺证明用于验证 A 链上是否存在对应消息。通过使用区块头和承诺证明,B 链得以通过加密方式验证 A 链确实执行了消息「X」。正是因为 IBC 中使用了轻客户端,才使区块链无需受信任的第三方就能够相互交换消息。
但是 A 链和 B 链并不是直接互相发送这些消息/数据包。相反,当 A 链想要向 B 链发送消息时,它会在其状态机中提交或存储包含该消息的数据包的哈希值(hash)。而作为链下进程的中继器将不断监听此类消息。当中继器监听到 A 链在其状态机中提交了一条计划发送给 B 链的消息时,他们只需拾取这条消息并将其传递给 B 链即可。请注意,中继器是无需许可的,因此任何人都可以运行。
哈希:
https://www.investopedia.com/terms/h/hash.asp
状态机:
https://www.techopedia.com/definition/16447/state-machine
「连接」负责连接两条不同链上的轻客户端。「通道」则是在这些不同链上的模块之间传输数据包的渠道。因此,连接是专用于链的,而通道是专用于模块的。每个通道端都有一个唯一的通道 ID(和一个端口 ID),用于在两个模块之间准确地路由数据包。
2. 应用层
应用层用于与终端用户进行交互。它由使用传输层构建的各种应用程序组成。传输层没有规定如何解析数据包,该角色由应用层执行。
IBC 支持多种应用场景,例如同质化/非同质化的资产传输、跨链预言机输入、跨链账户、跨链查询、费用支付中间件(用于激励中继器)等。
例如,用于资产传输的 IBC 用例——即跨链标准 20 (ICS 20)——规定了数据包的结构以及接收链解析数据包的方式。在其传输中,数据包包含有关发送者、接收者、denom 等信息。denom 字段跟踪特定资产到达某个链所经过的路径。ICS 20 还规定了有关如何处理数据包的逻辑。
跨链标准 20(ICS 20):
https://github.com/cosmos/ibc/blob/master/spec/app/ics-020-fungible-token-transfer/README.md
为更好理解 IBC,可以用邮件传递系统做类比。当发件人向某人发送一封邮件时,需要使用邮政服务收集包含信件的信封,并将其存入收件人的邮箱。然后收件人打开对应信封并阅读信件内容。IBC 的传输层可以看作是邮政服务。邮政服务不会规定信件的内容应该是什么,或者收件人应该如何解读用户的信息。
同样,传输层也不知道信封中的内容是什么。它只负责执行从 A 链收集信封,并将其发送到 B 链的动作。信封本身可以被认为是从一条链发送到另一条链的 IBC 数据包。在信封上,用户会指定收件人的地址。这类似于 IBC 数据包中含有的数据包发送者(由通道 ID 指定)和数据包的目标对象(由对手链通道 ID 指定)信息。最后,由接收者(应用程序)负责打开信封(数据包),并解析其中的内容。
IBC 的用途是什么?
除了上文中提到的转移用例,跨链账户和跨链安全也是两个 IBC 应用领域。
跨链账户能够促进无需切换界面的跨链交互。这实际上意味着 B 链(即「主链」)上能够执行的任何操作,包括传输、委托或对治理提案进行投票,都可以通过 A 链(称为「控制链」)来执行。跨链账户通过改善用户体验显著提高了跨链生态内的可组合性。
跨链安全是 Cosmos 生态的共享安全版本。它使区块链能够完全以「选择加入(opt-in)」的方式从另一条链租用安全性。对于可以选择利用现有网络(例如 Cosmos Hub)所提供的安全性的新链来说,这一功能十分有用。跨链安全让区块链无需承担引导自己的验证人集的工作。
可以使用 IBC 作为核心基元(primitive)执行的应用范围不断扩大。跨链 NFT 传输功能和跨链查询功能(一条链可以从另一条链读取状态)也很快会进入生产完备状态。
IBC 能够解决什么问题?
总而言之,IBC 解决了区块链的孤岛困境以及交互有限的问题。区块链之间的互操作性对于实现最大的价值增长是必要的。
每个区块链都服务于一个或多个专有用例。如果这些用例不能跨多个区块链加以利用,则会严重限制它们的实用性。互联网带来的突破是信息可以轻松地在世界不同地区轻松流动。同样,不同区块链的效用也需要跨多个平台自由访达。
例如,用户可能想要利用不同区块链提供的隐私保护属性。区块链之间的互操作性可用于实现这些用例甚至更多功能。
IBC 不仅解决了互操作性问题,还同时实现了信任最小化、安全性、可扩展性和通用性。
作为应用开发者应该如何使用 IBC?
Cosmos SDK 的模块化特性使开发者不必关心一些抽象层,例如轻客户端、连接、证明的验证等。对于开发者来说,最需要熟悉的需求和功能是通道和端口。有关 IBC 的更多详细信息,可以参考 Cosmos 开发者门户。