跨链五部曲之:IBC

中最令人兴奋的特色是(IBC) 协议,允许不同区块链之间进行资产转移。IBC 已经实现为一个 basecoin 插件,本节我将介绍如何使用它进行不同区块链间的资产互转。

IBC

IBC 的目的是让区块链彼此之间充当一个轻量级的客户端。由于我们使用经典的拜占庭一致性容错算法,在客户端上进行验证是简单可行的:只须校验最新块的签名并验证 ABCI 应用的默克尔树根。

在共识引擎中,多个校验节点在处理新的区块之前会先达成一致。这意味着在下一个区块来临之前,当前区块的签名及其根状态不会加入到区块链中。每个区块包含一个(用于确认前一个区块的投票信息)和(在区块头部,指处理完前一个区块的交易后的默克尔树根的 hash)。

因此,如果我们要从高度验证,我们需要高度节点的的签名(请记住:只包含了从叶子节点到高度节点的所有交易结果)。

不像,轻量级客户端协议不需要下载并检查所有区块链节点的头部信息,客户端总是能够直接跳跃到最新的头部,只要 validator 节点集还没有变更。如果 validator 节点集发生了变动,客户端需要跟踪这些变化,这个时候才需要从变更点开始下载所有区块点头部。这里,简单起见,我们假设这些 validator 节点集是静态不变的。

现在,让我们来演示 IBC 是如何工作的。假设我们有两条链:chain1 和 chain2,从 chain1 发送数据到 chain2,我们需要这么几个步骤:

在 chain2 上注册 chain1 的信息(chainID、genesis 配置等)

在 chain1 上,广播一条将要外发给 chain2 的 IBC 交易

广播一条交易给 chain2 告诉它 chain1 的最新状态(header和commit信息)

chain1 向 chain2 发送 IBC 交易(区块高度、数据以及并默克尔证明),由于 chain2 已经知道了 chain1 的最新状态,它只需验证这个默克尔证明就可以了。

最重要的部分是:

在 chain2 上更新 chain1 的最新的状态,然后 chain1 向 chain2 发出 Merkle proof:我的数据包确实已经发出来了。

上述每一步都包含一种 IBC 交易类型,让我们地来看一下:

IBCRegisterChainTx

用来注册一条链到另外一条链上。

对于给定的,该类型交易只能发送一次,重复发送将返回错误。

IBCUpdateChainTx

用于在其它链上更新当前链的信息。

IBCPacketCreateTx

用来创建一个将要外发给其他链的交易。

IBCPacketPostTx

用来向外发送交易到另外一条链。

IBC State

了解完跟跨链相关的交易类型,来看看 state。每条链都会在默克尔树中存储关于 IBC 的 state,对于当前链来说,它记录的每条注册到它上面的其它链的信息包括:

Genesis configuration

Latest state

Headers for recent heights

当然,还会记录所有它收到() 和外发()的交易(packet)。

每当一笔提交交易,这条链的会相应地更新它的 state, 每当创建一笔交易,新的 packet 数据会添加到state 中,每当接收到一笔交易并验证通过了 proof 后,新的 packet 数据会添加到state 中。

Relay

由于我们内部需要这些跟跨链相关的交易,以便在不同链之间以一种安全的方式来跟踪所有 proof,为了让整个流程显得流畅自然,我们可以运行一个程序来处理这些跟跨链相关的交互操作。

在本例中,只需要 2 步:

:每条链都在上面注册好另外一条链,并确保彼此可以发送和接收交易。

:长轮询,不断地从一条链上拉取跨链交易并转发到另外一条链上。

前提是:relay 程序必须有权限读写这些链的账户及资产信息,因为发送 IBC 交易需要支付一定的 Fee。

Try it out

有了前面这些知识做铺垫,现在,让我们来真实地体验下跨链交易:

Preliminaries

为了方便后续操作,先设置好一些环境变量和命令行别名:

设置两条链的 chainID

由于我们是在一个机器上运行两条基于的区块链,我们需要给两条链设置不同的端口:

Setup Chain 1

创建两个链的账户:

初始化这条链,它会给账户打很多钱:

启动 basecoin 区块链:

跑起来了,你可以通过实时查看它的日志。

接下来,我们将 basecli 客户端连接上,验证的最新状态,下面第一个账户应该显示有钱,第二个显示没钱。

Setup Chain 2

设置跟步骤类似:

准备创世块,启动节点:

我们将 basecli 客户端连接上,验证的最新状态,同样,下面第一个账户应该显示有钱,第二个显示没钱。

Connect these chains

OK,现在我们有两条独立的 basecoin 区块链在运行,让我们启动程序把它们串联起来,让它们可以彼此发送交易给对方。

账户需要有余额来支付 IBC 消息,因此,我们需要先往账户充值部分钱。

一切准备就绪,启动程序:

Sending cross-chain payments

好了,和通过 IBC 协议彼此连接好,跨链中最艰巨的部分已经完成,现在,就是见证跨链交易奇迹的时刻:

Conclusion

本节我们详细阐述了 IBC 的工作机制,并演示了如何利用它在链间通信,并手把手教你进行跨链交易。其中,IBC 最核心的部分是:

在 chain2 上更新 chain1 的最新的状态,然后 chain1 向 chain2 发出 Merkle proof:我的数据包确实已经发出来了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180521G14B6400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券