0%

Cosmos跨链协议

跨链交互根据所跨越的区块链底层技术平台的不同可以分为同构链跨链和异构链跨链:同构链之间安全机制、共识算法、网络拓扑、区块生成验证逻辑都一致,它们之间的跨链交互相对简单。而异构链的跨链交互相对复杂,比如比特币采用PoW算法而Tendermint采用PBFT共识算法,其区块的组成形式和确定性保证机制均有很大不同,直接跨链交互机制不易设计。异构链之间的跨链交互一般需要第三方辅助服务辅助跨链交互。

同构跨链怎么实现?

基于Tendermint开发的链都可以用同构跨链,cosmos中同构链之间进行资产转移的原理如下。

由于Tendermint采用PBFT+POS共识算法,每个区块都是经过全网2/3节点签名过的,所以得到Validator信息就可以通过对区块头进行校验来验证这个区块头是不是某一个链中的合法区块。ChainA,ChainB都是用Tendermint开发的链,现在ChainA,ChainB之间需要进行跨链资产转移,A,B两个链之间会相互进行注册,在注册的过程中,A,B两个链会将各自的创世区块以及ChainID(用于表示不同链)发送给对方,由于创世区块中含有Validator信息,所以通过注册后A,B两个链会有对方链的Validator信息,以及区块头信息。

现在A中的资产需要向B中转移,首先发送一个跨链交易package到A中,A执行这个packageTx,将相关的资产进行销毁或锁定,接下来将packageTx写入egress中,,egress可以看成是一个信箱,所有向外部通知的跨链交易的都放入到egress中。

为了将A链中发生的事件通知给B链,需要一个relayer,relayer是一个中继程序负责将A链中egress中的跨链消息转发给B链,relayer查询 A 链中 egress 中的packageTx,并获取packageTx的Merkle Proof,将这些信息打包成 IBCPacketPostTx 交易发送到 B 链上,并查询 packageTx 所在的区块头信息,将区块头信息打包成 IBCUpdateChainTx 发送到 B 链上, 注意这里 relayer是需要支付 IBCPacketPostTx,IBCUpdateChainTx 执行的交易费用的。

B链接收到IBCPacketPostTx交易后开始执行,首先通过A链中的Validator校验IBCUpdateChainTx中的区块头是否是A链的,然后校验IBCPacketPostTx中跨链交易的Merkle proof是否等于IBCUpdateChainTx中的区块头hash。当所有校验全部通过时B链开始执行相关操作。

ibc_process

同构跨链实现方法

跨链协议

cosmos中的跨链是通过IBC协议实现,cosmos中一共定义以下几个IBC协议包:IBCRegisterChainTx,IBCUpdateChainTx,IBCPacketCreateTx,IBCPacketPostTx。

IBCRegisterChainTx

在跨链开始用来注册,并发送创世区块,Validator给对方,这个只能执行一次,多次执行会报错。

1
2
3
4
5
6
7
8
9
type IBCRegisterChainTx struct {
BlockchainGenesis
}

type BlockchainGenesis struct {
ChainID string
Genesis string
}

IBCUpdateChainTx

向另外一个链推送当前链上区块最新信息,区块高度,区块头信息。

1
2
3
4
5
type IBCUpdateChainTx struct {
Header tm.Header
Commit tm.Commit
// TODO: NextValidators
}

IBCPacketCreateTx

当链收到这个交易包时会执行跨链交易,并将在egress中放入相关信息。

1
2
3
4
5
6
7
8
9
10
11
type IBCPacketCreateTx struct {
Packet
}

type Packet struct {
SrcChainID string
DstChainID string
Sequence uint64
Type string // redundant now that Type() is a method on Payload ?
Payload Payload
}

IBCPacketPostTx

这个包中包含跨链交易执行后的Merkle proof,由relayer发送给另外一个链。

1
2
3
4
5
6
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 // Merkle证明
}

plugin

那么如何执行这些跨链协议,从上面协议的定义可以看出,这些协议包其实都是一个交易,Tendermint为了方便我们扩展,Tendermint中有一个插件模块,我们可以实现plugin中接口,在ibc插件中执行跨链交易。

plugin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
type Plugin interface {

// Name of this plugin, should be short.
Name() string

// Run a transaction from ABCI DeliverTx
RunTx(store KVStore, ctx CallContext, txBytes []byte) (res abci.Result)

// Other ABCI message handlers
SetOption(store KVStore, key, value string) (log string)
InitChain(store KVStore, vals []*abci.Validator)
BeginBlock(store KVStore, hash []byte, header *abci.Header)
EndBlock(store KVStore, height uint64) abci.ResponseEndBlock
}

上面的代码时plugin接口的定义,可以看出plugin与abci接口很类似,所以在deliverTx时将ibc交易交给plugin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// ABCI::DeliverTx
func (app *BaseApp) DeliverTx(txBytes []byte) (res abci.Result) {
// Exec tx
switch tx := tx.(type) {
case *types.SendTx:
// 执行正常交交易
case *types.AppTx:
// 执行plugin中的交易
plugin := pgz.GetByName(tx.Name)
res = plugin.RunTx(cache, ctx, tx.Data)
return res

default:
return abci.ErrBaseEncodingError.SetLog("Unknown tx type")
}
return res
}

异构跨链PegZone

对于bitcoin,ethereum这类使用POW共识算法的链,如何与使用Tendermint的IBC协议进行跨链操作呢?由于这些链采用的POW算法那么我们无法通过Validator对这些链的区块头进行校验,进而无法使用Merkle proof来证明这些链上的跨链交易的合法行。其次POW共识算法产生的区块是属于概率最终性的,又被回滚的可能性,在进行跨链时我们需要保证跨链的交易是最终确定的且不会被回滚的。

基于以上几点考虑,我们采用PegZone方案来进行异构跨链,PegZone本身其实是一条用Tendermint开发的代理链,实时跟踪原始链的状态,通过设定一个安全阀值,等待原始链区块增长数达到安全阀值时就认为原始链的状态达到了伪实时最终性(回滚概率小),这点和轻客户端钱包验证是相同的原理,例如比特币安全阀值通常设置为6,以太坊安全阀值可以设置为20或者100。而PegZone本身具备实时最终性,就可以通过IBC与Hub相连,从而实现跨链。

接下来还是用例子来说明下,以Ethereum为例来看,有兴趣的朋友可参考Github上的cosmos/Peggy项目。示意图如下:

pegzone

上图我们可以看出PegZone可以分为5个部分:

  • Smart Contract:资产托管的角色,保管以太坊中的代币和Cosmos中的代币。主要提供了lock、unlock、mint、burn四个方法。
  • Witness:是一个以太坊全节点,监听以太坊合约的event,并等待100个区块产生后,封装WitnessTx提交到PegZone中来证明在以太坊内状态更改。
  • PegZone:PegZone是基于Tendermint的区块链,负责维护用户的账户信息,允许用户之间资产的转移,并提供交易查询。
  • Signer:使用secp256k1对交易进行签名,以便签名能够高效的被智能合约验证,对应于智能合约的校验者公钥集合。
  • Relayer: 中继器负责交易转发。将所有Signer签名后的SignTx转发到smart contract中。

cosmos hub的作用

在cosmos中自带的basecoin跨链demo中,两个链ChainA,ChainB,这两个链之间进行跨链,A,B两个链之间相互发送IBCRegisterChainTx进行注册。在跨链的时候直接发送IBC协议包,进行资产跨链操作。这种直接连接的方式会有个问题,随着接入到网络中Zone(zone是一个独立的区块链)的数量上升,以直连方式实现通信会导致链路数量呈平方级上升。以100个Zone接入到网络中为例,如果各个Zone直接都要建立起IBC连接,则网络中需要有n(n-1)/2=4950 条通信链路!如此快速的增长显然会令网络不堪重负。

通过hub就可以解决连接爆发增长的问题,所有的zone都向hub进行注册,向hub发送IBC包。

hub

hub工作方式

hub管理着许多zone,所有的zone都需要向hub进行注册,由hub追踪各个zone的状态,每一个zone不停地把自身产出的新区快信息汇报给hub,同时每一个zone也需要同步hub的状态。每一个zone之间不是直接进行通信,而是通过向hub发送IBC间接进行通信。

Hub与Zone直接通信,而Zone与Zone之间通过IBC间接通信。当Zone对 Hub建立起一个IBC连接,它可以自动访问其他连接到该Hub上的Zone ,这意味着Zone无需与其他Zone连接,而仅仅连接到Hub上即可。

当一个Zone通过Hub收到来自其他Zone的代币时,它只需要信任Hub以及代币来源的Zone,而不需要信任网络中所有其它的Zone 。