架構師深度拆解:Web3 需要什麼樣的儲存系統?

寫在前面

文字產生以前,結繩記事是人類用來儲存知識和資訊的主要方式。此後,從竹簡、紙張的發明,到工業時代的磁碟儲存,再到資訊時代的資料庫,儲存方式不斷革新,「存力」不斷提高。

11月3日,在2022雲棲大會上,螞蟻鏈歷經4年技術攻關與測試驗證的區塊鏈儲存引擎LETUS(Log-structured Efficient Trusted Universal Storage)正式發佈。

這一款面向區塊鏈可信資料儲存的技術產品,不僅用來解決當前螞蟻鏈及區塊鏈產業的規模化發展問題,也面向Web3時代提供「可信存力」支撐。

我們認為,隨著大量的資料和數字資產在數字化世界裡流轉,可信資料的「存力」將如同電力網路的承載力一樣重要。

本文希望通過對LETUS的深入技術解讀,回答讀者們普遍關心的關鍵問題:LETUS是什麼?主要解決哪些問題?為什麼堅持用「可驗證結構」?為什麼要自研?以及未來要走向何處?

文 | LETUS技術負責人 田世坤

01

背景是什麼?

從2009年序號為0的創世塊誕生至今已過去十多年,「中本聰」依然神秘,但區塊鏈技術的發展卻因為公鏈、token、開源的推動,沒有絲毫神秘感。

經過幾代技術演進,在比特幣的UTXO模型基礎上誕生了應用更為廣泛、支持可程式設計智慧合約的區塊鏈技術:通過密碼學、共識演算法、虛擬機器、可信儲存等技術,多個參與方執行相同的「指令」,來完成同一個業務邏輯,如賬戶轉賬,或者合約調用,維護不可篡改和不可偽造的業務資料。

簡單講,可將這類賬本資料庫,看作一個去中心化防作惡、防篡改的複製狀態機,所執行的是智慧合約描述的業務邏輯,而狀態機通過日誌 (區塊資料)產生新的狀態(狀態資料):

區塊資料:包括交易、回執、世界狀態Root Hash等資訊,和資料庫系統中的日誌類似,但是塊之間由Hash錨定防篡改,並且不會刪除。(區塊資料記錄的是區塊鏈上發生的每一筆交易,如:Alice向Bob轉賬xx)

狀態資料:記錄賬戶、資產、業務合約資料等狀態資訊,和資料庫系統中表資料類似,需要實現可驗證可追溯。(狀態資料記錄的是區塊鏈上每個賬戶或智慧合約的當前狀態,如:Bob賬戶剩餘xx)

鏈上資料的特點可以總結為以下三個:

持續增長:從創世塊開始,賬本資料隨交易持續增長,保留週期長;

多版本:交易修改狀態資料產生新版本,系統提供歷史版本查詢和驗證功能;

可驗證:交易和賬戶狀態通過Merkle根哈希(Merkle Root Hash)錨定在區塊頭,通過SPV(simple payment verification,簡單支付證明)提供存在性證明;

區塊鏈應用通過可驗證資料結構(Authenticated Data Structure,如Merkle tree)實現可驗證和可追溯。我們認為,Web3「存力」一個非常重要的要素是可驗證,而今天我們看到的區塊鏈儲存瓶頸大多來源於可驗證結構ADS(如Merkle tree)的低效存取和查詢,這正是螞蟻鏈LETUS重點攻克的難題。

02

我們要什麼?

隨著時間推移和鏈上交易的增加,對儲存容量的要求也不斷增長,隨之而來的是區塊資料儲存成本的大幅提升;與此同時,鏈上狀態資料規模也持續增加,可驗證資料結構持續膨脹,導致交易性能隨賬戶規模提升和歷史狀態資料增加而持續下降。

2019年,螞蟻鏈上線了一個供應鏈金融業務,大家特別興奮。但是,這種興奮並沒有維持多久,隨著程序跑的時間越來越長,問題慢慢暴露出來。

供應鏈金融是面向ToB的,不像ToC端隨時都有資料,可能會在某個時刻(比如每天晚上)有一筆狀態資料非常大的交易進來,跑了一個星期後發現性能越來越慢。

鏈平臺TPS的衰減和儲存直接相關,而與共識、虛擬機器都無關,隨著業務合約持續寫入資料,儲存性能大幅衰減。

如果要在技術上長時間支持億級賬戶規模、每天能穩定支撐億級交易量,儲存的規模和性能問題必須要攻克。

期間,團隊也曾試過各種技術方法對他進行最佳化,得到一些緩解。但多次嘗試之後發現,隨著數量增加而出現的性能衰減,是一個繞不開的瓶頸,需要從本質上解決。

我們需要從問題表象分析背後的原因。

區塊鏈應用通過可驗證資料結構實現可驗證和可追溯,但是可驗證資料結構會帶來讀寫放大(問題1)和資料局部性(問題2)

而儲存系統為了實現資料管理,需要對資料分頁/分層、排序,如KV資料庫基於LSM-tree將資料分層有序儲存,而MySQL之類的資料庫將資料分頁,也會基於B-tree資料結構來排序索引。

業界現有的實現方式,大多采用基於LSM架構的通用 Key-Value 資料庫,在資料庫之上運行一個獨立Merkle樹來實現可驗證,如:

以太坊:MPT(Merkle Patricia Tree)+LevelDB

Diem:JMT(Jellyfish Merkle Tree)+RocksDB

背後的核心矛盾為:

01

Merkle樹每次狀態資料修改,即使只改一個KV,也需要從葉子節點到根節點,每一層節點都重新編碼後,寫到KV資料庫,例如上圖中Alice給Bob轉賬,需要寫入Merkle樹的2個葉子節點和3個中間節點,最壞情況需要寫入數十個中間節點;

02

Merkle樹的節點的key完全隨機(如對內容算hash,再以hash為key),資料局部性(data locality)非常不友好,如RocksDB裡為了讓Level內sst檔案有序,即使沒有垃圾依然需要層層進行資料壓實(compaction),從而消耗了大部分的磁碟讀寫頻寬;

03

資料規模越大,Merkle樹本身的層數越多,需要額外寫入的key-value越多,DB裡的資料量越多,後臺資料管理的代價越大(如compaction流量),消耗大量的磁碟和CPU資源。

除此之外,吞吐、延時等儲存性能(問題3)持續增長下的儲存成本(問題4)單機儲存下的規模瓶頸(問題5)也都是需要解決的問題。

03

面臨什麼挑戰?

在過去幾年的快速發展中,區塊鏈的業務場景對交易吞吐量和響應時間要求越來越高,很多技術也被推動迭代發展,如PBFT、HoneyBadger、MyTumbler等高性能共識演算法,BTN等網路基礎設施,JIT加持的WASM虛擬機器、以及高效的並行執行技術。

但比較而言,儲存的性能對區塊鏈平臺整體性能影響非常大。對面向2C場景的數字藏品類業務(如鯨探,需支持秒殺),交易TPS與延時要求極為苛刻;而對需要在鏈上保存大量資料的存證類業務,大容量儲存帶來的成本又十分可觀。

要支撐業務的長期可持續發展,我們歸納出區塊鏈儲存面臨的核心挑戰:

規模:業務賬戶規模可達數10億,狀態資料和歷史版本規模分別需要支撐到十億、千億級;

性能:轉賬交易需求可達十萬級TPS、百毫秒級延時,要求性能不能受制於單機瓶頸,資料規模持續增長下性能不衰減;

成本:隨著交易增長,儲存容量持續增加,儲存空間佔用、節點間頻寬佔用居高不下。業務持續增長要求低成本儲存。

這些問題在行業內很普遍。業界技術路線主要分三條:

路線A:弱化可驗證可追溯,如HyperLedger Fabric 1.0開始不支持可驗證和多版本,保存讀寫集、只持久化最新版本狀態資料;

路線B:最佳化KV資料庫儲存,如實現鍵值分離、hash索引的KV資料庫等(BadgerDB、ParityDB),接入通用分散式資料庫(MySQL)等;

路線C:最佳化Merkle樹,交易ID作為版本、樹結構稀疏化,如Diem JMT。

根據公開資訊,目前區塊鏈產品中主流的MPT + LevelDB、JMT + RocksDB、MySQL等儲存架構,沒有能全部解決上述5個問題的方案,難以在支持多版本和可驗證的同時,滿足10億級賬戶規模下的高性能、易擴展、低成本的業務要求。

04

我們做到了什麼?

我們做到了什麼?

我們自研了一套區塊鏈儲存引擎LETUS(Log-structured Efficient Trusted Universal Storage),保證完整的可驗證、多版本能力,既滿足區塊資料不可篡改、可追溯、可驗證等要求,也提供對合約資料友好訪問、儲存規模可分片擴展,高性能低成本等特性。同時也滿足通用性,統一管理區塊資料、狀態資料。

LETUS在2022雲棲大會發布

LETUS在2022雲棲大會發布

4年前不敢想象的能力,現在具備了(以下資料為統一環境下的測試結果):

01

大規模:通過儲存集群擴展支持十億賬戶規模,TPS超過12萬,交易平均時延低於150ms;

02

高性能:儲存層IO吞吐相比以太坊MPT + LevelDB等架構提升10~20倍,IO延遲降低90%以上。鏈平臺在7×24高壓力壓測中,端到端TPS不隨資料量增加而衰減;

03

低成本:相比MPT + LevelDB架構,磁碟頻寬減少95%、空間佔用減少60%;相比於Diem JMT + RocksDB架構,磁碟頻寬減少約60%、空間佔用降低約40%;

04

進一步降成本方案,供使用者選用:

(a)針對區塊資料容量與成本持續增長,提供智慧控溫分層儲存能力,並應用於存證等業務降低約70%儲存成本,同時也降低運維成本。

(b)針對狀態資料的歷史版本容量與成本持續增長,提供範圍掃描的批量裁剪能力,實現歷史版本狀態資料的裁剪和後臺空間回收,在十億賬戶規模時,使用鏈原生儲存可以減少近90%狀態儲存空間。

但這背後是一個技術架構的跨越,從下圖左邊的可驗證資料結構+KV資料庫架構,升級為現在的LETUS儲存引擎,架構更簡潔,系統更高效。

如Alice給Bob轉賬,只需要寫增量資料,不需要寫入7個Merkle樹節點,資料局部性更友好,如Alice和Bob的賬戶資料,按區塊號有序,不再hash隨機。

05

怎麼做到的?

回顧這四年,主要經歷的三個大的階段
回顧這四年,主要經歷的三個大的階段

回顧這四年,主要經歷的三個大的階段。

階段一:開源思路最佳化

第一年裡,為了滿足業務急迫訴求,我們需要在有限時間內,實現億級賬戶規模和交易TPS。先從已有系統入手,深度最佳化了狀態樹,基於開源MPT到自研FDMT,同時調優RocksDB資料庫、增加併發、提升介質性能。

一系列最佳化措施緩解了問題,但依然無法根本解決,例如資料規模增加後,寫放大依然有幾十倍,資料在底層儲存裡依然隨機分佈。

階段二:自研儲存引擎

為了能徹底解決上述所有問題,我們不得不重新思考儲存引擎的設計。

核心設計

針對讀寫放大(問題1)、資料局部性(問題2)和性能(問題3),我們結合區塊鏈特徵,如可驗證資料結構的讀寫行為、鏈上資料的多版本訴求、只追加和不可篡改等,重新設計儲存引擎的架構分層、關鍵元件、索引資料結構:

根據區塊鏈特徵,我們根據可驗證資料結構的讀寫行為、鏈上資料的多版本訴求,重新設計儲存引擎的架構分層、關鍵元件、索引資料結構:

01

將可驗證特性下推到儲存引擎內部,由內建的Version-based(區塊號)多版本Merkle樹提供可驗證可追溯,並且直接操作檔案,從而縮短IO路徑;

02

多版本Merkle樹的Node聚合為page,提升磁碟友好性,page儲存採用Delta-encoding思想避免in-place更新(結合Bw-tree思路),狀態資料修改時主要保存增量,定期保存基線,從而減少寫放大,也減少了空間佔用;

03

為page儲存實現Version-based的儲存與檢索,索引page都按區塊號有序寫入、在索引檔案裡有序總局,核心資料結構為B樹變種,從而實現有序資料locality;

04

利用區塊鏈場景資料的追加寫、Immutable特點,架構上採用Log-Structured思想,通過日誌檔案來組織資料;

05

資料與索引分離,資料按區塊號有序寫入資料檔案,通過非同步IO、協程併發等提升系統併發度,索引多模,區塊&狀態通用,除Merkle樹支持狀態資料,實現有序B樹支持區塊資料;

06

當前最新版本Merkle樹優先在記憶體裡快取或者全部快取,鏈上合約執行時,如果存在則直接讀取,不需要訪問page來重放,從而加速合約執行。

基於這些核心設計,實現了成本降低的同時性能提升,鏈平臺交易TPS、延時等性能指標不會隨著資料規模的提升而衰減。

降成本

雖然儲存資源佔用大幅降低後,但是鏈上資料依然面臨持續增長帶來的高成本問題(問題4)。

基於LETUS架構的後臺資料治理框架,我們能很方便的擴展實現資料遷移/壓縮/垃圾回收等治理策略,基於這些策略,為使用者提供進一步降成本能力,並針對自己的業務特點來選擇使用:

(1)智慧控溫分層儲存:儲存介質按照性能、成本分層,通過智慧控溫排程資料在不同介質的分佈量,將冷資料後臺自動遷移到廉價介質(如NAS),降低儲存整體成本,並實現容量擴展,不受單盤空間限制。

(2)範圍掃描的批量裁剪:對於歷史版本Merkle樹和狀態對象,基於版本有序性與內建Merkle樹,讓使用者可以指定目標區塊號範圍裁剪,通過Page邊界掃描,批量索引與資料裁剪、垃圾回收實現儲存空間釋放,進一步降低狀態資料成本。

規模擴展

規模擴展

針對問題5,LETUS採用分散式儲存架構,實現單個共識參與方計算和儲存分離,計算層和儲存層可分別部署獨立集群,通過高性能網路通訊框架進行資料讀寫訪問。

為了對海量狀態資料進行靈活的資料分片,並且保證各個區塊鏈的參與方hash計算的一致性,將資料切片為256個最小儲存單元(msu),並將一個或者多個msu構成一個狀態資料分片(partition),將所有資料分片排程到多個物理機器。從而實現規模彈性擴展,解決了單機儲存的容量瓶頸和頻寬瓶頸。

階段三:生產落地

為了全面落地鋪開的同時讓業務平穩運行,能夠開著飛機換引擎,在這幾年的研發過程裡,我們充分準備、循序漸進的分階段落地:

2021年5月,基於LETUS儲存引擎的區塊資料冷熱分層,在版權存證業務灰度上線,儲存成本降低71%,解決容量瓶頸並降低運維成本。

2021年8月,基於LETUS儲存引擎的狀態資料,在數字藏品平臺「鯨探」雙寫灰度上線,併成功支撐秒殺場景;

2022年2-6月,LETUS引擎的歷史狀態資料裁剪、儲存服務架構升級等生產ready,在數字藏品和版權存證等業務全面落地,並從灰度雙寫切為單寫;LETUS單寫意味著對硬體資源要求大幅下降,我們將「鯨探」生產環境的雲資源全面降配,降配後鏈平臺性能水位提升200%,同時儲存成本下降75%

06

總結與展望

總結與展望

螞蟻一直堅持「成熟一個開放一個」的技術戰略。同樣的,LETUS不只為螞蟻鏈定製,也同樣給其他聯盟鏈、公鏈提供高性能、低成本的支持。

螞蟻鏈堅持技術自研,確保在共識協議、智慧合約、網路傳輸、儲存引擎、跨鏈技術、區塊鏈隱私計算等領域處於全球領先水平。我們始終認為,堅持技術自主研發是建立長期可持續競爭力的關鍵。

在「可信存力」這條賽道上,我們也需要為進一步的技術壁壘提前佈局,如合約結構化查詢語言,為鏈上合約實現結構化+可驗證的查詢能力,提升開發者體驗;Fast-Sync與節點多形態,提升組網效率和節點成本靈活性;以及Web3等潛在的技術生態。

技術創新永遠在路上。接下來,繼續沿著硬核技術方向突破,啃一些硬骨頭,持續為整個價值網際網路提供可靠的、可持續的存力。

相關文章

可信存力,Web3.0的下一個戰場

可信存力,Web3.0的下一個戰場

產業數字化作為數字經濟發展的主引擎,在全球經濟發展的大環境中飛快發展。作為「新基建」重要技術之一的區塊鏈,俘獲了大量關注。 回顧區塊鏈近年的...

「生成式技術」正在顛覆人類創作!

「生成式技術」正在顛覆人類創作!

整理 | 王啟隆 在過去的半年裡,AI 寫小說、繪畫和剪視訊等熱點新聞火爆全球,現在只需要在鍵盤上敲幾個關鍵詞,AI 就能在燒著我們顯示卡的...

華碩進軍元宇宙,跨界建立NFT平臺

華碩進軍元宇宙,跨界建立NFT平臺

自去年開始,元宇宙話題就炙手可熱,但熱度有了,進展甚微。客觀來說,元宇宙發展當前還處於比較早期的階段。尤其是國內,還只是存在於概念中。 不過...