1. 引言
前序博客:
Polygon Miden为:
- ZK-optimized rollup
- 由客户端生成证明
- 完善Polygon ZK系列解决方案,致力于成为网络价值层
- 扩展以太坊功能集
本文专注于Polygon Miden的几个核心概念:
- Accounts账户
- Notes
- Transactions交易
Polygon Miden中:
- notes和accounts都持有资产。
- 交易会引起账户状态更改。
- 交易通常以单个账户和某些notes为输入,输出为:同一账户的新状态,以及,一些其它notes。
- Polygon Miden的交易与以太坊交易不同,所以称Polygon Miden扩展了以太坊功能集。
2. 账户存储资产和代码
Polygon Miden中的账户:
- 持有资产
- 定义资产转移的规则
其与以太坊账户相似,但也有所不同:
- 1)Polygon Miden中的每个账户都有代码,而以太坊中的EOA账户没有代码。即意味着Polygon Miden中的所有账户都是智能合约------即账号抽象(Account Abstraction)。从而有更好的用户体验和更安全的钱包:
- 可定期rotate keys
- 做rate limit
- 社交恢复等。
- 2)以太坊账户中仅locally存储了ETH balance,即意味着账户的该数据结构中仅存储其ETH balance信息。
Polygon Miden中,所有资产都locally存储在账户中,从而提供了隐私和可扩展性:- 提供隐私,是指:之前已提及,Polygon Miden中的用户可将其账户数据私有维护。某特定账户所持有的资产或代码信息,可不对其他人可见。
- 提供可扩展性,是指:在账户中locally存储资产,使得任意token交易都可仅触及一个账户,从而支持并发性。
以太坊中的ERC20 token为智能合约,其存储了一组拥有该合约token的账户及其balance列表,该ERC20 token的某个持有人需修改该合约才能转移其token。
而Polygon Miden中,tokens并不存储在public list中。
- 3)Polygon Miden的账户ID仅为8个字节,而以太坊的账户地址长达20个字节。更短的字符更有助于记忆。因为每个账户都有code,从而支持多种认证方式,就没必要将账户ID与其公钥绑定。
3. 账户之间通过Notes来通信
与分布式系统的Actor模式类似,为实现并发状态更改:
- Actors类似于小的状态机,每个actor负责其自身状态
- Actors有inboxes来发送和接收消息,从而实现与其它actors的通信。
- 消息可异步读取。
- 某actor读取某消息之后,可修改其状态。
Polygon Miden中的notes即类似于上面的消息。
在Polygon Miden中,账户之间通过生成notes和消费notes来实现通信:
- notes中携带了账户之间发送的资产信息。
单个note中包含:- 资产
- script:定义了该note如何可被消费。从而使得不仅仅支持资产的转移,还可支持更复杂的功能。
notes的概念,是基于账户模型的以太坊,与,基于UTXO和账户混合状态模型的Polygon Miden之间的,主要区别。
- 以太坊中:由账户A发送5美金给账户B:【类似于钱包间的现金交易】
- 账户A直接从其钱包中拿出5美金现金,
- 然后再直接把这5美金放入账户B的钱包中。
- Polygon Miden中:由账户A发送5美金给账户B:【类似于钱包间的账单(或notes)交易】
- 账户A从其钱包中拿出5美金的账单放入某lockbox,然后就不管了后续了(即不负责将钱放入B的钱包中),账户A 的钱包余额中只是少了5美金。
- 若账户B想要收取该账单,其必须知道该lockbox的组合,如果知道,即可将这5美金放入账户B自己钱包。
- "将账单放入lockbox" 的动作,与,"将账单从lockbox中取出"的动作,是不同的。
4. 交易:生成和消费notes
Polygon Miden中,当账户生成或消费notes时,则称其为交易。
Polygon Miden中的交易总是基于单个账户执行的,且仅引起该单个账户的状态更改:
即意味着,2个账户之间发送资产时,需要2笔交易:
- 1笔交易用于创建note
- 另1笔交易用于消费 发送账户 所创建的note。
仍以上面的例子为例: - 账户A将5美金账单放入lockbox中,这即为账户A的状态转换和首笔交易。
- 账户B从lockbox中取出该5美金账单,这为账户B的状态转换,和,另一笔交易。
- 账户B甚至可以同时打开多个lockboxes,并在单笔交易中"消费"所有账单。
使用这种交易模型可以做一些引人注目的事,如:
- 1)交易可以在本地执行和证明,因为交易只涉及一个帐户。这提供了隐私并降低了复杂计算的成本,因为其无需多个网络参与者进行重新执行。
- 2)在另一个帐户消费了某note之前,该note的创建者可对其进行更新。可通过公开note script的哈希部分,来完成note更新。
如某note script可为:"消耗这5 ETH并发送Bob 10 MATIC或0x213..."。然后,若无人消费这该note,其创建者可公开"0x213=消费这5 ETH并发送Bob 9 MATIC"。以此来说明可更新lock------如做市商可在短时间内免费更新链上订单。 - 3)当某note被发送到错误的地址,其创建者可召回该note。想想那些在以太坊或比特币上意外将东西发送到错误地址的用户。在Polygon Miden上,特定交易的创建者可对其进行配置,以便在尚未消费某note的情况下可召回该note。
5. 包含公共共享状态的交易
Polygon Miden账户可以在本地执行并证明其交易,因为交易只会改变其自身状态。
但是,若某交易涉及到公共状态呢?
想象一下,有一个类似Uniswap的合约------它只是另一种简单账户------在消费和生成一些notes后会发生变化。且这种更改必须对所有其他用户可见,因为这会影响所有其他用户的交易费率。
基本上,一个需要公开其状态的帐户无法在本地执行和证明其交易。
这些网络交易必须由Polygon Miden运营商执行和验证。在这种情况下,Polygon Miden的工作方式与所有其他ZK Rollup类似,由专门的Provers来创建有效状态转换的证明。
两个帐户如何使用类似Uniswap的合约交换代币的架构如下图所示,从左至右,可将其分解为离散阶段:
- 1)Token Swap Initiation阶段:
- Acct1 and Acct2 want to trade on a Uniswap-like contract
- Tx1 creates Note1 and can be locally executed by Acct1
- Tx2 creates Note2 and can be locally executed by Acct2
- 2)Uniswap Execution阶段:
- In Tx3, Uniswap consumes Note1 and Note2 (and all the other notes that are in its inbox) and creates Note3 and Note4 in the same transaction
- Because Uniswap's state must be publicly visible, this state change is performed by the Polygon Miden operator
- 3)Token Swap Finalization阶段:
- Acct1 and Acct2 now get their swapped tokens back
- Tx4 consumes Note3 and can again be locally executed by Acct1
- Tx5 consumes Note4 and can again be locally executed by Acct2
参考资料
[1] Polygon Labs 2023年4月博客 Polygon Miden: Transaction Model