在一條區塊鏈中,鏈上各參與方藉助區塊鏈共識機制建立信任體系。那麼問題來了,在多條區塊鏈的跨鏈場景中,鏈與鏈間的信任如何傳遞?鏈間的信任,信的是什麼?這種跨鏈信任,又該如何建立?
鏈間的信任,信的是什麼?
先說結論:鏈間的信任,以信任對方鏈的執行機制為前提,信的是符合執行機制的執行結果。
其中緣由,得從跨鏈的基礎操作談起。
跨鏈的基礎操作為:對方鏈執行某個操作完成後,本地鏈才可執行另一個操作。如下圖所示:區塊鏈A成功執行操作X後,區塊鏈B執行操作Y。X操作是Y操作執行的前提條件。
上述操作中,一個請求X經過簽名,變成一筆交易發到區塊鏈A上,經過區塊鏈A共識,生成區塊。區塊中包含了塊頭、交易列表等資訊,塊頭中又包含了共識結果資訊。上述資訊都可統稱為區塊鏈的執行結果,具體流程如下圖所示:
區塊鏈A的執行結果被髮到區塊鏈B上。區塊鏈B在執行請求Y前,必須先判斷X是否上鍊。
判斷的方法是,在區塊鏈B的執行環境中,驗證區塊鏈A與X相關的執行結果是否有效。驗證透過,表示X已上鍊,區塊鏈B可繼續執行後續步驟:傳送請求Y,在區塊鏈B進行上鍊。
需要注意的是,此操作基於一個前提,即區塊鏈B必須信任區塊鏈A的執行機制。區塊鏈A上正確的執行結果,代表的是區塊鏈A上各方意願。區塊鏈B要驗證區塊鏈A上某個交易是否有效,必須信任區塊鏈A的執行機制,並按照區塊鏈A的執行機制,驗證區塊鏈A的執行結果,才可判斷區塊鏈A上的某個交易已上鍊。
可見,在整個過程中,透過驗證對方鏈的執行結果來判斷請求是否上鍊,是建立跨鏈信任的核心步驟。因而,鏈間的信任,以信任對方鏈的執行機制為前提,信的是符合執行機制的執行結果。
建立鏈間信任,需經四層驗證
執行結果雖然在不同區塊鏈有不同實現方式,但萬變不離其宗,區塊鏈的核心資料結構是以區塊為單位的鏈式結構,交易存在於區塊中(本文不討論DAG形式的區塊鏈)。
因此,我們可將執行結果的驗證劃分為以下四層:
驗區塊連續:在驗證開始時,需確認資料來源,基於區塊鏈的連續性,驗證區塊是否歸屬於指定區塊鏈,防止攻擊者用任意區塊鏈的區塊進行偽造。
驗區塊共識:在確認來源後,需驗證區塊是否代表對方鏈的整體意願。此步驟驗證區塊的共識資訊是否符合要求,防止攻擊者用未經過共識的區塊進行偽造。
驗交易存在:區塊被驗證合法後,需驗證指定交易是否屬於此區塊。不同鏈有不同驗證方法,下一節會展開描述。
驗交易正確:交易存在性得到驗證後,並不能代表此交易確實是跨鏈場景下預期的操作,還需結合業務場景,判斷交易的具體內容是否符合預期。
只有透過上述四層才算驗證透過。驗證透過後,說明操作已在對方鏈上上鍊,本地的鏈可執行後續步驟。
各層次驗證機制的實現方案
上節所述四層驗證,在不同區塊鏈上有不同的實現方式。WeCross的外掛化框架,定義了通用的程式設計介面,開發者只需按照鏈型別實現四個層次的驗證邏輯即可。
下面,我們來看看各層次的具體實現方案。
驗區塊連續
在不同區塊鏈上的實現大同小異。當前區塊中記錄著上一個區塊的雜湊值,當前區塊的雜湊值又在下一個區塊中被記錄,多個區塊依次相連形成區塊鏈。不同區塊鏈只在雜湊演算法和計算區塊雜湊的欄位上存在差異。
在WeCross中,驗證區塊鏈連續性,只需按照相應鏈的實現,驗證區塊依次相連成鏈即可。
驗區塊共識
驗區塊共識,即驗證區塊的共識資訊是否符合對應的演算法條件。不同演算法有不同的實現。此處給出最具代表性的兩種共識演算法:POW(工作量證明)和PBFT(實用拜占庭容錯)。
POW屬於最終一致性共識演算法,透過最長鏈和延遲確認的方式逐漸讓共識結果收斂一致。WeCross提供了POW驗證所需步驟:
驗難度:驗證區塊的nonce是否滿足工作量證明條件
驗延遲:驗證當前塊是否低於已知最高塊N個塊(N可取為10,表示1個小時前的區塊)
驗最長鏈:引入多方,驗證當前區塊處於最長鏈上,防止單方面謊造最高塊高和偽造分叉鏈進行作惡
PBFT演算法在多方共識後立即達成一致,區塊鏈不存在分叉和回滾的可能。在演算法中,節點透過多次相互廣播簽名以達到共識。
在區塊中,足夠數量的簽名代表了區塊的合法性。因此,WeCross中對PBFT的驗證較為簡單:
配置公鑰:事先配置對方鏈共識節點的公鑰
驗簽名:用事先配置的公鑰驗證區塊中籤名的有效性,並判斷有效簽名數量是否達到PBFT共識條件
驗交易存在
驗交易存在同樣需要根據不同實現判斷,比較有代表性的是SPV(簡單支付驗證)和背書策略。
SPV的初衷是為了實現輕客戶端,目前已在大多數區塊鏈上實現。隨著跨鏈技術興起,此技術也被用作驗證區塊中某資料的存在性。
以交易為例,區塊頭中記錄了當前區塊內所有交易雜湊組成Merkle樹的樹根,即“交易根”。任何一筆交易,都唯一對應了一條通向交易根的Merkle path。區塊內不存在的交易,無法偽造出通向交易根的Merkle Path。
因此,在WeCross中只需驗證某交易的Merkle Path,即可判斷某交易是否屬於某區塊。
背書策略為Hyperledger Fabric所採用。在Fabric中,每筆交易都需滿足某個事先定義好的背書策略。
交易在執行時會被多個背書節點簽名,當各方簽名滿足背書策略時,此交易才被認為有效。Fabric將背書節點簽名資訊作為交易的一部分儲存於區塊中。多筆交易組成區塊內的交易列表。交易列表以二進位制形式計算雜湊值,此雜湊值被記錄於區塊頭中。
因此,在WeCross目前的實現中,僅需判斷交易是否在交易列表中(且對應flag有效),並校驗交易列表雜湊值,即可初步判斷交易的存在性。
WeCross後續將結合背書策略,驗證交易的背書節點簽名,進一步增強交易存在驗證的有效性。
驗交易正確
驗交易正確,是根據業務的預期引數判斷前三步驗證的交易雜湊(或二進位制)是否是業務預期的那個操作。
例如,預期操作為transfer(a, b, 100),則相應的交易內容不能是get(a)。驗證時,需根據交易的編碼方式和雜湊演算法,校驗業務預期引數與交易雜湊(或二進位制)是否對應。不同區塊鏈實現的差別只體現在交易編碼和雜湊演算法上,根據鏈實現採用相應方法進行校驗即可。
WeCross中不同鏈的外掛實現了不同的校驗邏輯。FISCO BCOS外掛採用的是RLP編碼和SHA-256雜湊演算法,驗證的是交易雜湊是否正確;而Fabric外掛則採用ProtoBuf編碼,驗證的是交易二進位制是否正確。
完整驗證過程舉例
為了更直觀進行說明,下圖給出了FISCO BCOS的完整驗證過程。
當某條鏈拿到了對方鏈的執行結果後,即可在本地進行驗證。
在驗區塊連續上,FISCO BCOS透過比對區塊頭中父區塊雜湊與真實的父區塊雜湊,驗證此區塊是對方鏈的區塊。
在驗區塊共識上,透過校驗當前區塊的簽名列表,判斷合法簽名數量是否滿足PBFT共識條件,確認當前區塊代表了對方鏈的整體意願。
透過驗證交易雜湊通向交易根的Merkle Path的正確性,可判斷交易已存在於區塊鏈上。
透過驗證業務預期、交易二進位制、交易雜湊的對應關係,可判斷交易是業務預期的那個操作。四個層次驗證透過後,說明業務所預期的操作已在對方鏈上上鍊,驗證完成。
總結
鏈間的信任,以信任對方鏈的執行機制為前提,信的是符合執行機制的執行結果。執行結果是否正確,驗的是四個層次的資料。驗證機制在不同鏈有不同的實現,WeCross以外掛化的方式提供支援。
目前WeCross已實現FISCO BCOS和Hyperledger Fabric的互認互通,更多區塊鏈平臺的接入方案正在熱烈討論中,歡迎加入,共同推動跨鏈基礎設施的發展!