昨天把逃生艙拆成三個前提:資料可得、有人算得出證明、L1 有獨立驗證路徑。第一個前提被我當成布林值處理了——「資料在鏈上」勾一格,「資料在鏈下」打一個叉。這是錯的,而且錯得不只是精度問題。資料可得性不是布林值,它是一個三維的東西:機率性的(沒有任何節點能百分之百確定資料可得,只能把失敗機率壓到某個數量級)、主觀的(每個節點各自判斷,以太坊 L1 合約裡沒有任何一個 opcode 能告訴你「這個 blob 當時可得」)、有時效的(以太坊的 blob 只保證約十八天,之後共識層節點會直接刪掉)。

把這三維攤開,昨天那張表就要重畫。Arbitrum 的二十四小時 delayed inbox 和 OP Stack 的十二小時 sequencing window 都遠遠小於十八天,所以強制收錄本身不受 blob 過期影響——強制收錄走的是 L1 calldata,那是永久的。真正卡住的是下一步:你把交易塞進 delayed inbox 之後,要有人根據批次資料重算 L2 狀態、生出提款證明。批次資料在 blob 裡,而 blob 十八天後就不在共識層了。如果你信任的最後一個狀態根距今超過十八天,而中間那段資料沒有任何人歸檔,你手上就只剩一個 versioned hash 和一份無法重建的歷史。

今天的主題就是把這件事講到能執行:資料可得性到底保證了什麼,用什麼機制保證,保證多久,保證到什麼機率。以及一個幾乎所有中文材料都混在一起的分辨——「當時有人能拿到」和「你以後拿得回來」是兩個完全不同的問題,前者叫 data availability,後者叫 historical retrievability,對應的是 EIP-4444 那條完全不同的路線。

📖 學

DA 問題的定義:fraud proof 與逃生艙都建在同一個前提上

樂觀 rollup 的安全性論證只有一句話:如果排序者提交了錯誤的狀態根,任何人都能在挑戰期內提交 fraud proof 推翻它。這句話裡藏了一個沒被寫出來的量詞——「任何人都能」的前提是任何人都拿得到那批交易資料。沒有資料,你連錯在哪裡都指不出來;你知道狀態根不對,但你無法構造那個一步一步的爭議互動,因為你不知道那批交易是什麼。這叫 data withholding attack:排序者提交一個狀態根,同時扣住對應的資料。挑戰期空轉,狀態根在 L1 上定案。

ZK rollup 換掉了 fraud proof,但沒換掉這個前提,只是換了它守護的對象。有效性證明保證狀態轉換是正確的,所以 withholding 不會讓錯誤狀態上鏈。但它會讓你無法計算自己的餘額,也無法生出提款所需的 Merkle 證明——狀態轉換正確,但狀態本身是黑箱。這正是 validium 的處境:證明在鏈上、資料在鏈下,你的錢在數學上是安全的,在操作上可能永遠取不出來。這種攻擊有一個精準的名字:資料扣留造成的凍結,不是盜取,是拒絕服務。對持有資產的人來說,差別不大。

所以 DA 問題可以這樣定義:一個 block producer 提交了對某批資料的承諾(commitment),我們要在不下載全部資料的前提下,取得高信心說「這批資料的每一個位元,現在都有某個誠實節點能提供給任何索取者」。注意「不下載全部」這個約束——如果每個節點都下載全部資料,DA 問題是空的(你自己有,當然可得),但那條路線的擴容天花板就是最弱節點的頻寬。DAS 這一整套機制存在的唯一理由,就是要在「不下載全部」和「高信心」之間找到一個可證明的交換條件。

blob 的實際參數:一二八 KiB、目標十四、上限二十一、十八天

EIP-4844 定義的 blob 是一個固定長度的東西,沒有彈性:四〇九六 個 BLS12-381 純量域元素,每個三十二位元組,合計 131,072 位元組,正好一二八 KiB。因為每個域元素必須小於群階,實務上常見的打包方式是每三十二位元組只用三十一位元組裝資料,所以可用容量約 126.98 KiB,不是整整一二八 KiB。這個 4% 的損耗常被忽略,但你在估 rollup 成本時它是實在的。

blob 的計價和 EVM gas 完全隔離。GAS_PER_BLOB = 131072(即 2^17),每個 blob 消耗這麼多 blob gas;blob base fee 用獨立的指數式更新:

base_fee_per_blob_gas = MIN_BASE_FEE_PER_BLOB_GAS
                        × exp(excess_blob_gas / BLOB_BASE_FEE_UPDATE_FRACTION)

MIN_BASE_FEE_PER_BLOB_GAS = 1 weiexcess_blob_gas 是「累積超出目標的 blob gas」,每個區塊按實際用量加、按目標值減。這個設計的關鍵性質是漲跌不對稱:每個區塊最多能讓 excess 增加 (max − target) × GAS_PER_BLOB,但最多能讓它減少 target × GAS_PER_BLOB。目標十四、上限二十一的話,漲的分子是 7 × 131,072 = 917,504,跌的分子是 14 × 131,072 = 1,835,008——跌的步幅是漲的兩倍。

時點目標 / 上限每 slot 目標資料量
Dencun(二〇二四年三月)3 / 6384 KiB
Pectra / EIP-7691(二〇二五年五月)6 / 9768 KiB
Fusaka(二〇二五年十二月三日)6 / 9,PeerDAS 上線768 KiB
BPO1(二〇二五年十二月九日)10 / 151,280 KiB
BPO2(二〇二六年一月七日)14 / 211,792 KiB

BPO(Blob Parameter Only)是 EIP-7892 定義的機制,配合 EIP-7840 把 target、max、baseFeeUpdateFraction 三個值搬進執行層設定檔的 blobSchedule,讓核心開發者可以在不動任何協定邏輯的情況下,單獨開一個超輕量硬分叉調整 blob 容量。這是二〇二五年以太坊治理上最實際的一項發明:blob 容量從此和分叉週期解耦。

目標十四、上限二十一的算術後果:每 slot 目標 1,792 KiB = 1.75 MiB,上限 2,688 KiB = 2.625 MiB;以十二秒一個 slot 算,持續吞吐目標約每秒 149 KiB,約每秒 0.146 MiB。這個數字比多數人以為的小很多,而它就是全體 L2 共用的 L1 資料頻寬。

然後是十八天。共識層規則 MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS = 4096 epochs;4096 × 32 slots × 12 秒 = 1,572,864 秒 = 18.2 天。過了這個窗口,共識層節點不再有義務提供 blob sidecar,實作上也就直接刪除(Prysm 有 --blob-retention-epochs,但小於預設值會直接拒絕啟動)。為什麼是十八天而不是七天?因為樂觀 rollup 的挑戰期是七天,那是下限;十八天是留了兩倍多的餘裕,同時把節點的儲存負擔壓在一個可接受的量級。

這個量級值得自己算一次。 十八天的窗口有 131,072 個 slot;目標十四個 blob,就是 1,835,008 個 blob;乘以一二八 KiB = 224 GiB。加上糾刪碼的兩倍延伸,整個延伸矩陣是 448 GiB。這個數字如果每個節點都要存,blob 擴容就到此為止了——而 PeerDAS 存在的意義,就是把「節點要存多少」從「網路吞吐多少」裡拆出來。以 Fusaka 的 CUSTODY_REQUIREMENT = 4(共 128 個 custody group)計,一個普通全節點只需保管 448 × 4/128 = 14 GiB。想當 supernode 保管全部一二八個 column 的,才要承擔 448 GiB。吞吐上去了、儲存沒上去,這就是 DAS 的全部賣點。

還有兩個容易漏的限制。EIP-7594 順手加了 MAX_BLOBS_PER_TX = 6:單筆交易最多帶六個 blob,所以在目標十四的世界裡,一個 rollup 想吃滿一個區塊,至少得發三筆 blob 交易。以及 EIP-7918 的保留價,下一節細講。

更正一:blob 沒有「上鏈」,EVM 讀不到 blob 內容,合約也驗不了可得性

我以前(包含昨天)講「資料上鏈」時,語感上是把 blob 當成 calldata 的便宜版。這在資料可存取性上完全錯了。blob 的內容從來沒有進入以太坊的執行層狀態。執行層看到的只有 blob_versioned_hash——KZG 承諾的雜湊,三十二位元組。合約能用 BLOBHASH opcode 讀到這個雜湊,能用 EIP-7516 的 BLOBBASEFEE opcode 讀到當前 blob 基礎費,能用位於 0x0A 的 point evaluation precompile(收費 POINT_EVALUATION_PRECOMPILE_GAS = 50000)驗證「這個承諾在某個點的取值是某個值」。它讀不到 blob 的任何一個位元組。

這件事的後果比聽起來嚴重。一個 rollup 的 L1 合約無法檢查「這個 blob 曾經可得」,因為它連 blob 是什麼都看不到。那麼可得性是誰保證的?是共識層的分叉選擇。 驗證者在投票給一個信標區塊之前,要先確認自己負責保管的那些 data column 都拿到了、KZG 都驗過了;拿不到就不投票,區塊拿不到足夠票數就進不了正典鏈。DA 不是被合約驗證的,是被質押權重的投票行為執行的。 這是一種經濟與活性的保證,不是一個可以在鏈上重播的密碼學證明。

所以要精確地說:對一個 rollup 而言,「我的資料在以太坊 DA 上」的意思是「當時全網有足夠比例的質押不願意在拿不到我的資料的情況下推進鏈」。這比 DAC 的簽名強得多,但它跟「合約驗證過了」是兩種東西。任何把 DA 說成「鏈上驗證」的說法,包含我自己以前的說法,都需要這個更正。

順帶一個推論:blob 的可得性保證是在發布當時由當時的驗證者集合提供的。你今天無法回頭去證明兩年前某個 blob 在當時可得。這條線,是本文最後一節那個「可得 vs 可取回」分辨的密碼學根據。

糾刪碼 + 抽樣:機率推導,以及為什麼「抽 k 次」是 (1/2)^k 級別

先把糾刪碼在做的事說清楚。沒有糾刪碼的話,抽樣是無效的:攻擊者只要藏住 1% 的資料,你隨機抽十次,99% 的機率什麼都沒發現,但那 1% 缺了資料就是不完整。糾刪碼把這件事顛倒過來——它讓「藏一點」變成不可能,攻擊者要麼全放,要麼至少得藏一半

用一維、碼率 1/2 的 Reed-Solomon 來推。原始資料編成 N 個延伸份額(share),任意 N/2 個份額就能還原全部。設攻擊者實際願意提供的份額集合為 A。如果 |A| ≥ N/2,任何人拿到那些份額都能重建全部資料,攻擊已經失敗了——資料事實上可得。所以一次成功的扣留攻擊必須滿足 |A| ≤ N/2 − 1。

現在一個抽樣者隨機抽 k 個份額,全部拿到才接受。有放回抽樣:

P(被騙) = (|A| / N)^k ≤ (1/2 − 1/N)^k < 2^(−k)

無放回(實際情況)更精確:

P(被騙) = C(|A|, k) / C(N, k) = ∏_{i=0..k−1} (|A| − i) / (N − i)

代 PeerDAS 的真數字。 NUMBER_OF_COLUMNS = NUMBER_OF_CUSTODY_GROUPS = 128,重建門檻是一半即六十四個 column,所以攻擊者最多能放六十三個。抽 k = 8 個:

(63/128)(62/127)(61/126)(60/125)(59/124)(58/123)(57/122)(56/121)
= 2.71 × 10^−3 ≈ 1/369

比粗略上界 2^−8 = 1/256 還好一點(因為無放回)。抽十六次約 7.2 × 10^−6;抽三十次落到 10^−9 級別。這就是「抽 k 次未偵測到隱藏的機率約 (1/2)^k 級別」的正確來源:它來自碼率 1/2,不是來自任何魔法。 碼率變了,底數就變。

二維 Reed-Solomon 的底數不是 1/2,是 3/4。 Celestia 走的是二維路線:k × k 的資料方陣,行列各延伸一倍成 2k × 2k。要讓方陣不可重建,攻擊者至少得藏掉 (k+1)^2 個份額(這是標準結論:少於這個數量,總能靠行列交替解碼把整個方陣補回來),也就是說他能放的份額最多約整個延伸方陣的 3/4。於是單次抽樣的漏檢機率上界是 3/4,不是 1/2:

P(被騙) ≤ (3/4)^k

Celestia 的輕節點要求至少抽十六次,(3/4)^16 = 1.00 × 10^−2,約 99.0% 的信心。想達到一維抽八次的 1/369 水準,二維需要抽到 k ≥ ln(0.0027)/ln(0.75) ≈ 20.6,也就是二十一次。二維的代價是要抽更多次,換來的好處是編碼錯誤的 fraud proof 只需要一行或一列,不是整個區塊——這是一個很清楚的交換,不是誰比誰先進。

KZG:讓糾刪碼自我驗證,以及與二維 Reed-Solomon 的分水嶺

上面的推導有一個隱藏假設:抽到的份額是真的。如果 block producer 交出一堆亂數當份額,你抽再多次也是白抽——你抽到了,但它們不是有效碼字,拼不回原始資料。所以任何 DAS 方案都必須解決「編碼正確性」。這裡有兩條路,而它們就是以太坊/Avail 與 Celestia 的真正分水嶺。

Celestia 走 Merkle + fraud proof。 份額用 namespaced Merkle tree 承諾(NMT:每個節點標記其子樹的最小與最大 namespace,好處是任何 rollup 只需下載自己 namespace 的資料,可以忽略別人的)。Merkle 承諾不能證明編碼正確,所以需要「編碼錯誤 fraud proof」——某個全節點發現某行解不出來,把那一行的證據廣播出去。代價是輕節點必須連著至少一個誠實全節點,而且要有一段挑戰窗口才能定案(Celestia 的 DA 定案在無人提出有效 fraud proof 後約十分鐘級別;已標存疑,版本間有變動)。

以太坊與 Avail 走 KZG,讓編碼自我驗證。 把 blob 的四〇九六 個域元素看成一個次數小於 4096 的多項式在單位根上的取值,KZG 承諾是這個多項式的一個 G1 點,四十八位元組。糾刪碼延伸不是「額外加冗餘」,而是把同一個多項式在更多點上求值——延伸到 8192 個點,任意 4096 個取值就唯一決定這個多項式。關鍵性質:任何一個能對承諾驗證通過的 cell,在構造上就是那個被承諾的多項式的取值。編碼錯誤在密碼學上不可能存在,不需要 fraud proof,不需要挑戰期,也不需要連著誠實全節點。

PeerDAS 的實際切法:FIELD_ELEMENTS_PER_CELL = 64,所以一個 cell 是 64 × 32 = 2048 位元組 = 2 KiB;原始 blob 是六十四個 cell,CELLS_PER_EXT_BLOB = 128,延伸後一二八個 cell,共 256 KiB。一個 column 就是「這個區塊裡所有 blob 的第 i 個 cell」——所以 column 是橫切所有 blob 的縱剖面,不是某一個 blob。目標十四個 blob 時,一個 column = 14 × 2 KiB = 28 KiB。

這裡有一個算術值得親手算,因為它解釋了 EIP-7594 那句「1/8 of the total data」到底以什麼為分母。 八個 column = 8 × 28 KiB = 224 KiB;整個區塊的 blob 原始資料是 14 × 128 KiB = 1,792 KiB;224/1792 = 1/8。所以那個 1/8 的分母是未延伸的原始資料;若以延伸矩陣(3,584 KiB)為分母,八個 column 只佔 1/16。同理 CUSTODY_REQUIREMENT = 4 的四個 column = 112 KiB = 原始資料的 1/16、延伸矩陣的 1/32。看到「1/8」「1/16」「1/32」三個數字在不同文章裡互相矛盾時,九成是分母不同,不是誰寫錯。

KZG 的兩個真實代價要記住。第一,信任設定:KZG 需要一組結構化參考字串(powers of tau),以太坊為此辦了一場大規模公開儀式,只要有一位參與者銷毀了自己的隨機數就安全(1-of-N),但這仍然是一個 Merkle/雜湊方案不需要的假設(確切貢獻份數我不引用,已標存疑)。第二,證明計算很貴:每個 blob 需要 CELLS_PER_EXT_BLOB = 128 個 cell proof,每個四十八位元組,合計 6,144 位元組——相對一二八 KiB 的 blob 是 4.69% 的額外傳輸量。而計算這些證明貴到不能放在出塊的關鍵路徑上,所以 EIP-7594 直接把它推給交易發送方:blob 交易的 p2p wrapper 改成 rlp([tx_payload_body, wrapper_version, blobs, commitments, cell_proofs]),wrapper_version = 1。這是一個很少被提到但很有代表性的設計選擇:把成本推給誰,是 DA 設計的一半內容。

更正二:Fusaka 實際上線的是 custody sampling,不是 EIP-7594 安全表格裡的 peer sampling

這是今天查證下來最需要更正的一點,而它幾乎不會出現在任何中文介紹裡。

EIP-7594 的 Security Considerations 給了一個漂亮的機率界:設 n 為全網抽樣節點數、m 為可能樣本總數(NUMBER_OF_CUSTODY_GROUPS)、k 為每個節點最少抽樣數(SAMPLES_PER_SLOT),則「說服全網 ε 比例的節點相信被扣留的資料是可得的」機率有一個組合上界。EIP 用主網參數、假設一萬個節點列了一張表:ε = 0.01(騙一百個節點)上界是 1;ε = 0.02(騙兩百個)是 10^−20.04;ε = 0.03 是 10^−101.55;ε = 0.05 是 10^−306.34。

這張表被大量引用,但它描述的是 peer sampling——節點每個 slot 向對等節點隨機索取 column 的機制。而 peer sampling 在二〇二五年六月被從 Fusaka 的範圍裡移除了(consensus-specs PR #4393,標題就是 “Remove peer sampling in Fulu”,說明寫 “as it is replaced by custody sampling”;Lighthouse、Teku 等客戶端隨後刪掉了對應程式碼)。Fusaka 上線的是 custody sampling:節點根據自己的 node ID 訂閱一組確定性的 column 子網,從 gossip 收到這些 column 就視為通過可得性檢查。

差別在哪裡?隨機性的來源不見了。 peer sampling 的查詢是每 slot 新抽的、攻擊者事前不知道;custody sampling 的分配是 node ID 的確定函數,node ID 在 discovery 層是公開可枚舉的。理論上,攻擊者可以先枚舉節點、算出每個節點負責哪幾個 column,再挑一組六十三個 column 發布,使某個特定子集的節點剛好全部滿足。上一節的 1/369 依然描述「隨機一個節點被騙的比例」,但它不再描述「攻擊者無法選擇騙誰」——這一步推論是我自己的分析,不是 EIP 的原文,請當成需要進一步查證的推測。

即使如此,結論不是「PeerDAS 不安全」,而是「安全性論證的形狀不一樣」。因為:一萬個節點裡約 2.71 × 10^−3 會被騙,期望約二十七個;這二十七個節點的證明權重約 0.27%,遠遠不足以讓區塊定案。custody sampling 保護的是「鏈不會定案在扣留資料的區塊上」,不保護「你的節點不會是那二十七個之一」。 這是一個必須內化的更正:DAS 給你的不是個體確定性,是集體活性。如果你的服務是根據自己節點的判斷來決定要不要付款、要不要放行提款,你就是在用 0.27% 那一側的機率下注,而協定從來沒承諾過保護你。

順便補一個懸而未決的細節:EIP-7918 的內文列了「full node 驗四個保管 column、每 slot 再 peer-sample 八個」;peer sampling 移除後,一個不掛驗證者的普通全節點在 Fusaka 主網上每 slot 究竟觸及四個還是八個 column,我沒有查到權威的收斂說法,已標存疑。已能確認的是 CUSTODY_REQUIREMENT = 4SAMPLES_PER_SLOT = 8VALIDATOR_CUSTODY_REQUIREMENT = 8,而掛驗證者的節點保管量隨有效餘額往上長(BALANCE_PER_ADDITIONAL_CUSTODY_GROUP 為 32 ETH 級別),最多到一二八個 column。

費用市場:EIP-7918 的保留價,以及 blob 為什麼幾乎不燒錢

Fusaka 帶進來的 EIP-7918 修掉了 blob 費用市場一個結構性的壞掉之處。原本的機制假設 blob base fee 就是價格訊號,可以用它調控需求量。但當 rollup 的成本被執行層 gas、ZK 驗證、priority fee 主導時,blob base fee 佔總成本可能不到百萬分之一——它降 10%,rollup 的實際成本變動 0.0000001%,需求曲線在那個區間是完全垂直的。機制於是一路降到 1 wei 的地板,失去所有訊號能力;需求一回來,要一個多小時的滿載區塊才能把價格拉回均衡,中間退化成第一價格拍賣。

EIP-7918 的修法只是在 calc_excess_blob_gas() 裡加一個 if:

if BLOB_BASE_COST * parent.base_fee_per_gas
   > GAS_PER_BLOB * get_base_fee_per_blob_gas(parent):
    # 不扣除 target_blob_gas,只讓 excess 按用量往上走

BLOB_BASE_COST = 2^13 = 8192,所以保留價與執行層基礎費的比例被固定為 BLOB_BASE_COST / GAS_PER_BLOB = 8192/131072 = 1/16白話:一個 blob 的價格永遠不低於八千一百九十二 單位執行層 gas。 執行層基礎費十 Gwei 時,一個 blob 至少值八萬一千九百二十 Gwei,約十萬分之八點二枚以太幣。這個保留價還有第二個功能:節點驗證 KZG 證明是實在的算力支出(EIP-7918 量測 EL 記憶池對單一 blob 批次驗證一二八 個 cell proof,約是一次 point evaluation precompile 的十五倍),讓 blob 消費者至少付一點算力的市價。

把這個保留價和燒毀量放在一起看,會得到一個很反直覺的結論。 上限二十一個 blob、執行層基礎費十 Gwei、gas limit 六千萬:blob 側燒 21 × 8,192 × 10 Gwei ≈ 一百七十二萬 Gwei,約千分之一點七枚以太幣;執行側燒 60,000,000 × 10 Gwei = 零點六枚以太幣。blob 在保留價下只佔全區塊燒毀的約 0.29%。 EIP-7918 自己也算過對照組:一千個 blob 配三千萬 gas 時,blob 側才會佔到 21.5%——那不是以太坊目前的軌跡。所以「blob 擴容會吃掉 ETH 的價值捕獲」和「blob 費用會撐起 ETH 燒毀」兩種說法,在現行參數下都站不住。

漲跌不對稱那件事也可以算完。BLOB_BASE_FEE_UPDATE_FRACTION 在 Pectra 是 5,007,716(Dencun 是 3,338,477)。若 BPO 沒有動它,目標十四、上限二十一之下,單一滿載區塊最多讓 blob base fee 乘上 exp(917,504/5,007,716) = 1.201(+20.1%),單一空區塊最多乘 exp(−1,835,008/5,007,716) = 0.693(−30.7%)。若 BPO 按目標等比放大到約 11,684,671,則是 +8.2% 與 −14.5%,和 Pectra 時代的相對反應速度一致。EIP-7892 明確允許 BPO 調整 baseFeeUpdateFraction,所以 BPO1/BPO2 之後的實際值我沒有查到權威來源,已標存疑——但兩種情境的算式都在上面,查到值代進去就好。

鏈外 DA 的信任假設:DAC、validium,以及 Celestia / EigenDA / Avail 的三種失效模式

Data availability committee 的機制極其簡單:一組已知的成員收到資料、各自簽一份「我持有這批資料」的聲明,把聚合簽名交上 L1;L1 合約驗證簽名數達到門檻,就放行狀態根。L2BEAT 上可以看到具體門檻,例如 Astar zkEVM 的證明「完全依賴未上鏈的資料」,由一個 3/5 門檻的 DAC 負責保管與供應。Polygon CDK 系的 validium 大量採用這個模式。

問題不在門檻高低,在於簽名是一個聲明,不是一個證明。「我持有資料」在密碼學上是不可證的——你能證明你知道某個 preimage,但你不能證明你未來願意把它給別人。所以 DAC 的保證是:如果門檻以上的成員同時說謊或同時離線,資料就沒了,而合約會照樣放行狀態根。這跟 DAS 有一個範疇上的差別:DAS 的失敗是機率性的、可以靠增加抽樣次數壓低;DAC 的失敗是二元的、只能靠增加成員數和法律/聲譽約束壓低。 你不能靠「多驗幾次」把 3/5 變成安全。

另一個常被跳過的點:DAC 通常是許可制且成員固定,所以它同時是審查向量。願意扣資料的門檻集合,也是願意選擇性拒絕服務某些地址的門檻集合。昨天講 Linea 的 FORCED_TRANSACTION_SENDER_ROLE 沒人持有時我說「逃生艙形同不存在」;DAC 的對應版本是「逃生艙存在,但門後面那個人可以決定要不要把地圖給你」。

所以昨天那三個前提要改寫。對 validium 來說,「資料可得」這一格不該打叉也不該打勾,而該寫成:在 DAC 門檻以下的成員合作之下可得,且沒有任何鏈上機制能在事後證明當時可得。這比布林值誠實得多。

把視角從「名單型 DAC」拉到專門的 DA 層,信任假設的形狀就開始分化。下面三家常被並排比價格與吞吐,但真正該比的是壞掉的時候你手上剩什麼

編碼正確性輕節點能否獨立驗證可得性主要失效模式
Celestia二維 Reed-Solomon + NMT,靠編碼錯誤 fraud proof可,至少十六次抽樣,需連著誠實全節點Tendermint 超過 1/3 停擺即停鏈;無誠實全節點時輕節點失效;Blobstream 橋本身是額外信任
EigenDAKZG 承諾 + disperser 生成開啟證明現況不可,輕節點是可觀測性路線圖質押權重的簽名門檻串謀;罰沒需要一條能用的挑戰路徑;disperser 是中心化元件
AvailKZG 有效性證明,無需 fraud proof可,少數常數次查詢即可,有 P2P 輕節點網路NPoS 驗證者集合與 GRANDPA 定案;吞吐量目前偏小;跨鏈橋為額外信任

Celestia 的模型最像「一條為 DA 而生的鏈」。它把 DA 做成共識層的一等公民:區塊資料就是可抽樣的方陣,輕節點抽十六次就能判斷。二〇二六年的 Matcha(v6)升級把最大區塊從 8MB 拉到 128MB、資料方陣從 128 拉到 512、單筆交易上限從 2MB 到 8MB(是否已在主網全量生效,已標存疑)。它的兩個結構性弱點:一是 Tendermint 家族的活性特徵,超過三分之一的驗證者掉線就停鏈,對 DA 層來說「停鏈」等於「新資料無法發布」;二是對 Ethereum 上的 rollup 而言,Celestia 的共識結論要透過 Blobstream 之類的橋接回 L1,那個橋是一個獨立的信任元件,而 L2BEAT 正是用有橋/無橋分別列項的

EigenDA 是三者中信任假設最重、吞吐宣稱最高的。V2 把控制面與資料面分開:disperser 只把 blob header 批次推給 DA 節點,節點驗過付費與速率限制後,再回頭向 disperser 索取實際資料分片。L1 上驗的是「簽名者的總質押達到門檻」——由 StakeRegistry 取得權重、門檻百分比寫在 batch header 裡。注意這句話的邏輯強度:鏈上驗證的是「足夠的質押聲明自己持有資料」,不是「資料可得」。 這在範疇上仍然是 DAC,只是成員是質押權重而不是名單,約束是罰沒而不是聲譽。EigenDA 確實用 KZG 承諾與開啟證明讓節點能驗證自己那份分片和 Reed-Solomon 編碼的正確性,這比純簽名強;但輕節點的角色目前是「讓扣留變得可被廣泛觀測」的路線圖項目,不是已上線的獨立驗證能力。它的失效模式是:門檻以上的質押串謀扣資料,而罰沒的實現需要一條真的能被觸發的挑戰路徑。

Avail 在密碼學上是三者中最乾淨的:KZG 有效性證明代替 fraud proof,所以輕節點不需要挑戰期、不需要誠實全節點就能取得接近確定的可得性判斷,常數次查詢即可。代價在別處:NPoS + BABE/GRANDPA 的驗證者集合是活性與安全的單點,而吞吐量遠小於它的行銷數字暗示的規模(可查到的區塊空間量級是個位數 MB 級,對照 Celestia 的 128MB 目標;具體數值各來源不一,已標存疑)。它的失效模式集中在共識層與跨鏈橋,不在 DA 的密碼學。

把三者放在一起,真正的分辨不是「誰更快」,而是「當事情壞掉時,你手上剩什麼」。 以太坊 DA 壞掉的意思是以太坊共識壞掉。Celestia 壞掉的意思是你需要一個誠實全節點,而橋可能已經停了。EigenDA 壞掉的意思是你要去看罰沒有沒有真的執行。Avail 壞掉的意思是它的驗證者集合出事了。這四種「壞掉」的補救難度不在同一個量級,而所有把 DA 層並排比較吞吐與價格的表格,都不會告訴你這件事。

更正三:「可得」不等於「可取回」,EIP-4444 是另一個問題

這是最後也最重要的分辨,而它是我昨天最大的盲點。

DA 保證的命題是:在資料發布的那個時點,有足夠多的誠實參與者能把資料交給任何索取者。 它是一個關於當時的命題。它不是、也從來不打算是「這份資料永久可讀」。以太坊的 blob 把這件事寫進了協定:4096 epochs、約十八天,之後共識層節點就可以刪。blob 不是「後來被清掉」的,它是生下來就會過期的——這正是它比 calldata 便宜一個數量級的原因,因為節點只承諾存十八天,不是永遠。

「你以後拿得回來嗎」是另一個問題,叫 historical retrievability,對應的路線是 EIP-4444(Bound Historical Data in Execution Clients)及其後續的 EIP-7927(History Expiry Meta)。EIP-4444 的方向是:執行層客戶端停止在 p2p 層提供超過約一年的歷史 header、body、receipt,並可在本地修剪。二〇二五年七月的 partial history expiry 已經讓所有主流執行層客戶端支援丟棄 Merge 之前的區塊主體與收據,節點省下三百到五百 GB;完整的滾動一年窗口留給未來的分叉(以太坊基金會二〇二六年二月的 Protocol 路線更新把 history expiry 明確列在 Scale track 的短期項目裡)。注意:EIP-4444 管的是執行層歷史,blob 的十八天是共識層規則,兩者是獨立的兩套修剪。blob 早就在過期了,EIP-4444 還沒完全落地。

那麼「以後拿得回來」由誰負責?協定不負責,生態負責。 這是一個刻意的分工:協定只保證足夠長的可得性窗口讓所有需要即時驗證的機制(挑戰期、強制收錄、逃生艙)有時間跑完,長期歸檔留給有動機的人去做——區塊瀏覽器與索引服務(Blockscout 表示無限期保存 blob;The Graph 做 blob 索引與長期存取;BNB Greenfield 上有歷史 blob 歸檔專案),Portal Network 這類 P2P 歷史分發網路是長期的協定側答案(成熟度已標存疑),以及最該做但最常沒做的一方——rollup 自己

這一段的執行意義,就是昨天那張逃生艙表要補的第四個前提。 昨天寫「逃生艙有三個前提:資料可得 + 有人算得出證明 + L1 有獨立驗證路徑」。今天要加上:這三個前提裡的第一個是有時效的。更精確的版本是:你需要「從你信任的最後一個狀態根,到現在」這整段區間的批次資料。強制收錄本身安全(走 L1 calldata,永久);排序者當機一週安全(blob 還在);但如果一條鏈實質死亡、你三個月後才回頭要提款,而那三個月的 blob 沒人歸檔,你就進入一個不是密碼學能解決的處境——你需要的不是證明,是一個願意把資料給你的人。這時 DA 的所有機率保證都與你無關,因為它們保證的是十八天前的世界。

所以最後把定義收乾:data availability 保證的是「當時有人能拿到」,而且是機率性的、主觀的、有期限的。它不保證你以後拿得回來。後者叫 historical retrievability,協定不提供,你得自己安排。 這一句話,是我昨天把「資料可得」寫成一格勾選框時漏掉的全部內容。

🧠 記

  • 一個 blob 是 4096 個 BLS12-381 域元素 × 32 位元組 = 131,072 位元組 = 一二八 KiB;實務打包 31/32 位元組,可用約 126.98 KiB。
  • 最後可查證的 blob 參數是二〇二六年一月七日 BPO2 之後的目標十四、上限二十一(每 slot 目標 1.75 MiB、上限 2.625 MiB,持續吞吐約每秒 149 KiB);Checkpoint #8 說 BPO3 在 blob 用量上來前不是優先事項,九月三日當下是否仍是 14/21,已標存疑
  • blob 只保證 MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS = 4096 epochs = 131,072 slots = 18.2 天。這個數字的下限來自樂觀 rollup 的七天挑戰期。
  • 十八天窗口在目標十四之下是 1,835,008 個 blob = 224 GiB;延伸矩陣 448 GiB;但 CUSTODY_REQUIREMENT = 4 的全節點只需 448 × 4/128 = 14 GiB。DAS 賣的就是這條吞吐與儲存的解耦。
  • 抽樣機率的底數來自碼率:一維碼率 1/2 → 漏檢上界 (1/2)^k;二維 Reed-Solomon → (3/4)^k。PeerDAS 無放回精算 C(63,8)/C(128,8) = 2.71 × 10^−3 ≈ 1/369;Celestia 輕節點十六次 = (3/4)^16 ≈ 1.0%。
  • KZG 讓糾刪碼自我驗證:通過承諾驗證的 cell 必然是被承諾多項式的取值,所以不需要編碼錯誤的 fraud proof、不需要挑戰期、不需要連著誠實全節點。代價是 powers-of-tau 信任設定,以及每 blob 一二八 個 cell proof(6,144 位元組,約 4.69% 額外傳輸)。
  • Fusaka 上線的是 custody sampling,不是 peer sampling。 peer sampling 在 consensus-specs PR #4393 被移出 Fulu 範圍,客戶端也刪掉了程式碼。所以 EIP-7594 那張 ε = 0.02 → 10^−20.04 的安全表格,描述的不是主網現在跑的東西。
  • DAS 保護的是「鏈不會定案在扣留資料的區塊上」,不保護「你的節點不是被騙的那 0.27%」。集體活性,不是個體確定性。
  • 以太坊 L1 合約無法驗證任何 blob 的可得性——執行層只看得到 blob_versioned_hash,BLOBHASH 讀雜湊、0x0A 的 point evaluation precompile(50000 gas)驗承諾開啟。可得性是被質押權重的投票行為執行的,不是被合約驗證的。
  • EIP-7918 的保留價:BLOB_BASE_COST = 2^13 = 8192,比例固定為 8192/131072 = 1/16——一個 blob 永不低於八千一百九十二 單位執行層 gas 的價格。二十一個 blob 配六千萬 gas 時,blob 只佔全區塊燒毀約 0.29%
  • blob 費用市場漲跌不對稱:漲的分子是 (max − target) × 131,072、跌的分子是 target × 131,072,跌幅步長是漲幅的兩倍。以 Pectra 的 5,007,716 代入 14/21 是 +20.1% / −30.7%;若 BPO 等比放大到約 11,684,671 則是 +8.2% / −14.5%(實際值已標存疑,EIP-7892 允許 BPO 改 baseFeeUpdateFraction)。
  • DAC 的失敗是二元的,不是機率性的:「我持有資料」是聲明不是證明,你無法靠多抽幾次把 3/5 門檻變安全。DAC 同時是審查向量。EigenDA 在範疇上仍是 DAC,只是成員是質押權重。
  • DA ≠ historical retrievability。 blob 是設計上會過期的;EIP-4444 / EIP-7927 管的是執行層一年滾動窗口,和 blob 的十八天是兩套獨立的修剪。長期歸檔協定不管,生態與 rollup 自己管。
  • 逃生艙的第四個前提:你需要「從你信任的最後一個狀態根到現在」這整段的批次資料。強制收錄走 calldata(永久)安全,但重算狀態要 blob(十八天)。

✍️ 實踐

今天做四件事,十五到三十分鐘,不需要跑節點。

一、把抽樣機率親手算一次(五分鐘)。 開一個 Python REPL:

from math import comb, log
# PeerDAS:128 個 column、重建門檻 64、攻擊者最多發布 63、抽 8 次
comb(63, 8) / comb(128, 8)          # 預期 ≈ 0.00271
2 ** -8                              # 粗略上界 0.00390,比精算差一點
# 二維 Reed-Solomon(Celestia 型):單次漏檢上界 3/4
0.75 ** 16                           # 預期 ≈ 0.01002
# 要用二維達到一維抽 8 次的水準,需要抽幾次?
log(comb(63, 8) / comb(128, 8)) / log(0.75)   # 預期 ≈ 20.6,取 21

看到 0.002710.01002 這兩個數字自己跑出來,你就不會再把「抽樣」當成一句口號。順手改 comb(63, k) 的 k 值,看要抽幾次才進 10^−9(答案在三十次附近)。

二、去 L2BEAT 查一條你有真錢在上面的鏈(十分鐘)。 打開 l2beat.com/scaling/data-availability,找到那條鏈,看三件事:(a) DA 欄位寫的是 Ethereum(blobs)、Ethereum(calldata)、DAC,還是某個外部 DA 層;(b) 如果是 DAC,門檻是幾比幾、成員是誰、成員身分是否公開;(c) 如果是外部 DA 層,再去 l2beat.com/data-availability 看那個 DA 層是走「有橋」還是「無橋」的項目——橋是額外的信任元件。把這三格抄進你的筆記,和昨天那張強制收錄表併排。

三、看一個真的 blob,並確認過期是真的(五到十分鐘)。blobscan.com,隨便點一個最近的 blob:記下它的 versioned hash(以 0x01 開頭,那是 KZG 承諾的版本化雜湊)、大小(應該是 131,072 位元組)、以及它屬於哪個 rollup。然後往回翻到十八天以前的 blob,看瀏覽器怎麼標示它——瀏覽器還給得出資料,是因為瀏覽器自己歸檔了,不是因為共識層還有。這個區別就是今天整篇文章的縮影。

四、算你自己關心的那條鏈的 DA 預算(五分鐘)。 用第二節的公式:每個 blob 131,072 blob gas;查一下當前 blob base fee(blobscan 或 etherscan 都有);算出一個 blob 的以太幣成本。然後查那條鏈一天用掉幾個 blob,乘起來。再用 EIP-7918 的地板檢查一次:執行層基礎費 ÷ 16 就是 blob base fee 的下限,看目前的價格是「真的有需求」還是「貼在保留價上」。如果貼在保留價上,那條鏈的 DA 成本目前是被 L1 執行層費用而不是 blob 需求決定的,這會直接影響你對它成本結構的判斷。

自我檢查

  1. 我能不看筆記說出:為什麼沒有糾刪碼的話,隨機抽樣完全無效?(關鍵詞:藏 1% 也是不完整)
  2. 我能說清楚「1/8 of the total data」的分母是什麼,以及為什麼別的文章寫 1/16 或 1/32 不一定是錯的?
  3. 我能指出 EIP-7594 那張 ε 安全表格描述的機制,和 Fusaka 主網現在跑的機制,差在哪一個字?
  4. 我能回答:一條 rollup 的 L1 合約,用哪個 opcode 或 precompile 可以驗證某個 blob 曾經可得?(正確答案是:沒有。)
  5. 我能說出逃生艙的第四個前提,以及它的時效是幾天、由哪一個共識層常數決定?

🔗 延伸學習

💬 問 AI

我在查資料可得性(data availability)的保證邊界,以下是我今天整理的數字與主張。
請逐條檢查,對的說對,錯的指出錯在哪並給出正確值與出處連結。
查不到就直接說「查不到」,不要用推測填空,也不要幫我圓場。
今天是 2026-09-03。
 
【參數類】
1. 一個 EIP-4844 blob 是 4096 個 BLS12-381 域元素 × 32 位元組 = 131,072 位元組 = 128 KiB;
   實務上每 32 位元組只用 31 位元組裝資料,可用約 126.98 KiB。
2. blob 保留期是 MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS = 4096 epochs
   = 131,072 slots = 18.2 天。
3. 最後一次 BPO 是 2026-01-07 的 BPO2,把 blob 目標從 10 改到 14、上限從 15 改到 21。
   請告訴我:2026-09-03 當下主網的 blob target / max 實際值是多少?BPO3 有沒有上線?
4. BLOB_BASE_FEE_UPDATE_FRACTION 在 Pectra 是 5,007,716、Dencun 是 3,338,477。
   請告訴我 BPO1 / BPO2 之後 blobSchedule.baseFeeUpdateFraction 的實際值。
5. EIP-7918 的 BLOB_BASE_COST = 2^13 = 8192,所以保留價比例是 8192/131072 = 1/16。
 
【PeerDAS 類】
6. NUMBER_OF_COLUMNS = NUMBER_OF_CUSTODY_GROUPS = 128;CELLS_PER_EXT_BLOB = 128;
   FIELD_ELEMENTS_PER_CELL = 64,所以一個 cell 是 2048 位元組。
7. CUSTODY_REQUIREMENT = 4、SAMPLES_PER_SLOT = 8、VALIDATOR_CUSTODY_REQUIREMENT = 8。
8. peer sampling 已在 consensus-specs PR #4393 被移出 Fulu / Fusaka 範圍,
   改由 custody sampling 取代。所以 EIP-7594 Security Considerations 那張
   「ε = 0.02 → 上界 10^-20.04」的表格,描述的不是 Fusaka 主網實際運行的機制。
9. 承上:一個不掛驗證者的普通全節點,在 Fusaka 主網上每 slot 實際觸及幾個 data column?
   4 個還是 8 個?這一點我標了存疑,請給我權威來源。
 
【機率推導】
10. 一維碼率 1/2:成功的扣留攻擊必須讓可取得份額 |A| ≤ N/2 - 1,
    所以無放回抽 k 次被騙的機率是 C(|A|,k)/C(N,k)。
    代 N=128、|A|=63、k=8 得 2.71e-3 ≈ 1/369。請驗算。
11. 二維 Reed-Solomon:不可重建的方陣至少要藏 (k+1)^2 / (2k)^2 ≈ 1/4,
    所以單次漏檢上界是 3/4,抽 16 次是 (3/4)^16 ≈ 1.0%。請驗算並確認
    Celestia 輕節點的最小抽樣次數是否真的是 16。
12. 儲存量:18 天 × 目標 14 blob = 1,835,008 個 blob = 224 GiB;
    延伸矩陣 448 GiB;custody 4/128 的全節點約 14 GiB。請驗算。
 
【概念主張 —— 這幾條請特別嚴格】
13. 以太坊 L1 上沒有任何 opcode 或 precompile 能讓合約驗證某個 blob 曾經可得;
    可得性是由共識層分叉選擇(驗證者拿不到 column 就不投票)執行的,
    不是由合約驗證的。這個說法對嗎?
14. DAS 保證的是「鏈不會定案在扣留資料的區塊上」,不保證「我的節點不是被騙的那一小撮」。
    以一萬個節點、單節點被騙機率 2.71e-3 計,期望約 27 個節點被騙、約佔 0.27% 權重。
    這個推論成立嗎?
15. EigenDA 在 L1 上驗證的是「簽名者總質押達到門檻」,所以它在範疇上仍是 DAC,
    只是成員身分由質押權重決定。這個歸類公平嗎?EigenDA 的輕節點 DAS 是否已上線?
16. data availability 保證的是「發布當時有人能拿到」,不保證「你以後拿得回來」;
    後者是 historical retrievability,對應 EIP-4444 / EIP-7927,協定不提供,
    要靠生態與 rollup 自己歸檔。而 blob 的 18 天是共識層規則,
    EIP-4444 的一年滾動窗口是執行層規則,兩者獨立。這組分辨準確嗎?
 
【最後】
17. Glamsterdam 的實際上線狀態與時程(我看到「2026 上半年」和「Q3/H2 2026」兩種說法),
    以及它對 blob 容量的影響。
18. Celestia Matcha(v6)的 128MB 區塊是否已在主網全量生效?
19. 上面 19 條裡,哪一條是我最可能在半年內因為參數變動而說錯的?為什麼?