跨链系统构建-basecoin的IBC

basecoin的IBC

一、概述

cosmos网络中最重要的功能实现是InterBlockchainCommunication(IBC),IBC协议支持不同区块链之间的互操作性。cosmos网络将IBC作为一个basecoin插件实现,我们将使用cosmos来跨区块链发送token。

IBC插件定义了一组交易集合作为AppTx的子类型,要使用这个插件,需要设置AppTx.Name为“IBC“,同时需要设置data域为序列化的IBC交易类型。

二、IBC

IBC的目的是使一个区块链能够作为另一个区块链的轻客户端,由于我们使用的是经典的PBFT算法,因此轻客户端验证成本低且简单:因为需要做的就是检查最新块上的验证者签名并验证merkle证明。

在tendermint中,验证者在处理一个节点之前需要共识,这意味着区块签名和区块状态根不会包含在当前这个区块中,而是下一个区块中,这样每个区块包含一个叫做lastcommit的域,包含了前一个区块的commit,区块头还包含一个叫做apphash的域,是merkle的根hash。所以如果我们想验证高度H的区块的apphash,我们需要区块高度H+1的lastcommit中的签名。

轻客户端协议不需要下载一个区块链所有的区块头,客户端总是维护最新的区块头,只要验证者没有变动。如果验证者有变动,客户端需要跟踪这些变动,需要下载每个区块的头,因为签名有变动。

现在我们可以准确描述出IBC的工作原理,假如我们有两个链chain1和chain2,我们想要从chain1发送一些数据到chain2,大概的工作流程如下:

1. 在chain2上注册chain1的详细信息(如chainID,genesis配置)

2. 在chain1上收到一个交易,需要进行IBC,目标地址为chain2

3. 向chain2同步chain1最新的状态(区块头信息,commit签名)

4. chain1将IBC数据包发送到chain2,包括在chain1上已经提交的交易的证明,chain2可以验证该交易因为其包含了当前的区块头和commit

以上每一步都需要一个IBC的交易:

1. IBCRegisterChainTx

type IBCRegisterChainTx struct { BlockchainGenesis }
type BlockchainGenesis struct { ChainID string Genesis string }

IBCRegisterChainTx用于在另一条链上注册当前链,包含了需要注册的链的chainID和genesis配置,这个交易仅仅发送一次,多次发送将给出error的response。

2. IBCUpdateChainTx

type IBCUpdateChainTx struct {
  Header tm.Header
  Commit tm.Commit
}

IBCUpdateChainTx用于在另一条链上更新当前链的状态,包含了区块头和commit的签名数据,后续会包含验证者的变动信息,任何人都可以转发IBCUpdateChainTx,就像发送固定频率的链状态更新包和验证者变动包一样。

3. IBCPacketCreateTx

type IBCPacketCreateTx struct {
  Packet
}

type Packet struct {
  SrcChainID string
  DstChainID string
  Sequence   uint64
  Type string
  Payload    []byte
}

IBCPacketCreateTx用于创建一个跨链通信的数据包,包含了源chainID和目标chainID、包类型、和payload。

payload数据格式还没有定义,可以是任意的字节。

这个IBC交易主要用于以下场景:

chain2在chain1上有一个账户,在chain1上使用IBCPacketCreateTx发送资金到这个账户,这样我们可以给chain2证明在chain1链上已经有到其账户的一个交易,这些资金只能被chain2到chain1的IBC消息解锁,消息需要指定发送锁定的资金到chain1的另一个账户上。

4. IBCPacketPostTx

type IBCPacketPostTx struct {
  FromChainID     string // The immediate source of the packet, not always Packet.SrcChainID
  FromChainHeight uint64 // The block height in which Packet was committed, to check Proof Packet
  Proof *merkle.IAVLProof
}

IBCPacketPostTx用于从一个链发送IBC包到另一个链,包含了另一个链的交易数据和当前链上已经commit的交易的验证信息。

交易的验证信息是IAVL树的一个merkle验证,IAVL树是一个平衡二叉搜索树,包含了节点列表,这些节点通过hash到最后形成一个merkle根hash,这个hash一定和高度H+1的区块的头中AppHash匹配。

三、IBC State

我们已经分析了所有的交易类型,接下来看看状态,每个链在merkle树中存储了一些IBC状态,被跟踪的每条链,我们需要存储:

1. genesis配置

2. 最新的状态

3. 当前高度的header

我们还需要存储所有incoming包和outgoing包。

每当一个IBCUpdateChainTx交易被提交,链的状态会被

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值