上一期簡單介紹了一下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操作後宣佈驗證結果