
同构跨链怎么实现?
由于 Tendermint 采用 PBFT+POS 共识算法,每个区块都是经过全网 ⅔ 节点签名过的,所以得到 Validator 信息就可以通过对区块头进行校验来验证这个区块头是不是某一个链中的合法区块。ChainA,ChainB 都是用 Tendermint 开发的链,现在 ChainA,ChainB 之间需要进行跨链资产转移,第一步A,B 两个链之间会相互进行注册,在注册的过程中,A,B 两个链会将各自的创世区块以及 ChainID(用于表示不同链)发送给对方,由于创世区块中含有 Validator 信息,所以通过注册后 A,B 两个链会有对方链的 Validator 信息,以及区块头信息。
为了将 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 链开始执行相关操作(在B链是生成相关资产等)

同构跨链实现方法
type IBCRegisterChainTx struct {
BlockchainGenesis
}
type BlockchainGenesis struct {
ChainID string
Genesis string
}type IBCUpdateChainTx struct {
Header tm.Header
Commit tm.Commit
// TODO: NextValidators
}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
}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证明
}
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
}// 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

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

#hub 工作方式
总结

想了解更多有关 PPIO 的信息,可以移步官网:pp.io
