作者:0xKooKoo,極客Web3 & Moledao技術顧問, 前Bybit技術負責人
**感謝0xmiddle在本文撰寫過程中提供的説明。 **
Introduction****
自區塊鏈行業建立以來,湧現出數不勝數的L1/L2,幾乎每條公鏈都發展出了自己的DeFi生態。 某些人只在特定公鏈上交互,更多人則希望在不同鏈上尋找交易、挖礦等收益機遇。 在這之中,跨鏈資金轉移成為了必不可少的剛需。
除了普通使用者,很多專案方也有在不同鏈間轉移資金的需求,在不同鏈上引導流動性,做到“一錢多用”。
但不同的區塊鏈是孤立的共識系統,資金沒有辦法從一條鏈直接跨到另一條鏈。 資金跨鏈的本質,是跨鏈橋作為一個公共的交易對手方,在源鏈上接收用戶資金,並在目標鏈上給使用者打錢(發行映射資產,或從目標鏈儲備的流動性池中為使用者釋放資金)。
到底怎麼實現資金跨鏈才最好?最開始人們還比較信任中心化交易所,曾一度流傳一句話:“中心化交易所就是最好的跨鏈橋。 “但「充-換-提」的操作很繁瑣,人們希望有一種純鏈上方式,更直接的完成資金跨鏈。
而且,相比於中心化交易所,**跨鏈橋可以完成更通用的跨鏈消息傳遞,不僅限於資金傳遞。 **例如,你如果使用一個跨鏈借貸dApp,從A鏈上提供抵押品,在B鏈上借出資產,就需要用到跨鏈消息傳遞。
如果考察跨鏈的歷史來源,可以追溯到區塊鏈技術發展的早期階段。 當時,不同公鏈的出現讓人們意識到,鏈之間的互通性問題要被解決,否則會出現很多資訊/資金孤島。 隨著時間推移,人們提出了不同類型的跨鏈方法,逐漸形成了今天的通用跨鏈模式。
下面我們就來講解一下跨鏈技術的一些發展。
Methodology****
1. 自己尋找對手方
我們來想想,最符合直覺的跨鏈方法是什麼?假如你在A鏈有100個USDT,你希望把它們轉移到B鏈上。 恰好有一個人在B鏈有100個USDT,他希望把USDT轉移到A鏈去。 你們倆一看這不剛好嗎,於是一拍即合。
但當你把USDT在A鏈上轉到對方的位址時,他卻反悔了,沒有在B鏈上將他的USDT轉到你在B鏈的位址上。
因此,**這種P2P交易的模式不是很靠譜,**一來對方可能毀約,讓你遭受損失,沒有任何保障;二來,這個交易對手也不好找,你可能要等很久,才能碰到一個剛好和你要跨出去的金額匹配,但跨鏈方向相反的使用者,甚至可能等到天長地久也等不到這樣的對手方。
2. 公證人機制(Notary Schemes)
2.1 單個公****證人
於是我們想到,既然對方可能違約,**那我能不能找一個可信的第三方進行交易?**我在源鏈上先把錢給他,然後他保證在目標鏈上把錢轉給我。 比如說,這個人同時在A鏈和B鏈上都有資產,然後他擔保說,只要在A鏈收到我的100個USDT,就一定會從B鏈轉給我100個USDT。
這比第一種P2P的鏈間資產交換好很多,因為有一個可信的公共對手方了,他手裡掌握了一種神奇的東西,叫做「流動性」,你可以隨時與它交易。
也就是說,你和他的交易變成了一種“點對池”的交易,而非“點對點”的交易。 但你還是覺得不踏實,如果你和他交易100 USDT還好,倘若你要和他交易100萬USDT呢?儘管他有比較好的信譽,但還捲款跑路。
說到底,這個公證人其實又是引入了一種中心化,依舊不是我們想要的Trustless的跨鏈方式。
2.2 多個公證人(MultiSig)
**那如果這個公證人不是一個人,而是一群人呢?**我們可以建立一個共管帳戶,多個簽名人共同管理該帳戶,他們要對一個消息進行簽名,簽名數達到閾值(一般是2/3),資金才會被轉移。
這種情況下,如果其中少數人(不超過1/3)動了歪心思,想在源鏈上收我的款,又不想在目標鏈上給我打錢,或者離線了,也沒有關係,其他誠實的公證人還是會簽名,並把應給我的錢轉出去。
**這種方案比較靠譜了,弱化了中心化風險,安全性更高一些。 **比如一共有20個信譽良好的公證人,他們同時動歪心思的概率還是很低的。 (這裡不包括 Multichain那種20個節點實際上是一個人管理的情況,或是像Axie跨鏈橋那樣被駭客盜取了2/3公證人的簽名密鑰。 )
2.3 多個公證人(MPC)
但多簽的帳戶管理方式,也有很多不方便的地方。
**多簽使得簽名規則更容易暴露。 **如果是5/7的簽名方案,多簽錢包的智慧合約代碼會暴露到底有多少個簽名方,駭客可以有的放矢的尋找這些簽名方,伺機盜取私鑰。
**多簽需要對不同的公鏈進行適配。 **比如有的公鏈不支持智能合約,你就得用該鏈特製化的密碼學原語實現多簽帳戶,如果這個也不支援,你這個多簽錢包就搞不了。
多簽的簽名人定了就不能改。 比如5/7的簽名方案,你如果想改成6/8的方案,或者你想更換簽名人,就得重新部署多簽合約,而且還要把資金轉移到新的多簽合約中。
首個BTC衍生品tBTC的跨鏈方案,就是用了多簽的方式,因為很蹩腳難用,已經被淘汰了。 **當前的跨鏈橋,大多採用了更先進的MPC的方式。 **
MPC全稱Multi-Party-Computation(多方安全計算),是一種私鑰分片技術。 多簽帳戶是多個私閜管理一個帳戶,而MPC帳戶則是一個私鑰管理一個帳戶,該私閜被切分為多個碎片,多個簽名人各持有一個私閜碎片,當簽名人數達到閾值時才可以合成完整的簽名,簽名過程不會暴露完整私閜。
MPC帳戶有以下優勢:
**比普通多簽錢包的保密性更強。 **當需要簽名的時候,由例如5/7個私鑰碎片各自去簽名,多個子簽名融合到一塊構成最終的一個合法簽名。 這樣一來,鏈上看到的是一個單一的、普通的簽名,你無法分辨它是否來自MPC帳戶,更無法知道背後的簽名人是誰,也無法知道私鑰碎片的數量和具體的簽名規則。
**可以比多簽錢包更好的適配大多數公鏈。 **MPC是一種簽名技術,與鏈無關。 MPC賬戶其實就是一個普通帳戶,不管一條公鏈是否支援智能合約,都可以通過MPC技術構建共管帳戶。
**MPC更換簽名機制更靈活。 **可以支持更靈活的簽名規則調整,比如隨時改變私閜碎片數量、簽名閾值,也可以隨時更換簽名人,只需要把私鑰進行重新分片(Re-share)即可。
3. 進一步的安全措施
3.1 冷熱分離
公證人的託管帳戶收到了A鏈上我的100個USDT后,給我在B鏈的地址轉過去100個USDT,這個行為的觸發流程該怎麼做?
假設說每個公證人成員都有一台機器在監聽A鏈上的transaction,當他們發現我給跨鏈橋託管賬戶轉了100個USDT,且這筆transaction裡面聲明了,我希望在鏈B上名為user2的位址接收這些USDT。
此時公證人集體進行聯合簽名,將B鏈上跨鏈橋帳戶中的100個USDT轉給user2。 這個過程肯定要寫成代碼,自動化運行,否則公證人都得實時在線,收到請求還得立刻操作,太不現實了。
這個自動化程式裡會包含幾個部分
**1、監聽程式:**負責監聽源鏈上的交易,為了過濾無關交易或無效交易,這一步可能會做一些基本的格式驗證;
**2、校驗程式:**這裡會包含所支持區塊鏈的輕節點用戶端(也可能是全節點),負責驗證源鏈上某筆與跨鏈橋合約產生交互關係的交易,真的被打包進區塊並上鏈了;
**3、簽名程式:**負責簽名發起目標鏈上向使用者的轉帳交易。
但自動化也帶來一個問題,就是這個自動化程式有可能被駭客攻擊和操縱。 **因此為了控制風險,跨鏈橋會採取冷熱分離的措施。 **自動化程式控制的是熱秘鑰,轉帳的金額受到限制,遇到大額轉帳,則必須讓公證人用冷秘鑰進行手動簽名。 冷熱分離的規則可以在MPC賬戶中實現。
3.2 風險隔離
如果真的有bug,不要一次事故全部一鍋端吧?因此要做好資金池的隔離,用多個託管帳戶來管理流動性資金,比如按照不同公鏈之間做隔離,例如A和B,B和C,C和D全都是獨立開來的資金池。
3.3 TEE
**公證人所運行的自動化監聽和簽名程式,可以運行在TEE設備中,這樣可以大幅度提高駭客攻擊的難度。 **TEE全稱為可信執行環境(Trusted ute Environment ),是給定設備上運行的與主操作系統隔離的計算環境,就像一塊飛地(Encalve)。
這種隔離是通過硬體強制實現的,具有極高的安全性,因此TEE可以運行具有高安全性要求的應用程式,例如加密密鑰管理、生物特徵認證、安全支付處理等。
3.4 PoA向左,PoS向右
為了讓跨鏈橋更加安全,在公證人的選擇方面有兩個方向:
**一種是盡可能選擇信譽良好的大公司、知名機構。 **對於這些機構而言,作惡的成本極高,可能會損失掉積累多年的商譽。 此外,要盡可能讓他們在地理分佈上足夠多元化(避免集中在同一司法轄區)。
比如跨鏈橋專案Wormhole就選擇了這樣的模式,它的19個節點背後都是體量龐大、資金雄厚的知名大機構,這就是PoA的方式。
**另一種方式則是Permissionless的公證人准入,但要求他們做質押,**如果行為不端,他們質押的資金就會被slash。 這就是PoS的方式。 ZetaChain用的便是這種。
兩種方式誰優誰劣,不好直接武斷的給結論。 取決於跨鏈橋專案方在各自的方向上做的怎麼樣。
無論是PoA還是PoS,你可以把跨鏈橋直接做成一條公鏈,每個節點跑著相同的程式,所有跨鏈請求和處理的過程都會被記錄到這條鏈上。 這條鏈本身也可以承載應用,從而成為一個生態樞紐。
3.5 觀察者
**還有一種增強安全性的方法是,設置一個觀察者的角色。 **該角色負責監控跨鏈行為,如果發現問題,可以在鏈上報告並中止交易。 由於觀察者需要一個視窗期來做出反應,因此跨鏈轉移的到賬時間可能被延遲,所以,只有大額交易或敏感跨鏈操作,使用者接受轉賬延遲的情況下,觀察者才會介入。
其他跨鏈方案****
哈希鎖定
回到本文所說的第一種方法:P2P的尋找跨鏈資產交換的對手方。 如果我們害怕對手方賴帳,那可以設置一套機制,一旦誰反悔了,另一方可以把錢拿回來,完璧歸趙。
**這就是哈希鎖定,它巧妙地利用了哈希鎖和時間鎖,**迫使資金的接收方必須在 deadline之前確定收款,並且產生源鏈上的收款證明,而打款方憑藉這個收款證明,一定可以獲取接收人在目標鏈上的等價資產,否則雙方的資金都將原路返還。
**但是這種方式只能進行資金的交換,無法完成通用的跨鏈信息轉移。 **而且哪怕單從資金跨鏈轉移的角度講,哈希時間鎖的用戶體驗也很不好:
如果幣價的波動對交易對手(流動性提供方)不利,他可能理性地選擇不成交;
為了完成一筆跨鏈交換,使用者和交易對手都必須操作兩次簽名。
因此,**哈希時間鎖作為一種跨鏈解決方案,基本已被淘汰。 **早期使用這種方案的跨鏈橋(例如cBridge、Connext)都已經改弦更張了。
鏈上輕用戶端
這種方式是直接在目標鏈上部署源鏈的輕客戶端合約。 如果你在一條鏈上部署了合約,那麼這條鏈的所有節點都會運行你部署的合約代碼。 所以,鏈上輕用戶端的方案,實際上是讓目標鏈直接驗證來自源鏈的交易。
這種方式具有極高的安全性,但也是最昂貴的。 昂貴體現在以下幾個方面:
目標鏈的輕用戶端合約需要即時接收和驗證來自源鏈的新區塊頭,這個過程非常耗Gas,即便用ZK來實現簡潔證明,驗證一個ZK證明的Gas消耗也不會低於40萬Gas(EVM為例),而在MPC方案中,鏈上僅需驗證的就是一個簽名而已,Gas消耗只有2萬出頭,差了20倍!一個更安全,但是貴20倍的橋,你會用嗎?
**開發輕用戶端合約的工程量巨大,而且為了讓跨鏈橋相容更多的異構鏈,你需要在不同鏈的完全不同的開發環境中,實現其他各個鏈的輕客戶端合約,對開發人員簡直是地獄級挑戰。 這就導致合約編寫出現bug的概率變大,也就是說輕用戶端橋的安全性僅僅是理論層面的,在工程實****踐方面,反而很不安全。 **
為了降低開發工程量,有一個可行的方案是引入一條中繼鏈,讓所有鏈與這條中繼鏈互相建立輕用戶端合約,這的確可以讓曾經C(n,2)的工作量減少為 n,但依舊不會太小。 原本從源鏈到目標鏈直接的跨鏈傳遞,也變成了源鏈→中繼鏈→目標鏈的二階傳輸,這會產生額外的gas消耗和時間消耗。
因此,輕客戶端的技術方案,目前來看,無法被用於構建更普適的跨鏈橋。
End Game****
首先,不同的公鏈有著不同的做法,背後也有不同的資源在支援,只要不服輸,生態一定會存在,即使短期內發展不是很好,也說不定哪天做了一個升級就又活過來了。 **像這種底層infra的事情就是看誰堅持得久,看誰針對市場調整得快。 **
Bitcoin和Ethereum不能解決所有的應用場景,又或者說在某一個細分賽道,總有人不喜歡第一名,於是新造一個輪子,因此未來一定會是多鏈的。 或者以後底層都不是鏈了,那未來一定是多生態的,多個生態之間的資金和消息怎麼做傳遞呢,就一定需要有跨鏈/跨生態技術!
跨鏈這件事情上使用者最關注什麼呢?無非是以下幾點:
速度:一筆跨鏈操作需要多久完成
費用:我需要為一筆跨鏈操作支付多少
安全:跨鏈橋是否安全,資金會不會丟失
流動性:是否有足夠的流動性以支援我的交易以及可接受的price impact
連接範圍:你支援多少條鏈,是否支援我的跨鏈操作中需要用到的鏈
體驗:跨鏈操作是否方便,例如是否支援Gas代付、費用預估是否準確、是否支援進度查詢和瀏覽器查看,出現失敗的情況是否頻繁,失敗如何處理等等。
**我們先從安全、費用、連接範圍三個比較清晰的角度來概覽一下一些專案的特性。 **
點擊連結查看清晰表格(表格不斷更新中):
為了完全說清楚跨鏈橋,其實還有很多維度的細節需要討論,例如上面表格裡面的所有維度和數據分析。 那麼你在跨鏈時,會在意哪些要素呢?你經常使用的跨鏈橋有哪幾個?你認為跨鏈橋應該著重在哪些方面優化?如果你有你的想法,歡迎與作者交流。