Polygon Miden是基于STARK虚拟机的通用执行层,相比EVM兼容性,Miden更偏向于ZK友好性。
- Miden 支持构建计算量大的或隐私保护的应用;
- Miden基于Actor 模型,支持交易的并发执行;
- 支持账户抽象,保证资产安全;
- Polygon Miden 采用优化的STARK证明,支持客户端证明。
Polygon Miden 目前还在开发中,预计2024 Q1季度上公开测试网。
架构设计
Polygon Miden 架构主要为了实现高吞吐量,隐私和资产安全,采用Actor 模型实现并发和局部状态改变。
Account
Accounts主要用来持有资产,并定义资产转移的规则。Account 可以代表用户或自治的智能合约。Miden 支持图灵完备的智能合约。
主要有几个字段:
- Account ID: account的唯一标识符,整个生命周期都不会改变;
- Storage: 存储在account中的由用户定义的数据;
- Nonce: 计数器,当每次account 状态改变时自增加;
- Vault: 存在account中的assets;
- Code: 函数的集合,定义了account外部的接口。
Miden 账户类型主要有以下四种:
Account存储模式有三种:
- public state: 实现的状态存储在链上,和大多数公链一样;
- private state: 只有账户的hash的存在链上, 实际隐私数据由用户自己保存;
- Encrypted state: 未来将支持加密状态,通过加密后存在链上。
Notes
Notes是 acccounts 互相之间用来发送的消息。Note中存有资产,以及note如何被花费的脚本。
Note中主要包含几个字段:
- Vault:存储在Note中的assets 集合;
- Script: 由某些Account执行用来获取assets,调用account的函数接口;
- Inputs: 脚本执行的输入;
- Serial number: note的唯一标识符;
和Account类似,Note存储也有两种模式,可以将note的数据公开存储在链上,或只在链上note 上存储 hash值,实现隐私保护。对于隐私的note,只有知道note数据的才能消耗掉,需要有链下的通信,将note的数据由发送者给接收者。
Assets
Assets可以是同质化或非同质化代币,它们存储在用户的account中或note中。
Transactions
Transaction 描述单个账户notes的生成和消耗,每个交易的执行总是生成一个STARK 证明。
Miden支持并行和隐私的交易执行,每个交易只对单个账户的状态更改,实现异步性。
交易可以描述为一个状态转移函数:
除了输入和输出,交易必须包含可执行的程序, 主要执行以下功能:
- 为所有的输入创建统一的vault;
- 执行所有输入notes的脚本;
- 运行用户定义的脚本,若存在的话;
- 为所有的输出创建统一的vault;
- 保证输入和输出中Vault中的资产一致。
若在两个账户之间实现转账交易,需要两笔交易:
第一个交易调用account_a
的函数,并创建一个新的note1
, 更新account_a
的状态;第二个交易消耗note1
,调用账户acount_b
的函数, 并更新account_b
的内部状态。
需要注意的时,这两笔交易可以异步执行。
有两种类型的交易:
- Local transaction: 由客户端执行交易并生成正确执行的证明,它的费用更低,支持隐私保护;
- Network transaction: 由
operator
执行交易并生成证明。
State 模型
Miden rollup的状态主要描述当前所有accounts 和 note的状态,主要有accounts
, notes
, nullifiers
三个数据库。
Account数据库
Account数据库采用分层的SMT(tiered sparse merkle tree) 结构,可以将账户ID映射到账户Hash, 再到账户数据(公开账户)。
Note 数据库
Notes 记录在只增的累加器中,采用MMR (Merkle Mountain Range) 结构,每个叶子节点是一个区块头,包含区块中所有的notes的承诺。
Nullifier 数据库
Nullifier 存在分层SMT (tiered sparse merkle tree)中,映射note nullifier
为0或1, 以表示Nullfier 是否被消耗掉。
Execution 模型
Polygon Miden是一个以太坊rollup, 它将交易聚合,生成区块的证明提交到太坊上。
每个交易生成一个证明,验证其执行的正确性。然后将交易证明聚合成 batches
, 最后将多个batch证明聚合在一个区块中, 作为一笔发送到以太坊上。
Miden VM
Miden VM 是通过Rust 开发的零知识证明虚拟机,对于执行的任何程序,可以生成一个基于STARK的证明。
Miden VM具备多种功能:
- Flow control: Miden VM 是图灵完备的虚拟机,支持流控制结构;
- Procedures: Miden assemble 程序可以分解为多个子程序
procedures
, 实现模块化; - Execution contexts: Miden VM 程序执行能扩展到多个独立的上下文环境中。
- Memory: Miden VM 支持读写随机访问内存;
- U32 operations: Miden 支持32位无符号整数运算,包含数值,比较,以及按位运算;
- Cryptographic operations: Miden 汇编提供内置的指令计算hash和验证Merkle 路径, 采用RPO(Rescue Prime Optimized) Hash 函数;
- External libraries: Miden 支持提前定义的库;
- Nondeterminism: 证明者可给Vm提供执行的
hints
。 - Customizable hosts: Miden VM可以使用用户定义的hosts, 用来向VM提供外部了的数据 。
Miden VM 主要四个组件组成:
-
Stack
: 栈结构,每个元素是一个Goldlocks 域元素; -
Memory
: 线性的随机访问读写内存; -
Chiplets
: 用于支持专用计算的小芯片; -
Host
: 主要来用证明者和Miden 传递消息。
Miden VM 目标是支持高级语言,如Rust, Move, Sway等,但是相应编译器尚未开发出来。目前只能通过Miden 汇编语言编写程序。
向Miden VM提交外部输入有两种方式:
- Public inputs: 通过对栈的初始化为VM提供公开输入;
- Secret inputs: 隐私输入通过
advice provider
提供给VM。
程序执行完成后, 栈上剩作的元素即为公开的输出。
advice provider
提供三种非确定性输入:
-
Advice stack
; 一维的域元素数组; -
Advice map
: map 映射结构; -
Merkle store
: Merkle树和Merkle store.
Miden VM assembly 简单示例, 作一个简单的加法运算:
# 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
结果为:
{
"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/