作者:Vitalik Buterin
原文:https://ethresear.ch/t/future-proof-shard-and-history-access-precompiles/9781

當前以太坊設計中的向後兼容性所面臨的挑戰之一是區塊鏈歷史記錄的訪問需要對 Merkle 證明進行 EVM驗證,這還假設區塊鏈將永遠使用相同的格式和相同的密碼技術。 未來的分片(Sharding)設計更是增加了這一點的重要性,因為Rollup的欺詐證明和有效性證明將需要指向分片數據的指針。
這篇文章提出了一種更加面向未來的方法:我們可以添加執行驗證特定類型證明的抽象任務的預編譯,而不是要求在 EVM 中驗證歷史和分片的證明。 如果將來更改格式,預編譯邏輯將自動更改。 預編譯甚至可以具有條件邏輯,用於驗證過渡前插槽(slot)的一種證明和轉換后插槽的另一種證明。
歷史區塊數據
def verifyHistoricalBlockRoot(
slot: uint256,
value: bytes32,
proof: bytes
)
這種預編譯將嘗試以兩種方式之一解釋該proof:
如果這個proof為空,則直接檢查該value是否為保存在正確位置的歷史區塊根。 如果slot太舊,它將失敗。
如果這個proof是一個Merkle 分支,它會根據 history_roots 中的正確條目將其驗證為 Merkle 分支
def verifyHistoricalStateRoot(
slot: uint256,
value: bytes32,
proof: bytes
)
驗證狀態根,使用與該區塊根相同的邏輯。
def verifyHistoricalStateValue(
slot: uint256,
key: bytes32,
value: bytes32,
proof: bytes
)
驗證歷史狀態中的值。 這個proof包括三個要素:
- 狀態根
- 表明狀態根正確性的證明
- Patricia 或 Verkle 或其他證明該value實際上位於狀態樹中的位置key中的證明(這假設將所有帳戶內容映射到 32 字節key的提議方案已永久保存)
def verifyHistoricalTransaction(
slot: uint256,
txindex: uint256,
tx: bytes,
proof: bytes
)
驗證 tx 實際上是否在給定slot的區塊的 txindex 中。 證明內容如下:
- 區塊根
- 表明區塊根正確性的證明
- 證明給定的tx實際上是給定位置的交易
def verifyHistoricalReceipt(
slot: uint256,
txindex: uint256,
receipt: bytes,
proof: bytes
)
驗證receipt實際上是給定slot的 txindex 處的交易接收。 證明內容如下:
- 區塊根
- 證明區塊根正確性的證明
- 證明給定收據實際上是給定位置的receipt
分片數據
def verifyShardBlockBody(
slot: uint256,
shard: uint256,
startChunk: uint256,
chunks: uint256,
data: bytes,
proof: bytes
)
驗證 data = body[32 * startChunk: 32 * (startChunk + chunks)] ,其中 body 是給定slot中給定分片的主體。 該證明將包括:
- 證明區塊子集的 Kate 證明
- 如果slot太舊(超過 128 個 epoch?),則在slot + 96 處的區塊根的 Merkle 證明,然後是從該slot到分片承諾數組中的位置的 Merkle 證明,顯示一個最終性承諾
當我們使用 BLS-12-381 Kate 承諾時,預編譯還將驗證數據是 32 字節chunk的列表,其中每個chunk都小於曲線子組順序。 如果沒有在給定位置保存分片區塊,則預編譯就像在該位置保存了對零長度數據的承諾一樣。 如果給定位置的value未確認,則預編譯總是失敗。
def verifyShardPolynomialEvaluation(
slot: uint256,
shard: uint256,
x: uint256,
y: uint256,
proof: bytes
)
如果我們將給定 (slot, shard) 處的分片區塊視為多項式 P,其中字節 i*32 … i*32+31 是 w**i 處的評估,這將驗證 P(x) = y。該proof與數據子集proof相同,除了 Kate 證明正在證明某個點(可能在域外)的評估而不是在證明一個位置子集的數據。
如果我們將來不再使用 BLS-12-381(例如,使用 32 字節二進制字段證明),則預編譯會將 SNARK 作為輸入,驗證數據完全由小於該曲線階數的值組成,並驗證對當前字段數據的評估。
這種預編譯對於等價協議的跨多項式承諾方案證明很有用,可用於允許 ZK Rollup直接對分片數據進行操作。
本文鏈接:https://www.8btc.com/article/6647051
轉載請註明文章出處