Polygon Miden 介紹

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í)行以下功能:

  1. 為所有的輸入創(chuàng)建統(tǒng)一的vault;
  2. 執(zhí)行所有輸入notes的腳本;
  3. 運(yùn)行用戶定義的腳本,若存在的話;
  4. 為所有的輸出創(chuàng)建統(tǒng)一的vault;
  5. 保證輸入和輸出中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/

https://github.com/0xPolygonMiden

https://0xpolygonmiden.github.io/examples/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容