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交易被提交,链的状态会被