如何實(shí)現(xiàn)跨鏈之間相互通信
跨鏈作為區(qū)塊鏈一種不可或缺的技術(shù),我們研究跨鏈,以更好地了解區(qū)塊鏈之間是如何相互通信。
最初構(gòu)建區(qū)塊鏈時(shí),他們?cè)O(shè)想能夠提供“一刀切”的解決方案,這意味著所有交易,智能合約或其他任何事物都在單個(gè)鏈上執(zhí)行。 但是,現(xiàn)在很明顯,這樣的系統(tǒng)不太實(shí)用,尤其是在存在可伸縮性限制和創(chuàng)新約束的情況下。
跨鏈?zhǔn)莾蓚€(gè)相對(duì)獨(dú)立的區(qū)塊鏈之間的互操作性。換句話說(shuō),由于區(qū)塊鏈?zhǔn)且詷?biāo)準(zhǔn)化的方式構(gòu)建的,因此它允許區(qū)塊鏈彼此通信??珂湆?shí)施主要以資產(chǎn)交換和資產(chǎn)轉(zhuǎn)移為代表,既是區(qū)塊鏈?zhǔn)澜绲闹匾M成部分,也是PPIO的重要研究方向。使用交叉鏈,可以避免單鏈的局限性。今天,我們將探討Cosmos跨鏈協(xié)議的邏輯結(jié)構(gòu)。
根據(jù)不同的基礎(chǔ)技術(shù),跨鏈的相互作用可以分為同構(gòu)的跨鏈和異類的跨鏈。對(duì)于同構(gòu)鏈,安全機(jī)制,共識(shí)算法,網(wǎng)絡(luò)拓?fù)浜蛪K生成驗(yàn)證邏輯是一致的,它們之間的跨鏈交互相對(duì)簡(jiǎn)單。
另一方面,異構(gòu)鏈的跨鏈交互相對(duì)復(fù)雜,并且包括諸如針對(duì)比特幣的PoW算法和針對(duì)Tendermint的PBFT共識(shí)算法之類的技術(shù)。區(qū)塊組成和確定性保證機(jī)制差異很大,因此直接設(shè)計(jì)跨鏈交互機(jī)制并不容易。異構(gòu)鏈之間的跨鏈交互通常需要第三方輔助服務(wù)。
如何實(shí)現(xiàn)跨鏈同構(gòu)?
基于Tendermint開(kāi)發(fā)的鏈可以采用同構(gòu)跨鏈。 Cosmos中同構(gòu)鏈之間的資產(chǎn)轉(zhuǎn)移原理如下。
由于Tendermint使用PBFT+POS共識(shí)算法,因此只有在2/3個(gè)驗(yàn)證者同意的情況下,才會(huì)將區(qū)塊提交到網(wǎng)絡(luò)??梢酝ㄟ^(guò)檢查區(qū)塊頭以驗(yàn)證區(qū)塊頭在特定鏈中是否合法來(lái)驗(yàn)證驗(yàn)證器信息。例如Tendermint正在開(kāi)發(fā)兩條鏈:鏈A和鏈B?,F(xiàn)在假設(shè)資產(chǎn)需要在鏈上轉(zhuǎn)移。首先,兩個(gè)鏈A和B將相互注冊(cè)。在注冊(cè)過(guò)程中,A和B認(rèn)識(shí)到它們的獨(dú)立性。然后鏈將相互發(fā)送各自的創(chuàng)世塊和ChainID(用于表示不同的鏈)。由于創(chuàng)世塊包含驗(yàn)證者信息,因此在注冊(cè)后,A和B鏈將具有另一條鏈的驗(yàn)證者信息以及區(qū)塊頭信息。
現(xiàn)在,需要將A中的資產(chǎn)轉(zhuǎn)移到B。首先用戶可以將跨鏈交易包Tx發(fā)送到A。A執(zhí)行packageTx,銷毀或鎖定相關(guān)資產(chǎn),然后將packageTx寫(xiě)入出口。出口可視為放置所有外部通知的跨鏈交易的郵箱。
為了將在鏈A中發(fā)生的事件通知鏈B,需要一個(gè)中繼器。中繼器負(fù)責(zé)將跨鏈消息從鏈A的出口轉(zhuǎn)發(fā)到鏈B的出口。在這種情況下,中繼器在鏈A的出口中查詢packageTx,并獲得packageTx的Merkle證明。該信息被打包到IBC Package PostTx事務(wù)中并發(fā)送到鏈B,鏈B查詢關(guān)于packageTx位置的區(qū)塊頭信息。它還將區(qū)塊頭信息打包到IBCUpdate Chain Tx中,并將其發(fā)送到鏈B。注意中繼器支付了IBC Package PostTx和IBCUpdate Chain Tx的交易成本。
鏈B接收到IBCPacketPostTx事務(wù)后,它首先通過(guò)該鏈中的驗(yàn)證器檢查IBCUpdateChainTx中的區(qū)塊頭是否為鏈A的一部分,然后驗(yàn)證IBCPacketPostTx中跨鏈?zhǔn)聞?wù)的Merkle證明是否等于該區(qū)塊IBCUpdateChainTx中的頭哈希。當(dāng)所有支票都通過(guò)時(shí),B鏈開(kāi)始執(zhí)行相關(guān)操作(對(duì)于B鏈,這意味著生成相關(guān)資產(chǎn)等)。
同構(gòu)跨鏈實(shí)現(xiàn)方法
Cosmos中的跨鏈由IBC協(xié)議實(shí)現(xiàn)。 Cosmos生態(tài)系統(tǒng)中定義了以下IBC協(xié)議軟件包:IBCRegisterChainTx,IBCUpdateChainTx,IBCPacketCreateTx,IBCPacketPostTx。
IBCRegisterChainTx
在跨鏈的開(kāi)頭使用以下代碼注冊(cè)和發(fā)送創(chuàng)世紀(jì)區(qū)塊。驗(yàn)證者會(huì)將其交給另一方。此代碼只能執(zhí)行一次,多次執(zhí)行將報(bào)告錯(cuò)誤。
type IBCRegisterChainTx struct {
BlockchainGenesis
}
type BlockchainGenesis struct {
ChainID string
Genesis string
}
IBCUpdateChainTx
用于將當(dāng)前鏈上的最新區(qū)塊信息,區(qū)塊高度和區(qū)塊頭信息傳輸?shù)搅硪粋€(gè)鏈。
type IBCUpdateChainTx struct {
Header tm.Header
Commit tm.Commit
// TODO: NextValidators
}
IBCPacketCreateTx
當(dāng)鏈條接收到交易包時(shí),它將執(zhí)行跨鏈交易并將相關(guān)信息放入出口。
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
跨鏈交易執(zhí)行后,此軟件包包含Merkle證明,然后由中繼器將其發(fā)送到另一個(gè)鏈。
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
從上面的協(xié)議我們可以看到,這些協(xié)議包實(shí)際上是一個(gè)事務(wù)。Tendermint有一個(gè)plugin模塊,以方便我們擴(kuò)展。 我們可以在plugin中實(shí)現(xiàn)接口,并使用IBC plugin執(zhí)行跨鏈交易。
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接口非常相似,因此IBC事務(wù)在deliverTx處交給了該plugin。
// ABCI::DeliverTx
func (app *BaseApp) DeliverTx(txBytes []byte) (res abci.Result) {
// Exec tx
switch tx := tx.(type) {
case *types.SendTx:
// 執(zhí)行正常交交易
case *types.AppTx:
// 執(zhí)行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
}
異構(gòu)跨鏈PegZone
對(duì)于使用POW共識(shí)算法的鏈,例如比特幣和以太坊,它們?nèi)绾问褂肨endermint的IBC協(xié)議跨鏈運(yùn)作?由于這些鏈中使用了POW算法,因此我們無(wú)法通過(guò)驗(yàn)證器驗(yàn)證這些鏈的區(qū)塊。我們也無(wú)法使用Merkle證明來(lái)證明這些鏈上跨鏈交易的合法性。此外,POW共識(shí)算法生成的區(qū)塊是概率性最終的,并且有可能被回滾。我們需要確??珂溄灰资钦嬲淖罱K交易,并且不會(huì)回滾。
基于以上考慮,我們使用PegZone方案執(zhí)行異構(gòu)跨鏈。PegZone本身實(shí)際上是Tendermint開(kāi)發(fā)的代理鏈,它實(shí)時(shí)跟蹤原始鏈的狀態(tài),并設(shè)置安全閾值以等待原始鏈塊的增長(zhǎng)。當(dāng)數(shù)字達(dá)到安全閾值時(shí),原始鏈狀態(tài)被視為具有偽實(shí)時(shí)終結(jié)性(回滾概率?。@與輕客戶端錢(qián)包驗(yàn)證的原理相同。例如比特幣安全閾值通常設(shè)置為6,而ETF安全閾值可以設(shè)置為20或100。PegZone本身具有實(shí)時(shí)確定性,可以通過(guò)IBC連接到Cosmos Hub以實(shí)現(xiàn)跨鏈。
下圖使用PegZone或Peggy以及以太坊作為跨鏈接的示例。
從上圖可以看出,PegZone可分為五個(gè)部分:
1. smart contract:資產(chǎn)托管在以太坊和Cosmos中代幣托管中的作用。它主要提供四種方法:鎖定,解鎖,鑄造和銷毀。
2. witness:這是一個(gè)完整的以太坊節(jié)點(diǎn),它監(jiān)視以太坊合約的事件并等待生成100個(gè)區(qū)塊。封裝的見(jiàn)證人Tx被提交給PegZone以證明以太坊區(qū)塊鏈上的狀態(tài)變化。
3. PegZone:PegZone是基于Tendermint的區(qū)塊鏈,可維護(hù)用戶帳戶信息,允許用戶之間進(jìn)行資產(chǎn)轉(zhuǎn)移并提供交易查詢。
4. signer:Secp256k1用于簽名交易,以便可以通過(guò)智能合約有效地驗(yàn)證簽名;這對(duì)應(yīng)于智能合約的驗(yàn)證者公鑰集。
5. relay:relay負(fù)責(zé)所有事務(wù)轉(zhuǎn)發(fā)。該角色將已簽名的SignTx轉(zhuǎn)發(fā)到智能合約。
Cosmos Hub角色
在Cosmos中的basecoin跨鏈演示中,兩個(gè)鏈(鏈A和鏈B)被跨鏈接,并相互發(fā)送IBC注冊(cè)鏈Tx進(jìn)行注冊(cè)。 跨鏈時(shí),將直接發(fā)送IBC協(xié)議包以執(zhí)行資產(chǎn)的跨鏈操作。但是這種直接連接有問(wèn)題。隨著訪問(wèn)網(wǎng)絡(luò)的區(qū)域(相當(dāng)于一個(gè)獨(dú)立的區(qū)塊鏈)的數(shù)量增加,如果直接實(shí)現(xiàn)通信,鏈接的數(shù)量將以平方的順序增加。以連接到網(wǎng)絡(luò)的100個(gè)區(qū)域?yàn)槔?果每個(gè)區(qū)域直接需要建立IBC連接,則網(wǎng)絡(luò)需要n(n-1)/ 2 = 4950個(gè)通信鏈路。如此快速的增長(zhǎng)顯然將壓倒整個(gè)網(wǎng)絡(luò)。
Hub的概念可以解決有關(guān)此問(wèn)題的問(wèn)題。在Cosmos生態(tài)系統(tǒng)中,所有區(qū)域都將注冊(cè)并向集線器發(fā)送IBC軟件包。
Hub運(yùn)行模式
Hub管理許多區(qū)域。所有區(qū)域都需要向Hub注冊(cè)。Hub跟蹤每個(gè)區(qū)域的狀態(tài)。每個(gè)區(qū)域?qū)⑵洚a(chǎn)生的所有新區(qū)塊信息報(bào)告給Hub。同時(shí)每個(gè)區(qū)域還需要同步Hub的狀態(tài)。每個(gè)區(qū)域不是通過(guò)區(qū)域之間直接通信,而是通過(guò)將IBC發(fā)送到Hub進(jìn)行間接通信。
當(dāng)區(qū)域建立與Hub的IBC連接時(shí),它可以自動(dòng)訪問(wèn)連接到Hub的其他區(qū)域,這意味著一個(gè)區(qū)域不需要連接到其他區(qū)域。
當(dāng)一個(gè)區(qū)域從連接到Hub的另一個(gè)區(qū)域接收令牌時(shí),它只需要信任Hub和該區(qū)域,而不必信任網(wǎng)絡(luò)中的所有其他區(qū)域。