Merkle Bridge的目標(biāo)是成為一個(gè)簡(jiǎn)單輕巧的協(xié)議,用于在區(qū)塊鏈之間資產(chǎn)轉(zhuǎn)移,同時(shí)提供分布式的監(jiān)管和審查阻力。第一個(gè)應(yīng)用程序是將Aergo ERC2
Merkle Bridge的目標(biāo)是成為一個(gè)簡(jiǎn)單輕巧的協(xié)議,用于在區(qū)塊鏈之間資產(chǎn)轉(zhuǎn)移,同時(shí)提供分布式的監(jiān)管和審查阻力。第一個(gè)應(yīng)用程序是將Aergo ERC20代幣轉(zhuǎn)移到Aergo的主網(wǎng)原生代幣。一旦部署了網(wǎng)橋,任何以太坊或Aergo資產(chǎn)都將可以在這些網(wǎng)絡(luò)之間直接轉(zhuǎn)移。在本文中,我們將介紹該協(xié)議的一些技術(shù)細(xì)節(jié)。
我們可以用以下兩種方式錨定(2WP)的資產(chǎn)轉(zhuǎn)移:首先在區(qū)塊鏈A上存入代幣,然后要將代幣轉(zhuǎn)移到區(qū)塊鏈B上,必須先將區(qū)塊鏈A上代幣進(jìn)行鎖定,并以1:1的比例在區(qū)塊鏈B上鑄造一個(gè)副本,最后副本區(qū)塊鏈B上銷(xiāo)毀后,才能解鎖區(qū)塊鏈A上的鎖定代幣。
維持固定匯率的簡(jiǎn)單方法是將資產(chǎn)鎖定在單個(gè)密鑰或多重簽名合同中(大多數(shù)交易所如何存儲(chǔ)資金)。
第一種情況(單個(gè)密鑰)不安全,因?yàn)槊荑€可能會(huì)被盜或丟失。
第二種情況(multisig)更安全,但是轉(zhuǎn)讓費(fèi)用昂貴,因?yàn)樗鼈兠看无D(zhuǎn)讓都需要鏈上進(jìn)行2/3簽名驗(yàn)證。讓每個(gè)傳輸進(jìn)行多重簽名處理也意味著很容易審查單個(gè)用戶(hù)的傳輸。還有其他更安全和無(wú)需信任的方法,例如ETH-ETC的平橋,但需要資本鎖定才能進(jìn)行抵押和削減。
我們的目標(biāo)是實(shí)現(xiàn)允許20多個(gè)驗(yàn)證者的分散資金鎖定/解鎖,但同時(shí)通過(guò)設(shè)計(jì)一種簡(jiǎn)單的協(xié)議(無(wú)需橋接操作員來(lái)處理單個(gè)轉(zhuǎn)賬),將橋接轉(zhuǎn)賬費(fèi)用保持在較低水平。
Merkle橋設(shè)計(jì)
Aergo Merkle橋可實(shí)現(xiàn)分散式保管和資產(chǎn)的有效鑄造。
權(quán)限證明(PoA)側(cè)鏈通常使用其狀態(tài)根在公共鏈上的錨定來(lái)提供可驗(yàn)證的真相來(lái)源。Merkle橋使用這些錨定狀態(tài)根來(lái)允許用戶(hù)提交側(cè)鏈狀態(tài)的證明。
資金保管
這種設(shè)計(jì)的安全性取決于錨定根的有效性。固定的區(qū)塊鏈狀態(tài)根包含鎖定和已用余額的信息,因此任何無(wú)效的狀態(tài)根都可用于竊取鎖定的用戶(hù)資金。
為了確保狀態(tài)根的有效性,錨定使用類(lèi)似于multisig oracle的簡(jiǎn)單形式的DAO(分散式自治組織)。該DAO的成員稱(chēng)為驗(yàn)證者。
驗(yàn)證者有以下職責(zé):
· 在將要錨定的根源上達(dá)成共識(shí)(因此它們必須是具有信譽(yù)的已知實(shí)體,以確保有效的錨定)。
· 同意驗(yàn)證者集更新建議(使用2/3當(dāng)前驗(yàn)證者的簽名添加或刪除驗(yàn)證者)。
· 同意Merkle橋設(shè)置更新建議(還需要獲得2/3驗(yàn)證者的批準(zhǔn)).
操作方式
提案人(愿意支付錨定費(fèi)的人)會(huì)定期在橋接鏈上發(fā)布橋接合約的狀態(tài)根。僅在狀態(tài)根已由2/3驗(yàn)證者簽名的情況下才會(huì)記錄。
然后,用戶(hù)錢(qián)包可以通過(guò)使用錨定狀態(tài)根驗(yàn)證其鎖定資產(chǎn)的Merkle證明來(lái)獨(dú)立鑄造目標(biāo)橋合約上的資產(chǎn)。
鎖定并跟蹤帳戶(hù)的總代幣余額。創(chuàng)建了包含此余額的Merkle證明,并且可以在橋的另一側(cè)鑄造該代幣余額。鑄造記錄了總的造幣余額,因此帳戶(hù)造幣的金額永遠(yuǎn)不會(huì)超過(guò)存入的金額。燒毀和解鎖余額也是使用相同的過(guò)程。
這種設(shè)計(jì)使合約的存儲(chǔ)管理和操作變得簡(jiǎn)單,因?yàn)樗恍枰涗泜鬏旊S機(jī)數(shù)或返回值。 局限性在于,隨著用戶(hù)數(shù)量和固定代幣數(shù)量的增長(zhǎng),Merkle證明的大小會(huì)增加(合約狀態(tài)樹(shù)會(huì)更深),從而使轉(zhuǎn)移變得更加昂貴。
使用Merkle Bridge將ERC20代幣從以太坊轉(zhuǎn)移到Aergo
優(yōu)點(diǎn):
· 驗(yàn)證者實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,因?yàn)樗鼈冎恍枰炇鹚鼈冋J(rèn)為有效的最終狀態(tài)根(通過(guò)在橋的兩邊運(yùn)行完整的節(jié)點(diǎn))。驗(yàn)證者不需要監(jiān)視和驗(yàn)證用戶(hù)的轉(zhuǎn)移。
· 用戶(hù)錢(qián)包直接通過(guò)網(wǎng)橋合同進(jìn)行轉(zhuǎn)賬,不需要驗(yàn)證者批準(zhǔn)。
· 錨定周期是靈活的,狀態(tài)根可以由許多驗(yàn)證器(20 +)簽名。
· 如果沒(méi)有超過(guò)2/3驗(yàn)證者共同認(rèn)可并廣播無(wú)效的側(cè)鏈狀態(tài)根,則不能任意審查代幣傳輸。
· 可以進(jìn)行小額轉(zhuǎn)賬,并且可以隨時(shí)鑄造/解鎖總存款余額。
· 鏈上的Merkle證明驗(yàn)證比簽名驗(yàn)證便宜。
· 任何新資產(chǎn)都可以通過(guò)網(wǎng)橋進(jìn)行轉(zhuǎn)移,而無(wú)需獲得驗(yàn)證者的批準(zhǔn)(由于在鑄造時(shí)會(huì)部署新的固定合約,因此第一次轉(zhuǎn)移的成本會(huì)更高)。
· 可以通過(guò)一次交易完成對(duì)另一個(gè)鏈上同一帳戶(hù)的多次轉(zhuǎn)賬,提取發(fā)送到該帳戶(hù)的總鎖定余額。
局限性:
· 一旦啟動(dòng),傳輸就應(yīng)該在網(wǎng)橋的另一端完成(沒(méi)有超時(shí)限制),但這意味著無(wú)法取消傳輸。
· 如果超過(guò)1/3的驗(yàn)證者停止合作,網(wǎng)橋?qū)o(wú)限期暫停(不可能有新的取款)。
部署
在此存儲(chǔ)庫(kù)中可以找到2個(gè)Aergo區(qū)塊鏈之間的Merkle橋的POC實(shí)現(xiàn):https://merkle-bridge.readthedocs.io
以太坊和Aergo區(qū)塊鏈之間的Merkle橋的POC實(shí)現(xiàn)可以在以下存儲(chǔ)庫(kù)中找到:https://eth-merkle-bridge.readthedocs.io
在此存儲(chǔ)庫(kù)中可以找到用于在以太坊和Aergo之間轉(zhuǎn)移資產(chǎn)的Javascript SDK:https://github.com/aergoio/eth-merkle-bridge-js?source=post_page-----32bd0f06c308----------------------
橋的操作員
他們要為橋接的每個(gè)區(qū)塊鏈運(yùn)行一個(gè)完整節(jié)點(diǎn)。 每隔固定的時(shí)間間隔(每10分鐘?),他們將獲得最新的最終狀態(tài)根,并將其注冊(cè)在橋合約的Root和Height狀態(tài)變量中的相反區(qū)塊鏈上。
橋操作員有2種類(lèi)型:廣播set_root()事務(wù)的建議者和為建議者請(qǐng)求的兩個(gè)橋接鏈狀態(tài)根簽名的驗(yàn)證器任何人都可以是提議者:橋合約只允許在錨定期之后發(fā)生且具有有效簽名的狀態(tài)根更新。驗(yàn)證者的數(shù)量可以根據(jù)所需的multisig安全性而變化,如果請(qǐng)求的狀態(tài)根有效,驗(yàn)證者會(huì)對(duì)其進(jìn)行簽名。
function newAnchor(
bytes32 root,
uint height,
uint[] memory signers,
uint8[] memory vs,
bytes32[] memory rs,
bytes32[] memory ss
) public {
require(height > _anchorHeight + _tAnchor, "Next anchor height not reached");
bytes32 message = keccak256(abi.encodePacked(root, height, _nonce, _contractId, "R"));
validateSignatures(message, signers, vs, rs, ss);
_anchorRoot = root;
_anchorHeight = height;
_nonce += 1;
emit anchorEvent(root, height);
}
操作員調(diào)用newAnchor(…)來(lái)錨定新的狀態(tài)根
橋驗(yàn)證者集更新:
如果2/3的當(dāng)前驗(yàn)證者同意新的驗(yàn)證者集,則可以定義新的驗(yàn)證者集。
function validatorsUpdate(
address[] memory newValidators,
uint[] memory signers,
uint8[] memory vs,
bytes32[] memory rs,
bytes32[] memory ss
) public {
// validators should not sign a set that is equal to the current one to prevent spamming
bytes32 message = keccak256(abi.encodePacked(newValidators, _nonce, _contractId, "V"));
validateSignatures(message, signers, vs, rs, ss);
_validators = newValidators;
_nonce += 1;
emit newValidatorsEvent(newValidators);
}
橋驗(yàn)證者集更新
版本2
在Merkle橋的版本2中,簽名驗(yàn)證將在單獨(dú)的Oracle合約中重構(gòu),該合約將對(duì)橋合約具有完全控制權(quán)。這樣可以升級(jí)oracle合同的共識(shí)機(jī)制,并為用戶(hù)轉(zhuǎn)移保留相同的橋接合約。 橋的安全屬性保持不變。
用戶(hù)資產(chǎn)轉(zhuǎn)移:
要傳輸代幣,用戶(hù)會(huì)將其鎖定在橋接合約中,并等待目標(biāo)區(qū)塊鏈上的下一個(gè)錨。
function lock(
string memory receiver,
uint amount,
IERC20 token
) public returns (bool) {
// Add locked amount to total
bytes memory accountRef = abi.encodePacked(receiver, token);
_locks[accountRef] += amount;
// Pull token from owner to bridge contract (owner must set approval before calling lock)
// using msg.sender, the owner must call lock, but we can make delegated transfers with sender
// address as parameter.
require(token.transferFrom(msg.sender, address(this), amount), "Failed to burn");
emit lockEvent(token, receiver, amount);
return true;
}
lock(…)記錄用戶(hù)存入的總余額。
用戶(hù)錢(qián)包將讀取目標(biāo)區(qū)塊鏈上的新錨定狀態(tài)根(Root,Height),并向該節(jié)點(diǎn)請(qǐng)求Merkle證明,包括該狀態(tài)根的鎖定余額。用戶(hù)的鎖定平衡被記錄在鎖狀態(tài)映射,其中鍵是用于一個(gè)令牌帳戶(hù)參考。 帳戶(hù)參考是用戶(hù)地址和令牌地址的串聯(lián)。 然后可以使用鎖定令牌的Merkle證明在目標(biāo)區(qū)塊鏈上進(jìn)行薄荷交易。 用戶(hù)的造幣金額不能超過(guò)合同所存入和記錄的總金額。
function mint(
address receiver,
uint balance,
string memory tokenOrigin,
bytes32[] memory mp, // bytes[] is not yet supported so we use a bitmap of proof elements
bytes32 bitmap,
uint8 leafHeight
) public returns(bool) {
require(balance>0, "Balance must be positive");
bytes memory accountRef = abi.encodePacked(receiver, tokenOrigin);
require(verifyMp("_sv__locks-", accountRef, balance, mp, bitmap, leafHeight), "Failed to verify lock proof");
uint mintedSoFar = _mints[accountRef];
uint amountToTransfer = balance - mintedSoFar;
require(amountToTransfer>0, "Lock tokens before minting");
MintedERC20 mintAddress = _bridgeTokens[tokenOrigin];
if (mintAddress == MintedERC20(0)) {
// first time bridging this token
mintAddress = new MintedERC20();
_bridgeTokens[tokenOrigin] = mintAddress;
_mintedTokens[address(mintAddress)] = tokenOrigin;
emit newMintedERC20(tokenOrigin, mintAddress);
}
_mints[accountRef] = balance;
require(mintAddress.mint(receiver, amountToTransfer), "Failed to mint");
emit mintEvent(mintAddress, receiver, amountToTransfer);
return true;
}
mint(…)驗(yàn)證存款的Merkle證明并鑄造正確數(shù)量的代幣。 如果從未鑄造過(guò)令牌,則部署新的固定代幣合約。
如果橋的操作員在用戶(hù)產(chǎn)生余額之前錨定了新的狀態(tài)根,則用戶(hù)的錢(qián)包可以為新錨定的狀態(tài)根簡(jiǎn)單地創(chuàng)建新的Merkle證明。
用戶(hù)的錢(qián)包在原始區(qū)塊鏈上解鎖代幣之前,會(huì)重復(fù)類(lèi)似的燒毀代幣的過(guò)程。
有關(guān)Merkle橋合約中的Merkle證明驗(yàn)證的詳細(xì)信息,請(qǐng)參閱:
[http://bitoken.world/?p=297](以太坊Patricia樹(shù)的Merkle證明驗(yàn)證 "http://bitoken.world/?p=297")
相關(guān)作品
Merkle Bridge采取的方法是盡可能使用最簡(jiǎn)單,最可靠的設(shè)計(jì),以使驗(yàn)證者無(wú)需就用戶(hù)轉(zhuǎn)移達(dá)成共識(shí),而是將所有資源集中在他們錨定的區(qū)塊鏈狀態(tài)根的有效性上。此外,用戶(hù)沒(méi)有完成轉(zhuǎn)賬的時(shí)間限制,并且可以通過(guò)一次交易完成對(duì)同一帳戶(hù)的多次轉(zhuǎn)賬。這是與以下協(xié)議的主要區(qū)別:
ICS(鏈間標(biāo)準(zhǔn))
其他項(xiàng)目,如cosmos ibc,則采用不同的方法,將所有單個(gè)跨鏈資產(chǎn)傳輸抽象為數(shù)據(jù)包(也可以支持契約調(diào)用),并且peg區(qū)域驗(yàn)證器在這些數(shù)據(jù)包上達(dá)成共識(shí)。這是一種非常有趣的方法,可以減少對(duì)跨鏈資產(chǎn)的信任,但當(dāng)peg驗(yàn)證器鎖定的資金的價(jià)值超過(guò)所涉原子的價(jià)值時(shí),這種設(shè)計(jì)也最終依賴(lài)于驗(yàn)證器的聲譽(yù)時(shí),就會(huì)產(chǎn)生問(wèn)題。
需要注意的是,為了連接比特幣和EOS這樣的區(qū)塊鏈,將存款事件轉(zhuǎn)發(fā)到傳輸代幣上是必要的,而EOS并不是Merkelize狀態(tài)。
Plasma
Merkle橋的設(shè)計(jì)靈感來(lái)自對(duì)Plasma的研究,并解決了在Plasma上運(yùn)行合約的問(wèn)題。Merkel橋并不是Plasma的,因?yàn)樗痪哂邢嗤陌踩裕簺](méi)有退出提示可以挑戰(zhàn)來(lái)自側(cè)鏈的退出,并且提款必須在側(cè)鏈上進(jìn)行。 Merkle橋的安全性取決于錨定驗(yàn)證者的分散性。
由于可以為單個(gè)狀態(tài)根進(jìn)行無(wú)限數(shù)量的傳輸,因此該狀態(tài)根所需的簽名數(shù)量可能很高。用戶(hù)無(wú)需關(guān)注區(qū)塊鏈上的無(wú)效提款和大規(guī)模退出情況,而應(yīng)該信任去中心化的驗(yàn)證者。同樣在POA企業(yè)側(cè)鏈的情況下,我們通常會(huì)假設(shè)共識(shí)安全性,因此可以在側(cè)鏈上初始化提款是可以接受的,并且側(cè)鏈運(yùn)營(yíng)商不需要監(jiān)視父級(jí)掛鏈的退出。
結(jié)論
Merkle橋由一個(gè)簡(jiǎn)單的DAO(multisig oracle)組成,用于驗(yàn)證錨,更新驗(yàn)證者集和橋設(shè)置。用戶(hù)錢(qián)包可以獨(dú)立創(chuàng)建其鎖定/燒毀余額的Merkle證明,以進(jìn)行跨鏈轉(zhuǎn)移,而無(wú)需驗(yàn)證者觀看轉(zhuǎn)移事件。
EthAergo網(wǎng)橋?qū)⒂糜谠贏ergo和以太坊主網(wǎng)之間發(fā)送AergoERC20和任何其他代幣。
AERGO-AERGO橋接器將被企業(yè)側(cè)鏈的用戶(hù)用于以一種成本高效和安全的方式在AERGO主網(wǎng)之間轉(zhuǎn)移他們的資產(chǎn)。
這使MakerDAO的DAI穩(wěn)定幣和其他任何ERC20等令人興奮的應(yīng)用程序都可以供Aergo主網(wǎng)用戶(hù)使用,并由Merkle橋錨定保護(hù)。(鏈三豐)
關(guān)鍵詞: Merkle Bridge 區(qū)塊鏈 資產(chǎn)轉(zhuǎn)移