作者:Faust,極客web3
導語:到底什麼是數據可用性?可能絕大多數人第一印像是“可以獲取某個時刻的歷史數據”,但這其實是對DA概念最大的誤解。近期L2BEAT聯創與Danksharding提出者、Celestia創始人都對這一誤區做出了澄清,他們指出,Data Avalibity實際上應該指“數據發布”,但大多數人把DA理解成了“歷史數據可檢索”,而後者實際上涉及到數據存儲問題。
比如,前一陣子Dankrad曾提到了Layer2的強制提款/逃生艙機制,他指出,Validium的強制提款需要獲取最新的L2狀態來構造Merkle Proof,但Plasma只需要7天以前的(這和兩者的合法Stateroot判定方式有關)。
藉此,Dankrad明確指出,Validium需要DA保障用戶資金安全,而Plasma不需要。在此處,Dankrad用案例指出了DA和歷史數據可檢索的不同之處,即DA往往只涉及新發布的數據。
在L2BEAT那裡,數據可用性DA與數據存儲DS的區別被進一步加強。 L2BEAT的Bartek多次強調,DA和數據存儲/歷史數據可查是兩碼事,而用戶能夠獲取到自己需要的L2數據,只是因為那些提供數據的節點“對你足夠好”。此外,L2BEAT還計劃把“是否有權限開放的數據存儲節點”當做DA之外的一個測評Rollup的新指標。
以太坊社區/以太坊基金會成員的上述言辭,表明了他們要在未來對Layer2相關概念進行規範化的梳理,並對Layer2本身進行更詳實的定義。因為圍繞著Rollup和L2的很多名詞其實都沒有被很好的解釋清楚,比如多久前的數據算“歷史數據”——有人認為,因為智能合約只能調用256個block內的過往區塊數據,所以256個區塊(50min)前的數據都算“歷史數據”。
而Celestia和以太坊基金會口中的“Rollup”,嚴格來說都是兩種東西。本文旨在澄清DA概念和數據存儲的區別,從DA的來源、數據可用性採樣、Rollup的DA實現方式,來為大家解釋到底什麼才是數據可用性——數據發布。
DA概念的來源
關於“數據可用性”問題到底指什麼,Celestia創始人Mustafa如此解釋:DA就是,當區塊生成者提出新block時,如何確保區塊裡的所有數據都發佈到了網絡中?如果區塊生成者不Release區塊中的所有數據,就無法檢測區塊裡是否包含錯誤交易。
Mustafa還指出,以太坊Rollup簡單地將L2區塊數據發佈到以太坊鏈上,並依賴ETH來保障數據可用性。
而在以太坊官網,有關於DA的如下概括:可以把數據可用性難題概括為一個問題:“我們如何驗證一個新區塊的數據是否可用?”……對於輕客戶端來說,數據可用性問題是指在無需下載整個區塊的情況下,驗證區塊的可用性。
以太坊官網還明確區分了數據可用性與可檢索性的區別:數據可用性是指區塊被提出時,節點下載區塊數據的能力。換句話說,數據可用性與區塊尚未達成共識時相關……數據可檢索性是指節點從區塊鏈中檢索歷史信息的能力……雖然存檔可能需要區塊鏈歷史數據,但節點無需使用歷史數據就可以驗證區塊並處理交易。
在Celestia中國貢獻者——W3Hitchhiker合夥人任泓毅看來,Layer2事先假設Ethereum足夠安全和去中心化,排序器可以放心大膽的把DA數據發到以太坊,這些數據會無阻礙的傳播給所有以太坊全節點。而L2全節點本身就要運行Geth客戶端,算是以太坊全節點的子集,所以可以接收到Layer2的DA數據。
而在EthStorage的創始人Qi Zhou博士眼裡,DA的定義是沒有人可以把用戶提交到網絡裡的交易數據扣留住。對應的信任模型是,我們只需要信任L1的協議本身,不需要再引入其他信任假設。
Qi Zhou指出,現在以太坊的DA實現方式其實就是P2P廣播(gossip流言協議),每個全節點都會下載並傳播新block,並存儲Rollup的數據。當然,以太坊全節點並不會永久存儲歷史區塊,在4844上線後可能會自動刪除一段時間前的數據(貌似是18天)。存放全部歷史數據的檔案節點,現在全世界也沒有多少,EthStorage則打算填補以太坊體系的這一空白,並助力Layer2設置自己專屬的數據永存節點。
而以太坊基金會關於數據可用性Data availability的早期討論,可見於Vitalik在2017年的推文與github文檔。當時他認為,如果要保證區塊鏈可拓展/高效率,就要抬高全節點的硬件配置(全節點就是下載完整block並驗證其有效性的節點,做共識的Validator是全節點的子集)。但如果提高全節點硬件配置,就會提昇運行成本,導致區塊鏈變得中心化。
關於這一點,Vitalik說,可以設計一種方案,解決高性能全節點趨於中心化帶來的安全隱患。他打算引入糾刪碼和數據隨機抽樣來設計一套協議,使得低配硬件的輕節點即便不獲知完整的block,也可以得知block沒有問題。
他最開始的想法其實和比特幣白皮書裡提到的idea有關。這個idea說,輕節點可以不接收完整block,而當block有問題時,誠實全節點會發出“警報”,通知輕節點。這個思路可以引申到後來的欺詐證明,但不能保證誠實全節點始終可以獲得足夠數據,也無法事後判斷區塊提議者是否扣留了某些數據沒發布。
比如,某個節點A可以發布欺詐證明,聲稱從節點B那收到了不完整的block。但此時無法判斷,這個不完整的block是A自己偽造的,還是B發出去的。 Vitalik指出可以用數據可用性採樣DAS解決這個問題(顯然數據可用性實質涉及數據發布問題)。
Vitalik在”A note on data availability and erasure coding”一文中對這些問題及其解決方案進行了粗略討論。他指出,DA證明實質是對欺詐證明的一種“補完”。
數據可用性採樣
但顯然,DA概念不是那麼好解釋的,因為Vitalik的這篇github文檔前前後後進行了18次更正。記錄顯示,最後一次更正提交於2018.9.25。而就在前一天的2018.9.24,Celestia創始人Mustafa與Vitalik聯名發表了日後聲名大噪的論文——Fraud and Data Availability Proofs: Maximising Light Client Security and Scaling Blockchains with Dishonest Majorities.
有趣的是,這篇論文第一作者是Mustafa而不是Vitalik(另一名作者現在是Sui公鏈的研究員)。文中提到了欺詐證明Fraud Proof的概念,並解釋了數據可用性採樣DAS的原理,粗略設計了一套DAS +二維糾刪碼+欺詐證明的混搭協議。論文中則明確提到,DA證明系統實質是欺詐證明之上的必要補充。
如果我們從Vitalik的視角出發的話,這套協議的作用可以概括如下:
假設一條公鏈有N個高配硬件的共識節點Validator,它們的數據吞吐量很大,效率很高。這樣的區塊鏈雖然TPS高,但共識節點數量N比較少,是比較中心化的,節點串謀概率高。
但是,N個共識節點中起碼會有1個是誠實的。只要至少1/N的Validator誠實,檢查出block無效,並願意在必要時刻廣播欺詐證明,輕節點或誠實Validator都能知道網絡出現了安全問題,並可以通過Slash惡意節點、社會共識分叉等方式讓網絡恢復正常。
可是,就像之前Vitalik提到的,如果誠實全節點接收到一個block且發現它缺乏某些部分,並發布欺詐證明,此時不好判斷出是block提議者沒發布這部分數據,還是中途被其他節點扣留了,亦或是發布欺詐證明的節點自導自演。
此外,如果多數節點串謀,1/N的誠實Validator被孤立,可能無法獲取新的block,這算是一種數據扣留攻擊場景。需要注意的是,此時誠實節點不知道是網絡狀況不好,還是其他人串謀搞數據扣留,他也不知道其他節點是否也被孤立,不好判斷多數人是否已經串謀搞數據扣留。
綜上,要有一種辦法,以極高概率保證誠實Validator能獲取到驗證block所需的數據;同時,要能判斷出是誰在搞數據扣留攻擊——是block提議者沒發布足量數據,還是說被其他節點扣留了,亦或是多數節點在搞串謀。顯然,這種安全模型比普通POS鏈的“誠實多數假設”多了很多保障,而數據可用性抽樣DAS就是具體的實現方式。
我們現在假設,網絡中輕節點很多,可能是10 N,每個輕節點都連接了多個Validator(為了方便分析,假設每個輕節點都連接了全部N個Validator)。這些輕節點會向Validator多次發動數據抽樣,每次隨機請求一小部分數據(假設只佔一個block的1%)。隨後,它們會把抽到的碎片傳播給沒有這些數據的Validator。只要輕節點足夠多,且數據抽樣次數足夠頻繁,即便某些請求可能被拒絕,但只要大部分被響應,就可以保證所有Validator最終都能獲取到驗證block所需的足量數據。這樣可以抵消掉Block提議者以外的其他節點扣留數據的影響。
而如果多數Validator搞串謀,拒絕響應大多數輕節點的請求,此時人們很容易意識到鏈出了問題(因為就算一部分人的網速不好,也不至於差到大部分輕節點的請求都被拒絕)。所以前述方案可以極高概率判斷出多數串謀行為,當然這種情況本身極少發生。
到了這裡,我們可以解決掉來自Block提議者之外的不確定性因素。如果Block提議者搞數據扣留,比如他沒有在block裡發布驗證區塊所需要的足量數據(引入二維糾刪碼後,一個區塊裡包含2k*2k個片段,而還原出區塊的原始數據至少需要約k*k個片段,佔1/4。提議者想讓其他人不能還原出原始數據,最少需要扣留k+1*k+1個片段),最終肯定會被誠實Validator檢測出來,而後者會廣播欺詐證明警告其他人。
按照vitalik和mustafa的說法,他們其實是把此前就有人提出的想法結合了起來,並在此之上做出了一定的創新。而從整個構思的出發點與實現方式來看,顯然所謂的“數據可用性”指的是驗證最新block所需的那些數據,是否都有被區塊提議者發佈出去,且能不能被驗證者們接收到。這關乎“數據是否完整髮布”而不是“歷史數據是否可以被檢索到”。
以太坊Rollup的DA怎麼實現
有了前面的論斷,我們再來看以太坊Rollup的DA實現方式,其實就比較清晰了:Rollup裡的區塊提議者就是排序器Sequencer,它每隔一段時間就會在以太坊上發布驗證Layer2狀態轉換所需要的數據。準確的說,是向指定的合約發起一筆Transaction,在自定義的輸入參數里塞進DA所涉及的數據,並最終被記錄進以太坊區塊裡。由於以太坊足夠去中心化,可以確信定序器提交的數據會被“驗證者”順利接收到。但不同Rollup網絡中充當“驗證者”角色的東西是不同的。
具體而言,ZK Rollup採用以太坊上的Verifier合約充當“驗證者”。 ZKR最少只需要發布State Diff + Validity Proof,也就是狀態變化情況+有效性證明,Verifier合約會檢測有效性證明,判斷它能否和State Diff對上號。驗證通過後,定序器發布的L2 Block/Batch就被認作有效。
而樂觀Rollup要在以太坊發布更多數據,因為它只能靠L2全節點去下載數據並驗證Block有效性。這樣的話,至少要披露每筆L2交易的數字簽名(現在一般用聚合簽名)、如果有調用合約的話,還要披露輸入參數,此外還要披露交易轉賬地址、防重放攻擊的Nonce值等。但相較於完整的Transaction data,還是有一些修剪。
相比於ZK Rollup,樂觀Rollup的DA成本更高,因為ZK Rollup只需要披露一批交易執行後的最終狀態變化,附帶一個有效性證明,利用到了ZK SNARK/STARK的簡潔性;而樂觀Rollup只能採用最笨重的方式,讓所有交易都在其他L2全節點身上重新執行一遍。
此前W3hitchhiker曾粗略估算過,不考慮未來的4844和blob,ZKR的擴容效應可以達到OPR的數倍,而如果考慮到4337相關的智能錢包(用指紋、虹膜數據取代私鑰簽名),ZKR的優勢會更明顯,因為它不需要把指紋、虹膜的二進制化數據post上以太坊,而樂觀Rollup需要)。
至於Validium和Plasma/Optimium,其實是用以太坊鏈下的DA層來實現DA。比如,採用了有效性證明系統的ImmutableX自己搭建了一組DAC節點(數據可用性委員會),專門發布DA涉及的數據;Metis則在Memlabs上發布DA數據,Rooch 和Manta則採用Celestia。而目前看來,由於有DAS和欺詐證明系統的存在,Celestia是以太坊之外可信度最高的DA層項目之一。
參考文獻
1.https://coinmarketcap.com/alexandria/article/what-is-data-availability
2.https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding
3.https://www.youtube.com/watch?v=xV2XVCtQIGw&t=2977s
4.https://www.chainfeeds.xyz/feed/detail/45ca8444-113b-4d81-b3eb-cd90a1297f8d
5.https://arxiv.org/abs/1809.09044
6.https://ethereum.org/zh/developers/docs/data-availability/