彩虹橋:連線以太坊和NEAR的橋樑

買賣虛擬貨幣
區塊鏈專案和相應的擴容方案層出不窮,普通人在開發產品的過程中很難判斷哪種方案更適合自己。特別是當其中涉及繫結資產或資料的時候,這一點會表現的十分明顯。 理想情況下,我們並不想繫結這些資訊。我們想在不同鏈之間自由地轉移資產和資料,或更進一步——在幾個鏈上同時執行我們的產品並對每個鏈加以利用。比如,我們可以利用一條鏈的效能,同時利用另一條鏈的社羣和生態。在NEAR的平臺上,我們不想讓以太坊開發者們在NEAR和以太坊之間做選擇,也不想讓他們只繫結一條鏈。我們想讓他們在兩條鏈上擁有相同的資產,甚至想讓他們擁有可以實現無縫跨鏈通訊的應用。所以我們開發了一種類似橋的工具,也就是我們所說的彩虹橋,以此來連線以太坊和NEAR。而且我們還針對互操作性解決方案建立了儘可能低的信任等級,使用者只需要信任彩虹橋連線的物件,即NEAR和以太坊,而無需信任彩虹橋本身。除了以太坊礦工和NEAR驗證節點之外,任何人或實體都沒有權力。具體來說,信任彩虹橋需要使用者需要做到以下幾點:· 相信在經歷過X次確認之後,以太坊區塊的最終性。當前版本的彩虹橋為應用開發者決定X的代表數字,不過開發者很快就能自行決定這一數字了。如果您是一名典型的應用開發者,該數字可能是25;如果您做事十分謹慎,則該數字就有可能是500。· 相信無論在什麼時候,NEAR鏈上三分之二的驗證節點質押都是誠實的。不僅是彩虹橋,還有所有其他NEAR上的應用都會在這一假設下執行。· 直到EIP665被接受為止,您需要相信:每個區塊的gas費以超過2倍的速率呈指數增長,且這樣的狀態持續4個多小時這樣的事,是不可能發生的。假設gas費的基礎價格為40gwei和14bps,您可以輕易地計算出將gas費提升兩倍的企圖會迅速突破它的合理界限,整個過程遠用不了4個小時。我們會在下文中向您解釋這樣的限制出自何處。
因為彩虹橋只需要使用者信任區塊鏈本身,所以我們將其稱之為無需信任的。這種無需信任的模型導致了因為跨橋互動而產生的延遲,下面是具體的延遲數字:· 對於ETH至NEAR的互動,延遲時間相當於生產X枚以太坊區塊所需的時間。生產25個以太坊區塊大約需要6分鐘。· 對於NEAR至ETH的互動,延遲時間為4小時;EIP665被接受後,該時間會驟然縮短至14秒左右。注意只要EIP665被接受,延遲時間就會大大縮短。鑑於很多擴容方案在實現互操作性上需要高達7天的等待時長,我們認為NEAR的彩虹橋技術是比較快速的。目前該技術的速度僅僅因為EIP665的缺席以及以太坊區塊的確認次數(任何基於以太坊的專案均受到該因素的限制)而受到限制。隨著我們的進一步發展,我們的彩虹橋技術在部署、維護或使用的過程中不需要特別許可。任何人都可以部署一個新的彩虹橋,使用現有的彩虹橋或者和別人一起對現有的彩虹橋實施維護,這些操作都是不需要任何機構和個人批准的,包括讓我們的彩虹橋實現去中心化的NEAR基金會。
而且彩虹橋技術還是 通用的。任何可以在NEAR平臺以加密方法證明的資訊在以太坊合約都是可用的,反之亦然。以下資訊對NEAR和以太坊來說都是可以使用加密方法證明的:· 在區塊中收錄一筆交易· 執行一筆交易並有一個具體的結果· 合約狀態此外,區塊鏈相關的資訊都是可證明的,比如某一區塊頭(header)的內容。以太坊區塊頭包括礦工資訊,NEAR區塊頭則包括驗證節點資訊。這種透過加密證明的資訊允許我們構建各種用例:· 我們可以橋接同質化通證、非同質化通證或任何一種資產
· 我們可以編寫使用合約狀態或NEAR驗證節點的以太坊合約· 我們可以使用彩虹橋做跨合約呼叫儘管用例的種類看起來是無限的,我們目前只提供從以太坊至NEAR或者從NEAR至以太坊轉賬ERC-20通證的開箱即用支援。然而,我們也會基於需求為其他用例提供這種支援。此外,任何人都可以投入進來,為他們的私人用例增加支援,而無需等我們或者與我們的程式碼庫合作。為了理解為何這一特點和其他我們在上文中列舉的特點站得住腳,我們需要理解彩虹橋的設計。設計Anton Bukov在NEAR工作期間,承擔了彩虹橋的主要設計工作。雖然他現在已經是1inch交易所的CTO,但仍然指導著彩虹橋技術的高層設計工作。
該技術背後的核心理念是執行兩個輕型客戶端: 一個用Rust語言執行的以太坊輕型客戶端,作為一個NEAR合約一個用Solidity語言執行的NEAR輕型客戶端,作為一個以太坊合約如果您對輕型客戶端的概念很熟悉,這一簡短的概要已經解釋了上述關於橋的保證。簡單來說,區塊鏈輕型客戶端是一種規範或是這種規範的實現。客戶端可對區塊鏈狀態進行追蹤,同時無需執行大量計算,而且該客戶端還可以以一種無需信任的方式對其追蹤的狀態進行驗證。我們在這裡想表達的重點是能夠以少量計算的代價追蹤和驗證狀態。 我們意識到計算量可能很小,小到可以在合約內執行一個輕型客戶端。這是讓彩虹橋方案可行的關鍵。 輕型客戶端

以下是使用彩虹橋技術執行的輕型客戶端簡圖。

請注意,除了執行輕型客戶端的智慧合約外,我們還有兩項叫做轉播(relay)的服務,該服務會定期將區塊頭髮送至輕型客戶端。Eth2NearRelay將每個單一區塊頭髮送至EthOnNearClient合約,同時Near2EthRelay每隔四個小時就會將一個區塊頭髮送至NearOnEthClient合約。每一對EthOnNearClient和NearOnEthClient合約,都可能會有若干對Eth2NearRelay和Near2EthRelay服務。 每個彩虹橋維護者可以執行一對服務。這些服務可能和彼此競爭——他們會試圖同時提交同樣的區塊,每次只會有一對服務成功。他們也會為彼此提供支援——一些服務只會在其他服務對沒有按時提交區塊的情況下提交區塊。我們目前的服務執行以第一種模式執行。

EthOnNearClient

正如我們之前說過的那樣,EthOnNearClient是採用Rust語言編寫的以太坊輕型客戶端的一種執行,也是一個NEAR合約。它接受以太坊區塊頭並對正統鏈(canonical chain)進行維護。它假設擁有finalized_gc_threshold次確認的區塊不能離開正統鏈,它會記住正統鏈的hashes_gc_threshold個區塊。在該正統鏈上,hashes_gc_threshold>=finalized_gc_threshold。預設狀態下,finalized_gc_threshold=46,000,這與累積7天的區塊頭數量大致吻合。這樣做可以保證EthOnNearClient的狀態不會無限制地增長。請記住在NEAR平臺,使用者需要有一定量的被鎖定的通證才能使用狀態(更多資訊),如果我們對單一合約內的每一個以太坊正統區塊頭進行儲存,使用狀態就需要大量的且處於不斷增長狀態的鎖定通證。因此,我們只會儲存一定量的以太坊區塊頭的雜湊值。所以彩虹橋只能被用來證明在這一時間範圍內發生的活動。所以如果您在進行ERC20通證轉賬(以太坊至NEAR)時,程序發生了中斷,請確保在7天之內完成轉賬流程。

有關EthOnNearClient另外一個重要的差異是它驗證以太坊區塊頭的方式。直接在合約內部驗證以太坊PoW是不可以的,因為這麼做需要儲存以太坊的DAG檔案,而這一操作會佔用大量記憶體,價格不菲。幸運的是,每個以太坊區塊都僅僅使用DAG檔案元素的一個子集,且每個以太坊週期都只有一個DAG檔案。此外,DAG檔案可以提前進行預計算,以備未來的週期使用。我們會提前4年對DAG檔案進行預計算並將每個檔案進行默克爾化(merelize)。初始化之後,EthOnNearClient合約會在未來四年記住DAG檔案的默克爾根。之後,EthOnNearClient僅需要收到以太坊區塊頭、DAG元素和這些元素的默克爾證明,這將允許它無需擁有記憶體中的全部DAG檔案就可以對PoW進行驗證。我們借用的是文章《Kyber網路使用的EOS橋技術》中的方法,而且我們甚至可以複用他們的一些程式碼。幸運的是,以太坊區塊頭的驗證工作僅使用交易gas費上限的三分之一和區塊gas費上限的十分之一。

NearOnEthClient

NearOnEthClient採用Solidity語言編寫,是NEAR輕型客戶端的一種實現,也是一個以太坊合約。和EthOnNearClient不同的是,它並不需要對每個單一的NEAR區塊頭進行驗證,且可以跳過大多數區塊頭,前提是它驗證了每個週期中的至少一個區塊頭。每個週期大概有43,000個區塊,大概持續半天時間。 最終,NearOnEthClient可以記住歷史上所有已提交的NEAR區塊頭的雜湊值。如果您正在進行由NEAR至以太坊的轉賬並且該過程被中斷了,對此您無需擔心,您可以在任何時候恢復這一程序,即使是幾個月之後也可以。 NEAR輕型客戶端另一個有用的特點是,每一個NEAR區塊頭包含一個默克爾樹根,該默克爾樹根是從該區塊頭前面的區塊頭計算得來的。如果您有一個NEAR區塊頭,您可以高效地驗證任何發生在該區塊頭前面的區塊頭中的任一事件。

NEAR輕型客戶端另一個有用的特點是該客戶端只接受最終區塊,而在NEAR平臺,最終區塊不能離開正統鏈。這就意味著,NearOnEthClient無需擔心分叉。

然而,不幸的是,NEAR 使用 Ed25519對負責審批區塊的驗證節點的訊息進行簽名,而該簽名不會以EVM預編譯的形式可用。這就使得對NEAR單一區塊頭的全部簽名進行驗證變得十分昂貴。 所以技術上看,我們不能只透過對NearOnEthClient進行一次合約呼叫就完成NEAR區塊頭的驗證工作。因此,我們採用了 optimistic approach。按照該方法,NearOnEthClient會對區塊頭中除簽名之外的全部資訊進行驗證。之後,任何人都可以在一個已提交的區塊頭中對簽名提出質疑,質疑視窗為4小時。質疑需要對單一的Ed25519簽名進行驗證,這項工作將花費大約500,000的以太坊gas費(很昂貴,但是是可以做到的)。 提交NEAR區塊頭的使用者需要使用以太坊通證釋出一個債券,一個成功的質疑將消耗一半的債券通證,剩下的一半會歸還給質疑者。即使gas費在這4個小時期間呈指數增長,債券規模也必須足夠支付gas費。比如,一個價值20枚以太坊的債券能夠承擔的gas費為20,000Gwei。這一optimistic approach需要有一個監督(watchdog)服務,負責對已提交的NEAR區塊頭進行監督,並對任何包含無效簽名的區塊頭提出質疑。為了獲得更多的安全性,獨立使用者可以執行若干個監督服務。

一旦EIP665被接受,以太坊將擁有Ed25519簽名,可作為EVM預編譯使用。這將讓監督服務和4小時的質疑視窗變得不再必要。

彩虹橋最少會包含EthOnNearClient和NearOnEthClient合約以及3項服務:Eth2NearRelay、Near2EthRelay和Watchdog。我們可能會認為這已經是一個橋工具了,因為我們在兩條鏈之間建立了一個加密連結。但是若要使用這種模式的橋,應用開發者們可能需要額外編寫大量程式碼,這顯然是不實際的。

證明工具(Provers)

能夠證明某一事件在某條鏈上發生過會讓客戶端變得更有用。為此,我們用Rust語言執行NEAR合約——EthOnNearProver,並用Solidity語言執行以太坊合約——NearOnEthProver。 EthOnNearProver可以驗證以太坊事件,NearOnEthProver合約可以驗證NEAR合約執行結果。EthOnNearProver和NearOnEthProver的實現,與EthOnNearClient和NearOnEthClient的實現是分開的,理由如下:

· 關注分離(Separation of concerns ):客戶端負責追蹤最新的區塊頭,證明工具則負責驗證具體的加密資訊
· 可拓展性(Scalability)——因為NEAR是一條分片鏈,如果橋的某一例項變得非常流行,使用者可以透過部署某一證明工具的多個副本來提升負載能力
· 特異性(Specificity)——除了上文描述的證明工具,使用者還可以執行其他種類的證明工具。使用者可以驗證合約狀態區塊頭的具體內容,或是交易的收錄情況。此外,證明工具的不同實現方式可能會使用不同的最佳化方法。

目前,我們僅提供了驗證以太坊事件(events)和NEAR合約執行結果的實現,這對在不同鏈之間轉移通證來說已經足夠了。不過我們仍然歡迎大家為證明工具執行貢獻自己的力量。 

說明:對一個EthOnNearClient而言,可能有多個證明工具與其溝通並將資訊複製到多個分片上;對一個NearOnEthClient而言,只有每類證明工具的一個與其溝通。

ERC20用例

使用證明工具可以幫助我們開發一套具備資產轉賬或跨鏈通訊功能的合約。然而,由於我們想要透過彩虹橋實現互操作的物件的不同,這些合約也大不相同。比如,ERC20要求一套完全獨立於ERC721或原生通證轉賬的合約。目前,彩虹橋為通用的ERC20通證轉賬提供了開箱即用支援,未來我們會增加更多的用例。在本篇部落格中,我們僅關注ERC20用例。

假設以太坊有一套ERC20通證,比如說穩定幣DAI。我們要想透過彩虹橋轉移這類通證,就需要部署2套額外的合約:

使用Solidity語言執行的以太坊合約——通證鎖定器

使用Rust語言執行的NEAR合約——可鑄造的同質化通證(Mintable Fungible Token)
某使用者想從以太坊轉移X枚DAI至NEAR,他們首先會在通證鎖定器合約鎖定X枚DAI,然後在NEAR合約可鑄造的同質化通證鑄造X枚nearDAI。如果他們想從NEAR轉移一些通證至以太坊,他們首先會在可鑄造的同質化通證銷燬Y枚nearDAI,然後在通證鎖定器解鎖Y枚DAI。

目前,ERC20通證的每個例項都要求部署一對獨立的通證鎖定器/可鑄造的同質化通證。不過,我們未來會解除這一限制,為多種ERC20通證使用同樣的通證鎖定器。 需要注意的是,如果某人想要增加ERC721的支援或另外一種資產轉賬,他們需要執行類似的鎖定器/資產對,且有一個不同的外部介面和內部實現,不過高層(high-level)設計將維持原狀——鎖定器會鎖定/解鎖資產,Asset會鑄造/銷燬NEAR版的這一資產。

Usage flow

使用者未來將能夠使用RainbowCLI或任意一種整合RainbowLib的應用,如NEAR錢包。在極少數情況下,使用者可能會選擇以手動方式與彩虹橋互動,即使用低階別(low-level)的合約呼叫指令,從他們的shell呼叫以太坊和NEAR合約。目前,我們僅支援RainbowCLI,不過我們也在籌備RainbowLib和錢包整合。 

從使用者角度看,通證轉賬應該直白易懂:他們提供憑證,選擇受益人和數量,透過RainbowCLI、錢包或其他應用啟動轉賬。一段時間後,轉賬成功,使用者收到可視的驗證資訊。然而,轉賬成功的背後,RainbowLib會執行下列複雜的操作:

1. 假設Alice想給Bob在NEAR鏈上轉賬X枚DAI,她使用RainbowCLI/RainbowLib啟動了轉賬流程
2. RainbowLib首先會為由Alice至通證鎖定器的轉賬設定一筆費用
3. 之後RainbowLib會呼叫通證鎖定器,捕獲那些導致通證鎖定器釋放“Alice為Bob鎖定X枚通證”事件的通證
4. 然後,RainbowLib會等待一段時間,直到EthOnNearClient收到包含上述事件的以太坊區塊頭,以及25個區塊來確認(具體可參見開篇一章中有關以太坊最終性的註釋) 
5. 然後,RainbowLib會計算這一事件的證據,並將其提交給可鑄造的同質化通證合約
6. 可鑄造的同質化通證合約會呼叫EthOnNearProver來驗證這一證據是正確的
· EthOnNearProver驗證該證據的區塊頭位於EthOnNearClient的正統鏈上,且該工具擁有規定數量的驗證次數。該工具也會對證據本身進行驗證;
· 可鑄造的同質化通證拆解這一以太坊事件,併為Bob鑄造X 枚nearDAI,轉賬至此結束。

類似地,RainbowLib將能夠執行ERC20之外的通證轉賬及合約呼叫等任務。

硬分叉

我們希望NEAR或以太坊協議發生變化時,現有的彩虹橋不會崩潰。我們也希望當重要的效能升級可用的時候(如EIP665被接受),我們能夠對彩虹橋合約進行升級。然而,我們不想以中心化的方式啟動升級,從而削弱其無需信任或去中心化的程度。

目前以太坊社羣已開發出很多種允許合約升級的代理模式。不過,我們認為最安全的升級模式應該是將升級決策委託給使用者。與這一使用者控制的彩虹橋升級模式類似的方法應滿足以下條件:

假設使用者正在使用彩虹橋在以太坊和NEAR之間轉賬。他們有X枚DAI鎖在通證鎖定器(TokenLocker),有X枚nearDAI在NEAR這一端可用;
假設有一天他們收到一份宣告,該宣告稱NEAR或以太坊正在進行協議變更,他們需要在一週之內轉移至V2版本的彩虹橋
他們使用舊有的橋工具將nearDAI重新轉回至DAI,然後使用V2版本的彩虹橋將DAI轉移至 V2版本的nearDAI

不過這一方法存在一定缺陷:

· 和普通的合約不同,該橋是一套更復雜的且需要維護的系統——某些人需要持續地執行轉播服務,否則輕型客戶端就要和區塊鏈失去同步,變得毫無用處。這就意味著,我們不能要求使用者在他們方便的時候以手動方式從V1版本的彩虹橋轉移至V2版本的彩虹橋。 如果我們在全部使用者將資產轉出之前關閉V1版本彩虹橋的轉播服務,他們的資產可能會永遠處於鎖定狀態,且無法轉移至V2版本的彩虹橋。如果我們執行中繼的時間過長,並等到所有人都完成轉移,我們每天都會在費用上消耗gas,每天大概會花費40美元(40gwei)。

· 整合彩虹橋的應用需要對彩虹橋遷移這一情況有所瞭解,因為它們需要從舊的可鑄造的同質化通證合約切換至新的可鑄造的同質化通證合約。他們中的某些成員需要自行完成這一任務,或透過UI指導他們的使用者完成這一任務。

鑑於上述缺陷,我們已決定為彩虹橋技術整合下面的可升級性選項。我們會使用代理模式的一種來允許EthOnNearClient, EthOnNearProver,NearOnEthClient和NearOnEthProver收到能夠證明三分之二的NEAR質押已經投票透過新一套的合約版本的證據後,自動切換至新的合約版本。 大多數情況下,通證鎖定器和可鑄造的同質化通證不用做出改變,因此該升級對使用者和應用開發者是透明的。因為無論如何我們都需要相信三分之二的NEAR質押,所以這不會影響彩虹橋的信任模型。我們會使用和其他的NEAR平臺上治理機制同樣的投票合約。我們也會盡量減少該機制被用作後門(backdoor)的機率。 為此,我們會製造7天的升級延遲,使用者可以在此期間對其進行觀察、驗證。如果他們不喜歡它,可以清算他們的通證或將通證手動轉移至不同的橋。然而,我們會為NEAR驗證節點預留許可權,讓他們可以對某一緊急升級活動進行投票,不過我們並不希望他們有一天會用到這一許可權。

激勵措施

當下的彩虹橋並不為轉播區塊頭支付gas費的維護人員執行激勵。彩虹橋的主要使用者需要執行他們自己的轉播服務,至少有一對轉播服務會由NEAR團隊執行。彩虹橋的未來版本會提供向使用者收費的選項,執行轉賬的使用者需要以gas、原生通證或其他方式支付使用費。然而,設計一套可靠的激勵機制是很複雜的。最簡單的方法是向彩虹橋使用者徵稅,並將其分發給提供轉播服務的維護者們。 不幸的是,這樣的系統並不能阻止死亡螺旋的情況,即彩虹橋可能會發生故障,導致使用者在一段時間內停用該服務,並最終導致維護者對支付gas費失去興趣。我們的組織正循序漸進地開發一套完善的彩虹橋激勵機制。與此同時,我們會對其進行維護並自行墊付相應的成本。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;