以太坊Rollup方案之 arbitrum(2)
上一期簡單介紹了一下rollup的一些基本內容以及aritrun交易的執行流程,這一期將介紹一下aritrum的核心技術 -- 交互式單步證明
這一期主要涉及到的是arbitrum的驗證節點
arbitrum 架構

validator(驗證節點)的功能有兩個
- 通過質押資產出L2的rblock
- 向不合法的區塊發送單步證明
一個arbitrum的驗證節點可以概括為以下幾個部分

-
Rpc server : 提供arbtirum rpc服務(以太坊rpc的超集)
-
Geth:執行層
-
AVM :驗證層(驗證過程是把evm操作碼轉譯為avm)
Rpc模塊用于接受以太坊格式的請求(用戶體驗上L2與L1的區別僅在與L2手續費低很多,幾乎沒有多于的配置)
Geth模塊是L1的執行層,用于執行L1操作碼
AVM模塊是L2的驗證層,用于驗證L2操作碼,并不是每一筆交易都會走到驗證層,就現實而言arbitrum已經運行一年多了,還沒有走到驗證層的交易
當然沒有走到驗證層并不是說驗證層沒用,而是目前沒有好的辦法繞過驗證層的驗證,或者是使驗證層出錯(畢竟在區塊鏈系統,出錯一般是惡意的)
AVM 狀態機
VM狀態不外乎這幾種:特殊狀態Halted(暫停),特殊狀態ErrorStop,或其他擴展狀態。
擴展狀態包含下列幾種:
-
Current Codepoint,當前碼點:代表當前運行所處的碼點
-
Data Stack,數據棧:該棧是運算的首要工作區
-
Aux Stack,輔助棧:該棧提供了輔助的存儲空間
-
Register,寄存器:一種可變的存儲單元,可存儲單個值
-
Static,靜態:一種在VM初始化時就已經確定的不可變值
-
AVMGas Remaining,AVMGas剩余: 記載了在出現報錯前可消耗多少AVMGas的一個整形
-
Error Codepoint,錯誤碼點: Error所對應的碼點
-
Pending Message,待處理消息: 記錄了待處理的收件箱信息(若有的話)的元組
當VM初始化時,位于擴展狀態。Data Stack, Aux Stack, Register, AVMGas Remaining, 和 Error Codepoint 會分別初始化為 None, None, None, MaxUint256, 和Codepoint (0, 0)。創建VM的實體提供Current Codepoint和Static的值。
vm的最終狀態為上述狀態的串聯hash
AVM操作碼案例
| Opcode | NickName | 描述 |
|---|---|---|
| 0x01 | add | 從數據堆棧中彈出兩個值(A、B)。 如果 A 和 B 都是整數,則將值 A+B(截斷為 256 位)壓入數據堆棧。 否則,引發錯誤。 |
| 0x70 | send | 從數據堆棧中彈出兩個值(A、B)。 如果 A 和 B 都是整數,則將值 A+B(截斷為 256 位)壓入數據堆棧。 否則,引發錯誤。 |
| 0x72 | inbox | 如果待處理消息不是空元組,則將待處理消息推送到數據堆棧上,然后將待處理消息設置為等于空元組。 否則,將阻塞直到虛擬機的收件箱序列非空。 然后從運行時環境提供的收件箱序列中刪除第一項,并將結果推送到數據堆棧上。 |
AV M數據結構案例
codepoint
表示當前執行的指令。arbitrum中在某個PC值下指令的碼點是(opcode at PC, Hash(CodePoint at PC+1))。如果沒有CodePoint at PC+1,則使用0。

Data Stack
表示存儲的數據棧。當執行到某個指令碼是會根據指令碼的邏輯在數據棧中取出或壓入指定數量的數據。數據棧也使用類似的鏈式結構。

注:codepoint是鏈式結構,執行過程不會改變,data stack滿足棧的操作邏輯。
交互式證明
分割協議(簡化版)

Alice為自己的主張辯護,她的主張是:從父區塊的狀態開始,虛擬機的狀態可以前進至她所主張的區塊A上的狀態。本質上,她是在宣稱,虛擬機可以執行N條指令,消耗M條收件箱中的信息并將哈希從H'轉換為H。
Alice的第一個動作需要她把她的斷言從開始(0條指令已執行)到結束(N條指令已執行)以中間點切分。協議要求Alice將其主張對半切分,發布中間點在執行了N/2步指令后的的狀態。
當Alice已經有效地將她的斷言二等分變為兩個N/2步的斷言后,Bob需要在這兩個片段中選擇一段并聲明它是錯的。
在此,我們又回到了之前的狀態:Alice主張一個斷言,Bob不同意。不過現在我們已經把斷言長度從N縮短到了N/2。我們可以再重復之前的動作,Alice二分,Bob選擇不同意的那一半,縮短尺度到N/4。我們可以繼續該動作,經過對數輪的博弈,Alice和Bob的爭議點就縮減為了單步操作。自此,分割協議就終止了,Alice必須給EthBridge生成一個單步證明供其檢測。

A作為出快人,c作為挑戰者
- A主張L2狀態機在H0狀態下經歷N個操作碼之后到達Hn狀態 (H0,Hn表示上面提到的vm的最終狀態)
- C主張H0在經歷N個操作之后不會變成Hn
- A對N步操作進行二分 表明H0在經過N/2個操作后變成H(n/2)
注意這里暗示了H(n/2)經歷剩下N/2個操作之后會變成Hn,C需要指出兩段之中的一段的錯誤
- C表示H0經過N/2個操作之后不會變成H(n/2)
- A表示H0經過N/4個操作之后變成H(n/4)
- C表示從H(N/4)經歷N/4個操作之后不會變成H(n/4)
.
.
. - 表示層Hi 經歷一個操作之后不會變成H(i+1)
- A 提交Hi狀態下的世界信息(也就是上面提到的那些堆棧,codepioint的那些信息,但是不是所有的,比如Add操作碼只有兩個操作數,那么數據堆棧就只需要兩個,由于整個堆棧是可hash,所以A無法作惡)
代碼上的流程圖表現為這樣

單步證明
初始狀態下AVM狀態相同,如下:


執行一步后狀態不同
驗證者從鏈上獲取對方的信息得知,對方在執行add前與本地狀態相同,執行后狀態不同
驗證者將執行前狀態,其他各個沒有改變的棧的狀態hash,add指令的codepoint,數據棧的 前兩個元素,執行add后狀態提交在鏈上。(執行前后的狀態用于保證這一步確實是有問題的,并且暗示驗證者同意執行前的狀態,上傳沒有改變的棧是因為后面計算最終狀態時要用)。
鏈上執行add操作后宣布驗證結果

浙公網安備 33010602011771號