Polygon Miden是基于STARK虛擬機(jī)的通用執(zhí)行層,相比EVM兼容性,Miden更偏向于ZK友好性。
- Miden 支持構(gòu)建計算量大的或隱私保護(hù)的應(yīng)用;
- Miden基于Actor 模型,支持交易的并發(fā)執(zhí)行;
- 支持賬戶抽象,保證資產(chǎn)安全;
- Polygon Miden 采用優(yōu)化的STARK證明,支持客戶端證明。
Polygon Miden 目前還在開發(fā)中,預(yù)計2024 Q1季度上公開測試網(wǎng)。
架構(gòu)設(shè)計
Polygon Miden 架構(gòu)主要為了實現(xiàn)高吞吐量,隱私和資產(chǎn)安全,采用Actor 模型實現(xiàn)并發(fā)和局部狀態(tài)改變。
Account
Accounts主要用來持有資產(chǎn),并定義資產(chǎn)轉(zhuǎn)移的規(guī)則。Account 可以代表用戶或自治的智能合約。Miden 支持圖靈完備的智能合約。

主要有幾個字段:
- Account ID: account的唯一標(biāo)識符,整個生命周期都不會改變;
- Storage: 存儲在account中的由用戶定義的數(shù)據(jù);
- Nonce: 計數(shù)器,當(dāng)每次account 狀態(tài)改變時自增加;
- Vault: 存在account中的assets;
- Code: 函數(shù)的集合,定義了account外部的接口。
Miden 賬戶類型主要有以下四種:

Account存儲模式有三種:
- public state: 實現(xiàn)的狀態(tài)存儲在鏈上,和大多數(shù)公鏈一樣;
- private state: 只有賬戶的hash的存在鏈上, 實際隱私數(shù)據(jù)由用戶自己保存;
- Encrypted state: 未來將支持加密狀態(tài),通過加密后存在鏈上。
Notes
Notes是 acccounts 互相之間用來發(fā)送的消息。Note中存有資產(chǎn),以及note如何被花費(fèi)的腳本。

Note中主要包含幾個字段:
- Vault:存儲在Note中的assets 集合;
- Script: 由某些Account執(zhí)行用來獲取assets,調(diào)用account的函數(shù)接口;
- Inputs: 腳本執(zhí)行的輸入;
- Serial number: note的唯一標(biāo)識符;
和Account類似,Note存儲也有兩種模式,可以將note的數(shù)據(jù)公開存儲在鏈上,或只在鏈上note 上存儲 hash值,實現(xiàn)隱私保護(hù)。對于隱私的note,只有知道note數(shù)據(jù)的才能消耗掉,需要有鏈下的通信,將note的數(shù)據(jù)由發(fā)送者給接收者。
Assets
Assets可以是同質(zhì)化或非同質(zhì)化代幣,它們存儲在用戶的account中或note中。

Transactions
Transaction 描述單個賬戶notes的生成和消耗,每個交易的執(zhí)行總是生成一個STARK 證明。
Miden支持并行和隱私的交易執(zhí)行,每個交易只對單個賬戶的狀態(tài)更改,實現(xiàn)異步性。
交易可以描述為一個狀態(tài)轉(zhuǎn)移函數(shù):

除了輸入和輸出,交易必須包含可執(zhí)行的程序, 主要執(zhí)行以下功能:
- 為所有的輸入創(chuàng)建統(tǒng)一的vault;
- 執(zhí)行所有輸入notes的腳本;
- 運(yùn)行用戶定義的腳本,若存在的話;
- 為所有的輸出創(chuàng)建統(tǒng)一的vault;
- 保證輸入和輸出中Vault中的資產(chǎn)一致。
若在兩個賬戶之間實現(xiàn)轉(zhuǎn)賬交易,需要兩筆交易:

第一個交易調(diào)用account_a的函數(shù),并創(chuàng)建一個新的note1, 更新account_a的狀態(tài);第二個交易消耗note1,調(diào)用賬戶acount_b的函數(shù), 并更新account_b的內(nèi)部狀態(tài)。
需要注意的時,這兩筆交易可以異步執(zhí)行。
有兩種類型的交易:
- Local transaction: 由客戶端執(zhí)行交易并生成正確執(zhí)行的證明,它的費(fèi)用更低,支持隱私保護(hù);
- Network transaction: 由
operator執(zhí)行交易并生成證明。
State 模型
Miden rollup的狀態(tài)主要描述當(dāng)前所有accounts 和 note的狀態(tài),主要有accounts, notes, nullifiers三個數(shù)據(jù)庫。

Account數(shù)據(jù)庫
Account數(shù)據(jù)庫采用分層的SMT(tiered sparse merkle tree) 結(jié)構(gòu),可以將賬戶ID映射到賬戶Hash, 再到賬戶數(shù)據(jù)(公開賬戶)。

Note 數(shù)據(jù)庫
Notes 記錄在只增的累加器中,采用MMR (Merkle Mountain Range) 結(jié)構(gòu),每個葉子節(jié)點(diǎn)是一個區(qū)塊頭,包含區(qū)塊中所有的notes的承諾。

Nullifier 數(shù)據(jù)庫
Nullifier 存在分層SMT (tiered sparse merkle tree)中,映射note nullifier為0或1, 以表示Nullfier 是否被消耗掉。

Execution 模型
Polygon Miden是一個以太坊rollup, 它將交易聚合,生成區(qū)塊的證明提交到太坊上。

每個交易生成一個證明,驗證其執(zhí)行的正確性。然后將交易證明聚合成 batches, 最后將多個batch證明聚合在一個區(qū)塊中, 作為一筆發(fā)送到以太坊上。
Miden VM
Miden VM 是通過Rust 開發(fā)的零知識證明虛擬機(jī),對于執(zhí)行的任何程序,可以生成一個基于STARK的證明。
Miden VM具備多種功能:
- Flow control: Miden VM 是圖靈完備的虛擬機(jī),支持流控制結(jié)構(gòu);
- Procedures: Miden assemble 程序可以分解為多個子程序
procedures, 實現(xiàn)模塊化; - Execution contexts: Miden VM 程序執(zhí)行能擴(kuò)展到多個獨(dú)立的上下文環(huán)境中。
- Memory: Miden VM 支持讀寫隨機(jī)訪問內(nèi)存;
- U32 operations: Miden 支持32位無符號整數(shù)運(yùn)算,包含數(shù)值,比較,以及按位運(yùn)算;
- Cryptographic operations: Miden 匯編提供內(nèi)置的指令計算hash和驗證Merkle 路徑, 采用RPO(Rescue Prime Optimized) Hash 函數(shù);
- External libraries: Miden 支持提前定義的庫;
- Nondeterminism: 證明者可給Vm提供執(zhí)行的
hints。 - Customizable hosts: Miden VM可以使用用戶定義的hosts, 用來向VM提供外部了的數(shù)據(jù) 。
Miden VM 主要四個組件組成:

-
Stack: 棧結(jié)構(gòu),每個元素是一個Goldlocks 域元素; -
Memory: 線性的隨機(jī)訪問讀寫內(nèi)存; -
Chiplets: 用于支持專用計算的小芯片; -
Host: 主要來用證明者和Miden 傳遞消息。
Miden VM 目標(biāo)是支持高級語言,如Rust, Move, Sway等,但是相應(yīng)編譯器尚未開發(fā)出來。目前只能通過Miden 匯編語言編寫程序。
向Miden VM提交外部輸入有兩種方式:
- Public inputs: 通過對棧的初始化為VM提供公開輸入;
- Secret inputs: 隱私輸入通過
advice provider提供給VM。
程序執(zhí)行完成后, 棧上剩作的元素即為公開的輸出。
advice provider 提供三種非確定性輸入:
-
Advice stack; 一維的域元素數(shù)組; -
Advice map: map 映射結(jié)構(gòu); -
Merkle store: Merkle樹和Merkle store.
Miden VM assembly 簡單示例, 作一個簡單的加法運(yùn)算:
# This is a basic program that pushes 1 and 2 onto the stack and adds them.
# The result is then pushed onto the stack.
begin
push.1
push.2
add
end
結(jié)果為:
{
"stack_output" : [3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
"trace_len" : 64
}
參考
https://polygon.technology/polygon-miden
https://docs.polygon.technology/miden/