newsence
來源篩選

ERC-8180: Blob Authenticated Messaging (BAM)

Ethereum Magicians

This ERC proposes a standardized interface for decentralized authenticated messaging using EIP-4844 blobs to achieve high-throughput data availability at a lower cost. It introduces a modular architecture that separates message decoding from signature verification to ensure security and interoperability across different protocols.

newsence

ERC-8180:Blob 驗證訊息傳遞 (BAM)

Ethereum Magicians
大約 14 小時前

AI 生成摘要

本 ERC 提議為使用 EIP-4844 blob 的去中心化驗證訊息傳遞定義標準介面,旨在以較低成本實現高吞吐量的資料可用性。它引入了一種模組化架構,將訊息解碼與簽名驗證分離,以確保不同協議之間的安全性與互操作性。

ERC-XXXX: Blob 認證訊息 (BAM)

類別: ERCs | 類型: 標準軌道 (Standards Track) | 狀態: 草案 (Draft)

作者: Vitalik Buterin (), Skeletor Spaceman ()

摘要

本 ERC 定義了基於 EIP-4844 Blob 的去中心化認證訊息介面。核心註冊介面擴展了 ERC-BSS(Blob 空間分段),增加了解碼器指標(decoder pointer)和簽名註冊表指標(signature registry pointer):解碼器是一個不受信任的鏈上合約,用於從負載中提取訊息;簽名註冊表是一個受信任的合約,用於驗證簽名。將解碼與驗證分離可確保錯誤或惡意的解碼器無法導致冒充——它只能產生錯誤的訊息,而這些訊息將無法通過受信任註冊表的簽名驗證。支援介面標準化了多方案金鑰管理(ECDSA、BLS、STARK 等)和鏈上訊息證明。

問題

以太坊可以作為通用的認證訊息媒介。EIP-4844 Blob 每個提供 128 KiB 的數據可用性,且成本僅為 calldata 的一小部分。透過壓縮,單個 Blob 可以容納數千條訊息——在 9 倍壓縮率下,以目前的 Blob 吞吐量,每天可實現 4.98 億條訊息。

目前尚無鏈上介面的標準。每個實作都定義了自己的:

  • 批次註冊事件(索引器如何發現新的訊息批次)
  • 訊息編碼(客戶端如何解碼批次負載)
  • 金鑰管理合約(用戶如何註冊簽名金鑰)
  • 證明機制(單個訊息如何在鏈上被證明)

現有標準並未解決此問題:

  • (Poster):基於事件的極簡社交合約,不具備 Blob 感知能力,已停滯
  • :基於 NFT 的社交媒體,未使用 Blob
  • Farcaster/Lens:特定於 L2,未標準化為 ERC

如果沒有共享介面,索引器無法追蹤跨實作的訊息提交,客戶端無法解碼來自其他協議的訊息,錢包無法跨應用程式管理簽名金鑰,智慧合約也無法對來自不同協議的認證訊息做出反應。

設計原則

任何人皆可讀取。 擁有以太坊節點並能存取 Blob 數據的客戶端,應能解碼來自任何合規實作的訊息。批次註冊事件包含一個解碼器地址,指向一個從負載中提取訊息的鏈上合約。私有編碼會產生中心化壓力;可發現的鏈上解碼器則能防止這種情況。

最小化捕獲。 沒有特權解碼器、註冊表或守門人。解碼器合約的部署是無需許可的。解碼器地址是每次提交的參數,而非全局常量。不同的實作使用不同的解碼器。沒有任何因素能阻止分叉解碼器合約並部署修改版本。

設計摘要

解碼器合約 (IERC_BAM_Decoder)

解碼器合約從負載中提取訊息和簽名數據。給定來自 Blob 分段或 calldata 批次的原始位元組,它會返回解碼後的訊息和原始簽名位元組。解碼器是不受信任的:說謊的解碼器會產生錯誤的訊息,其雜湊值將無法通過受信任註冊表的驗證。解碼器不負責驗證簽名。

decode 返回所有訊息(發送者 + nonce + 內容)和不透明的簽名位元組(例如,聚合的 BLS 簽名或串聯的 ECDSA 簽名)。客戶端隨後計算標準化的訊息雜湊,並針對受信任的註冊表進行驗證。這種分離意味著有錯誤的解碼器可能會導致偽陰性(拒絕有效訊息),但絕不會導致偽陽性(接受偽造訊息)。

v1 解碼器應使用簡單的編碼(ABI 編碼數組、RLP 或 SSZ)。複雜的壓縮(基於字典、增量編碼)可以在以後的解碼器版本中引入。該介面與編碼無關;具有鏈上解壓縮功能的 v2 解碼器實作相同的函數。

核心註冊 (IERC_BAM_Core 擴展 IERC_BSS)

核心介面擴展了 ERC-BSS(Blob 空間分段)。registerBlobBatch 在一次調用中聲明 Blob 分段並註冊批次及其解碼器和簽名註冊表:

registerBlobBatch 在內部調用 declareBlobSegment(繼承自 IERC_BSS),為 BSS 索引器觸發 BlobSegmentDeclared 事件,然後為 BAM 索引器觸發帶有解碼器和簽名註冊表地址的 BlobBatchRegistered 事件。兩個事件,一次調用,分段與批次之間具有明確的關聯。

registerCalldataBatch 允許在沒有聚合器的情況下進行自我發佈。使用相同的解碼器和簽名註冊表指標;無需分段聲明(calldata 沒有 Blob)。

簽名註冊表 (IERC_BAM_SignatureRegistry)

適用於 ECDSA、BLS、STARK 及未來方案的通用介面:

此為簡略版;完整介面還包括 pubKeySize()signatureSize()verifyWithRegisteredKey()。每種簽名方案部署自己的註冊表。方案 ID:0x01=ECDSA, 0x02=BLS12-381 等。所有權證明(Proof of possession)可防止惡意金鑰攻擊。聚合支援是按方案選擇性開啟的。

訊息揭露 (IERC_BAM_Exposer)

用於在鏈上證明單個訊息的標準化事件:

expose() 函數本身標準化;它因證明類型(KZG、ZK、Merkle)和簽名方案而異。該事件是互操作性的介面:任何揭露器,無論機制如何,都會觸發 MessageExposed

關鍵設計決策

BAM 擴展 BSS。 最初的設計定義了不帶分段座標的 registerBlobBatch(blobIndex)。當與其他協議共享 Blob 時,調用者需要單獨的 BSS 調用。對兩個合約進行兩次調用會產生關聯問題:一個具有 N 個分段的共享 Blob 會產生 N 個 BlobSegmentDeclared 事件和一個 BlobBatchRegistered 事件,且都引用同一個 versioned hash。繼承 IERC_BSS 消除了歧義。一次調用,兩個事件,明確關聯。

信任分離:解碼器 vs 註冊表。 最初的設計將解碼和驗證捆綁在單個「schema」合約中。如果客戶端信任一個惡意的 schema,任何人都可以冒充任何地址。解決方案:解碼器(不受信任,數量多)提取訊息;註冊表(受信任,約 4 個)驗證簽名。說謊的解碼器會產生錯誤的雜湊,導致驗證失敗——產生偽陰性,但絕不會產生偽陽性。

鏈上解碼器發現。 傳統方法將解碼邏輯嵌入在鏈外客戶端中。如果協議更改其編碼,每個客戶端都需要更新。鏈上解碼器反轉了這一點:解碼器在鏈上,可審計,且可被任何合約或客戶端調用。解碼器地址在註冊事件中觸發,僅憑事件日誌即可發現。

無單例要求。 BAM 合約不需要共享的單例部署。每個部署從其自己的地址觸發 BlobSegmentDeclared。以太坊事件主題是全局索引的;索引器按主題雜湊過濾,而非按合約地址。

零存儲核心。 僅限事件,無 SSTORE。註冊成本約為 5,900 gas(分段驗證 + 兩次 LOG4 事件觸發),而使用存儲則需 25,000+ gas。在最便宜的 Blob 交易中,開銷低於 29%。

通用簽名註冊表。 所有方案共用一個介面。BLS12-381 是目前的主要用例(根據批次大小,簽名聚合可節省 79-94% 的認證開銷),但該介面無需修改即可支援後量子方案。

未標準化的 expose 函數。 BLS+KZG 需要與 ECDSA+Merkle 或 STARK+ZK 不同的參數。事件提供了互操作性介面。

訊息 ID 慣例。 keccak256(author || nonce || contentHash):確定性的,不需要鏈上狀態,具備抗碰撞性。nonce 可防止同批次碰撞。

簽名域 (Signing domain)。 keccak256("ERC-BAM.v1" || chainId):防止跨鏈重放。曾考慮過 EIP-712 但被拒絕;認證訊息缺乏標準化的結構類型,且當訊息格式有意不指定時,EIP-712 的類型化數據模型會增加開銷而無收益。

使用案例

基於 Blob 的去中心化 Twitter

聚合器收集用戶簽名的訊息,透過 v1 解碼器格式進行編碼,壓縮成 Blob 並提交至 L1。registerBlobBatch 觸發帶有解碼器和簽名註冊表地址的分段 + 批次事件。任何客戶端從事件中讀取這些資訊,獲取 Blob 數據,調用 decoder.decode(payload) 提取訊息和簽名數據,計算標準化訊息雜湊,並調用 registry.verifyAggregated(pubKeys, signedHashes, signatureData) 進行驗證。用戶透過簽名註冊表註冊 BLS 金鑰,以實現高效聚合(一個簽名對應 500+ 條訊息)。

鏈上治理觸發器

治理合約在執行提案前需要驗證特定訊息是否已發佈。揭露器透過 KZG 點評估證明該訊息,並觸發 MessageExposed。治理合約調用 isExposed(messageId) 進行驗證。

跨實作互操作性

兩個訊息協議都實作了 IERC_BAM_Core。統一索引器追蹤兩者的 BlobBatchRegistered 事件,讀取各自的解碼器地址,並使用鏈上解碼器解碼來自兩個協議的訊息。兩個協議可以共享同一個受信任的註冊表。用戶只需註冊一次金鑰即可跨協議使用。

與 L2 Rollup 共享 Blob

Optimism batcher 在 field elements 0-1999 中填充 rollup 數據。訊息聚合器在 2000-4095 中填充訊息。Rollup 在獨立的 BSS 合約上調用 bss.declareBlobSegment(0, 0, 2000, ...)。訊息聚合器在 BAM 合約上調用 core.registerBlobBatch(0, 2000, 4096, ...)。兩者都觸發 BlobSegmentDeclared(來自不同合約)。BAM 合約額外觸發帶有解碼器和簽名註冊表的 BlobBatchRegistered。索引器透過 versioned hash 和事件主題進行關聯。

自我發佈備案

如果聚合器審查用戶,用戶可以透過 registerCalldataBatch 自行發佈。雖然 gas 成本較高,但具備抗審查性。使用相同的解碼器和簽名註冊表指標;索引器以相同方式解碼。

本 ERC 不涵蓋的內容

  • 訊息位元組佈局、批次格式、壓縮:由解碼器特定定義。v1 解碼器使用簡單編碼;複雜壓縮是以後考慮的問題。
  • 聚合器協議:聚合器如何收集、排序和提交訊息屬於鏈外範疇。
  • 費用拆分:Blob gas 支付是應用層面的問題,而非協議層面。
  • 社交功能:關注、點讚、個人資料、線程。屬於應用層;排除在協議範圍之外。
  • 存檔:超過約 18 天修剪窗口後的 Blob 數據保存是基礎設施問題。
  • expose() 函數:因證明類型和方案而異。僅標準化事件。

與現有工作的關係

ERC-BSS (Blob 空間分段)。 ERC-BAM 透過 Solidity 介面繼承擴展了 ERC-BSS。BSS 聲明 Blob 的位置(field element 範圍)。BAM 增加了內容(認證訊息批次)和讀取方式(解碼器合約)。BAM 合約即是 BSS 合約。獨立的 BSS 仍可用於非訊息用例。

(Poster)。 理念一致:以太坊上的極簡社交媒體。Poster 是基於事件的,不具備 Blob 感知、金鑰管理或訊息證明功能。ERC-BAM 將此概念擴展到具有簽名支援和解碼器發現的 Blob。

(Blob 交易元數據)。 正交關係。ERC-7588 描述 Blob 元數據。ERC-BAM 使用 Blob 存儲認證訊息數據。兩者可以共存。

(社交媒體 NFT)。 不同的範式。ERC-7847 基於 NFT;ERC-BAM 基於事件且無代幣。

Farcaster / Lens。 特定於 L2 的協議,未標準化為 ERC。ERC-BAM 針對 L1 Blob 數據,儘管 calldata 和金鑰管理介面可在任何 EVM 鏈上運行。

參考實作

參考實作已部署在 Sepolia。現有合約早於解碼器/簽名註冊表分離和 BSS 擴展功能;它們在簽名註冊和揭露方面功能等效:

  • 簽名註冊表:BLSRegistry.sol(具有金鑰輪換、撤銷和聚合驗證功能的 BLS12-381)
  • 揭露器:BLSExposer.sol(具有鏈上驗證功能的 KZG + BLS 訊息揭露)

| 合約 | Sepolia 地址 |
| :--- | :--- |
| SocialBlobsCore | 0xAdd498490f0Ffc1ba15af01D6Bf6374518fE0969 |
| BLSRegistry | 0x2146758C8f24e9A0aFf98dF3Da54eef9f53BCFbf |
| BLSExposer | 0x0136454b435fE6cCa5F7b8A6a8cFB5B549afB717 |

ERC 介面(IERC_BAM_Core.sol, IERC_BAM_Decoder.sol, IERC_BAM_SignatureRegistry.sol, IERC_BAM_Exposer.sol)包含在 ERC PR 的 assets/ 目錄下。

徵求反饋

尋求社群對以下方面的意見:

  • 信任分離。 我們將舊的「schema」拆分為不受信任的解碼器(提取訊息)和受信任的註冊表(驗證簽名)。說謊的解碼器只能導致偽陰性(拒絕有效訊息),絕不會導致偽陽性(冒充)。這種信任模型是否合理?是否有我們遺漏的邊際情況?
  • 解碼器介面。 單個 decode(payload) → (messages, signatureData) 是否為正確的介面?解碼器是否也應返回元數據(例如壓縮算法、版本)?
  • BAM 擴展 BSS。 繼承模型(BAM 合約即 BSS 合約)對您的使用案例是否有意義?雙事件模式(BlobSegmentDeclared + BlobBatchRegistered)是否有任何摩擦?
  • 標準化訊息雜湊。 我們標準化 messageHash = keccak256(sender || nonce || contents) 以便客戶端可以獨立於解碼器進行驗證。這是否為正確的公式?是否應包含額外欄位?
  • v1 編碼。 對於 v1 解碼器,哪種編碼是正確的預設選擇:ABI 編碼數組、RLP 還是 SSZ?哪些權衡最重要(gas 成本、工具支援、可擴展性)?
  • 訊息 ID 慣例。 keccak256(author || nonce || contentHash) 是否為正確的公式?nonce 應該是強制性的,還是對於不需要按批次排序的協議是可選的?
  • 揭露標準化。 僅標準化事件(而非函數)是否為正確的權衡?帶有不透明證明數據的基礎 expose(bytes calldata proof) 是否有用?
  • 聚合模型。 簽名註冊表使聚合按方案選擇性開啟。聚合是否應該是一個單獨的介面,而不是基礎註冊表的一部分?

連結

  • 完整 ERC 草案:
  • ERC-BSS (伴隨案):
  • EIP-4844:
  • ERC-3722:
  • ERC-7588:

1 則貼文 - 1 位參與者