你從沒看見的那 90% 帳單
想像一條像 Arbitrum 的 樂觀 Rollup,在一個繁忙的午後。它一口氣撈起 500 筆兌換,於零點幾秒內在鏈下執行完,再把結果貼回 以太坊。前三篇你已學會 Rollup 如何向以太坊借用安全性——樂觀式靠 詐欺證明、zk-Rollup 靠 有效性證明。但有個問題,沒人會問,直到他親眼看了一份 gas 明細:在那其中一筆 Rollup 交易裡,錢究竟花到哪去了?
在 2024 年 3 月之前,答案令人吃驚:大約 80–95% 的成本來自一個項目——把這批交易的原始位元組以 calldata 的形式貼上 L1。鏈下的運算幾乎免費,資料才是整張帳單。這把整個擴容敘事翻了個底朝天。一條 第二層 的瓶頸從來不是運算多快——執行早就搬到鏈下了;瓶頸是如何把資料便宜地放上一條安全的基礎層——而這正是 資料可得性 問題。
「資料可得性」到底在講什麼
人們常把三種不同的保證混為一談。有效性:運算正確嗎?可得性:背後的資料真的被公布出來、任何想要的人都能下載嗎?儲存:它會被永遠保存嗎?資料可得性只是中間那一個——也就是「位元組此刻已被釋出、全世界都拿得到」這個承諾。它不談正確性(那是證明的工作),也不談永久性(那是封存的事)。
為什麼每一種 Rollup 都需要它?對樂觀 Rollup 來說,驗證者只有在能重新執行這批交易時,才建得出 詐欺證明——而那需要輸入資料。對 zk-Rollup 來說,有效性證明已經證明了狀態轉移正確——但一個「你的餘額被正確更新了」的證明,若你根本看不到新狀態是什麼,那就毫無用處。你需要資料才能知道自己擁有什麼,並在營運方消失時自己組出一筆提領。有有效性卻無可得性,就像一座上了鎖的金庫,餘額已驗證,你卻永遠拿不到。
calldata 對上 blob:EIP-4844 改了什麼
舊作法很殘酷。Rollup 把批次資料直接塞進一般交易的 calldata,每個非零位元組要花 16 gas(零位元組 4 gas)。更糟的是,這份 calldata 與 L1 上的每一筆兌換、鑄造、NFT 交易擠在同一個 gas 市場——所以以太坊一塞車,Rollup 手續費就跟著一起飆。資料既昂貴,又被主網需求綁為人質。
# Posting ~100 KB of rollup batch data to L1 # OLD WAY -- calldata (pre-EIP-4844) nbytes = 100_000 gas = nbytes * 16 # 16 gas / non-zero byte -> 1_600_000 gas eth_at_20gwei = 1_600_000 * 20e-9 # = 0.032 ETH (~$96 @ $3000) PER BATCH # NEW WAY -- one blob (EIP-4844) GAS_PER_BLOB = 131_072 # = 2**17 blob gas, carries 128 KiB blob_base_fee = 1 # wei, while blobs are below target cost_wei = GAS_PER_BLOB * blob_base_fee # = 131_072 wei ~= $0.0000004 # Same bytes. A separate fee market. Often a 10-100x drop, split across the batch.
EIP-4844,又稱 原型 Danksharding(proto-danksharding),在 2024 年 3 月 13 日的以太坊 Dencun 升級上線。它引入了一種新的交易型別,能在一般內容旁夾帶 blob(binary large object,二進位大物件)。三項特性讓它脫胎換骨:每個 blob 為 128 KiB;blob gas 有獨立的 EIP-1559 式費用市場,使 blob 空間不再與執行 gas 競爭;而且——關鍵在此——blob 資料對 EVM 是不可見的。合約讀不到 blob 的位元組,只看得到對它的一個小小承諾。
# EIP-4844 blob-gas market -- entirely separate from execution gas
GAS_PER_BLOB = 2**17 # 131072 (one 128 KiB blob)
TARGET_BLOB_GAS_PER_BLOCK = 3 * 2**17 # 3 blobs (raised to 6 by Pectra / EIP-7691)
MAX_BLOB_GAS_PER_BLOCK = 6 * 2**17 # 6 blobs (raised to 9 by Pectra)
MIN_BLOB_BASE_FEE = 1 # wei
BLOB_BASE_FEE_UPDATE_FRACTION = 3338477
# excess_blob_gas accumulates when blocks run ABOVE target, drains when BELOW
def blob_base_fee(excess_blob_gas):
return MIN_BLOB_BASE_FEE * exp(excess_blob_gas / BLOB_BASE_FEE_UPDATE_FRACTION)
# -> the fee sits at the 1-wei floor until blobs are PERSISTENTLY full, then rises fast效果是立竿見影的:Dencun 上線那一刻,Rollup 手續費一夜之間跌掉 10 倍以上,有些 L2 交易甚至掉到不到一美分。但要老實面對極限——這份便宜只在 blob 維持在目標以下時成立。最初的目標是每區塊 3 個 blob(上限 6 個);之後的升級(Pectra,2025 年)把它提高到目標 6 個、上限 9 個。一旦 blob 持續被塞滿,blob 的 基礎費就會攀升,L2 手續費也隨之回漲。而這股壓力,正是完整 Danksharding 存在的目的:把它紓解掉。
為什麼 blob 是暫時的——以及那招 KZG
讓 blob 便宜的洞見就在這裡。資料可得性不需要永久儲存。資料只需要存在得夠久,讓任何在意的人都能下載它,進而重建狀態或提出挑戰。過了那段時間,網路就能把它忘掉。EIP-4844 把 blob 保留 4096 個 epoch(約 18 天),之後便修剪掉。真正想要這段歷史的人——區塊瀏覽器、Rollup 自己、索引器——會在協定外自行封存。你租的是約 18 天的可得性,不是買斷的永久儲存。正是這個區別,讓 blob 能成為一種與 calldata 不同、更便宜的資源。
那麼,永遠留在鏈上的是什麼?不是 blob——只是對它的一個小小 KZG 承諾(一個 48 位元組的 多項式承諾),以一個 32 位元組的版本化雜湊形式儲存,EVM 能透過 BLOBHASH 操作碼讀到它。一個點求值 預編譯合約讓合約能驗證「被承諾的多項式在某個選定的點上等於某個聲稱的值」——而完全不必看到 blob 本身。zk-Rollup 正是靠這招,便宜地證明它所承諾的資料確實對得上它的 blob。而同一套承諾機制,也讓下一步——抽樣——成為可能。
完整 Danksharding:用抽樣取代下載
為什麼 EIP-4844 只是原型版?因為它交付了 blob 的格式與費用市場,但每個節點仍要下載每一個 blob。在 3 到 6 個 blob 時這還可以,但你不能要求一位用家用網路的居家質押者,每個區塊都拉下數十 MB。完整的 Danksharding 用一個優美的構想拿掉了這道上限:沒有人下載全部,但每個人卻又集體確信資料就在那裡。
其機制是建立在抹除碼之上的 資料可得性抽樣(DAS)。區塊提議者用里德–所羅門碼把資料延伸編碼,使得任意 50% 的碎片就能重建出整體。接著每個輕節點隨機索取少少幾塊小碎片。若你抽 30 塊隨機碎片,它們全都回傳且都能對 KZG 承諾驗證成功,那麼資料可得的機率就大於 1 − 2⁻³⁰。想把資料藏起來,攻擊者就得扣留超過一半——而這一點,即使只抽幾塊隨機樣本,也幾乎必定會被逮到。
# A light node checks availability WITHOUT downloading the full blob set
commitments = download_commitments(block_header) # small: just the KZG commitments
NUM_SAMPLES = 30
for _ in range(NUM_SAMPLES):
(row, col) = random_coordinate() # pick a random chunk
chunk, proof = request_from_peers(row, col) # tiny download
assert verify_kzg(commitments[row], col, chunk, proof)
# All samples returned and verified ->
# data is available with probability > 1 - 2**(-NUM_SAMPLES)
# No single node ever held the whole blob -- the NETWORK guarantees availability.Danksharding 的目標約為每區塊 64 個 blob(約 8 MB),且還有大幅成長的空間——但這是一條跨越數年的路,不是單一次硬分叉。漸進式的部署 PeerDAS 引入了點對點抽樣作為墊腳石,讓每個節點只下載一部分資料、其餘的用抽樣。有個常把人絆倒的澄清:Danksharding 切分的是資料,不是執行——與被放棄的 Eth2 執行層分片計畫不同,每一筆交易仍跑在同一條鏈上,只有 blob 資料被攤散到整個網路。
去別處租資料:模組化 DA 層
退一步看,這幅圖景是一疊工作:執行、結算、共識與資料可得性。單體鏈這四件事全自己做。模組化論點說:把它們拆成各司其職的專門層,讓 Rollup 自由搭配。DA 是最值得專門化的那一層,正因為它是瓶頸——於是一個由專屬 DA 層組成的市場應運而生,以比以太坊 blob 更便宜的價格出售可得性。
Celestia 是一條只做共識與資料可得性的鏈——沒有智慧合約、沒有執行。它對每個區塊抹除編碼,用命名空間 Merkle 樹組織資料,讓 Rollup 只抓取屬於自己的那一片,並讓輕節點直接進行 DAS。Rollup 把資料貼到 Celestia,只把一個小小的承諾貼到它的結算層。EigenDA 走的是另一條路:建立在透過 EigenLayer 的再質押之上,它是一個主動驗證服務(AVS),由持有再質押 ETH 的營運者證明自己保有抹除編碼後的資料。它不是一條自己的共識鏈;其安全性是加密經濟式的,由可被罰沒的再質押 ETH 撐腰。
結論
把這一階從頭走一遍,輪廓就清楚了。執行靠搬到鏈下、進入 Rollup 而擴容。正確性靠把整批交易壓縮成一個簡潔的 有效性證明,或一個可被挑戰的 狀態根而擴容。但原始資料卻隨使用量線性成長,而它正是你唯一壓不掉的東西——Rollup 處理的每一個位元組,都是一個必須落腳在安全、可抽樣、夠去中心化的 DA 層上的位元組。你能用 200 位元組證明一段運算;你卻無法用比輸入本身更少的位元組去證明一 MB 的輸入存在,你能做的只是讓檢查它們變便宜。
這就是為什麼整個 L2 故事——calldata → blob → Danksharding → 模組化 DA——骨子裡是一個 資料可得性的故事。把資料弄得便宜、充裕、且能靠抽樣驗證,那道 可擴展性三難困境終於開始彎折:你既得到吞吐量,又不必逼每個節點下載全部,因而不必犧牲那份「讓這條鏈值得使用」的去中心化。瓶頸從來不是那台電腦,一直都是資料。