區塊鏈資料儲存策略
頁面最後更新時間: 2026年2月26日
儲存資料的方法有幾種,直接上鏈儲存或是以某種被鏈保護的方式儲存:
- EIP-4844 blobs
- Calldata
- 鏈下與L1的機制
- 合約“程式碼”
- 活動
- EVM 儲存
依據幾項指標來選擇使用什麼方法
- 資訊的來源 Calldata裡的資訊是無法直接從區塊鏈上傳來
- 資訊的目的地 呼叫資料僅存在於包含它的交易中。 Events 在鏈上無法取得
- 大家願意忍受多少麻煩呢? 全方位的節點可以比網頁程式跑的light client做更多的處理。
- 讓所有的節點可以很簡單的獲得資訊是必要的嗎?
- 安全必要條件
安全必要條件
總的來說,資訊安全由三個屬性構成:
-
保密性,沒有被授權的單位是無法讀取資訊的。 這在很多案例中是很重要的,但不是在這。 在區塊鏈上沒有秘密。 區塊鏈行得通是因為任何人都可以驗證交易狀態,所以無法直接用來儲存秘密, 有幾個方法可以在鏈上儲存機敏資料,但是都必須依賴一些鏈下的元件,例如:至少一把密鑰,
-
完整性,資訊正確,無法被未授權的單位或未授權的方法改變,例如,轉帳 ERC-20 tokensopens in a new tab 不發
Transferevent。 在區塊鏈上,為了確保完整性,每個節點都會驗證每個狀態的改變。 -
可用性,任何被授權的單位皆可取得資訊, 在鏈上,通常為了達到在所有 full nodeopens in a new tab上可以獲得資訊可以獲得資訊,
不同的解決方案都有優秀的完整性,因為hashes 都會上到L1上。 而且,他們有各自的可用性保證。
先決條件
你應該對 區塊鏈基礎 有良好的理解, 同時也建議讀者熟悉blocks, transactions ,和相關的主題。
EIP-4844 blobs
從 坎昆升級opens in a new tab 開始,以太坊納入了 EIP-4844opens in a new tab,讓以太坊上的資料 blobs可以存在一小段時間(大約 18 天opens in a new tab)。 儘管是相同的機制,Blobs根據execution gas 有不同的計價, 這是一個發布暫時性資料的便宜方法。
主要的EIP-4844 blobs應用場景是 rollups 發布發交易。 Optimistic rollups 需要發布交易到鏈上, 這些交易在挑戰期間opens in a new tab 都必須是讓所有人可得,讓validatorsopens in a new tab 把 sequenceropens in a new tab 在rollup時發布的state root錯誤有機會做修正。
一旦挑戰期過了而且state root 也已經進入最終狀態,最後獲得這些交易的方法是複製鏈的現有狀態。 只需要少數的處理,從鏈的節點上也可以取得這個狀態, 交易資訊仍應該存在其他地方,像是 區塊瀏覽器,但不需要對以太坊的抗審查付費。
Zero-knowledge rollups 也會發布交易資訊讓其他的節點去複製現有的狀態以及有效性證明,但這也只是在短時間內可以取得。
EIP-4844 寫入的費用大約每byte 1wei (10-18 ETH),相較於 每筆交易21000 execution gas基本交易費用,包含blobs 資料寫入、花費opens in a new tab 微乎其微可忽略不計。 可以從此查看目前EIP-4844 的價格blobscan.comopens in a new tab。
Rollups常見的blobs 發布地址
Calldata
Calldata 是交易中一起發送的bytes中的一部分, 將區塊鏈上的永久紀錄儲存於包含這筆交易的區塊之中。
這是在區塊鏈上儲存永久資料最經濟的方法, 每byte的不是4 execution gas(假設是0 byte) 就是 16 gas(其他數字). 一般來說資料是被壓縮過的,每個byte的價格會差不多,每byte平均花費15.95gas。
撰文當下,每 gas 價格為 12 gwei,且每 ETH 為 2300$,花費約為每 kb 45 分錢。 因為這是在EIP-4844出現前最便宜的rollups 儲存交易資訊的方式,這些資訊用來提供錯誤挑戰opens in a new tab,但是不能直接從鏈上取得。
以下是常見的rollups 發布交易時使用的地址:
鏈下與L1 的機制
根據你對安全的取捨,可以將資料放在別處並運用機制確保資料可取得, 需要具備以下兩個條件才可以達成:
-
發布hashopens in a new tab 到鏈上,叫做_input commitment_, 這是單個 32-byte 的字,不是很貴, 只要輸入的承諾是確實存在的,完整性就會被確保,因為不可能找到其他資料會有相同的hash, 因此,若提供錯誤的資料,會馬上被發現。
-
有個確保資料可取得性的機制, 舉例來說,在 Redstoneopens in a new tab任何節點都可以提交資料可取得的挑戰, 若sequencer沒有在鏈上即時回應,輸入的commitment就會被丟棄,因此會認爲這些資訊是從來沒有發布過的。
在Optimistic rollup上這樣的機制是可以被接受的,因為我們已經仰賴最少有一個對state root誠實的驗證者, 這個誠實的驗證者必須確認有資料去處理區塊,並且當在鏈下無法得資料時發起資料可取得的挑戰, 這種Optimistic rollup稱為plasma。
合約程式碼
資訊只需要寫入一次,不會被覆寫,並可從鏈上取得且要作為合約程式碼儲存, 意味著我們用資料創造了“智慧合約”,並用 EXTCODECOPYopens in a new tab 讀取資訊, 優點是複製程式碼相對便宜。
除了memory擴展的花費, EXTCODECOPY第一次讀取合約需要花2600 gas(當他還是”cold"的狀態),之後複製相同的合約需要100gas再加上每32 byte 3 gas, 相較於calldata,每byte花費 15.95,從一開始就節省了約200 bytes。 基於擴展記憶體花費的公式opens in a new tab,如果你不需要超過4MB 的記憶體,記憶體擴展的花費會少於用增加calldata的方式。
當然,這只是 _read_資料的花費, 建立合約需花費約32,000 gas + 200 gas/byte, 這是當不同的交易要多次讀取相同資料唯一經濟的方法。
合約程式碼可以是無意義的,只要不是0xEF開頭, 嚴格限制 0xEF開頭的合約代表 ethereum object formatopens in a new tab。
Events
Eventsopens in a new tab是被合約觸發的,可以被鏈下軟體讀取, 好處是鏈下的程式碼可以監聽事件, 花費是用 gasopens in a new tab 計,375 加上每byte 8 gas。 當 12 gwei/gas、 ETH價格為2300美元時,每kilobyte 約1美分+22美分
Storage
智慧合約有進入 persistent storageopens in a new tab的權利, 但是很貴, 寫入一個32byte原本空著的storage slot 會 花費 22,100 gasopens in a new tab, 當 12 gwei/gas、 ETH價格為2300美金時,每個操作大約是61美分或每kilobyte$19.5美元。
這是以太坊最貴的儲存方式。
總結
下表列出了各種方式的優點和缺點:
| 儲存方式 | 資料來源 | 可取得性保證 | 鏈上可取得性 | 其他限制 |
|---|---|---|---|---|
| EIP-4844 blobs | 鏈下 | 以太坊保證~約18 天opens in a new tab | 只可取得Hash | |
| Calldata | 鏈下 | 以太坊永久保證(部分區塊鏈) | 只有在當寫入合約當下的交易中可取得 | |
| 鏈下與L1的機制 | 鏈下 | 在挑戰期內"One honest verifier" 保證 | 只有Hash | 只有在挑戰期間,由挑戰機制保護 |
| 合約程式碼 | 鏈上或鏈下 | 以太坊永久保證(部分區塊鏈) | 是 | 寫入“隨機”的地址,但不能是0xEF開頭 |
| 活動 | 鏈上 | 以太坊永久保證(部分區塊鏈) | 否 | |
| 儲存 | 鏈上 | 以太坊永久保證 (部分區塊鏈和目前的狀態直到被覆寫) | 是 |