本文提出了一个基于zkVM的状态模型,用于安全有效地处理状态转换,同时保护隐私。该模型涉及到应用程序数据、账户、签名者、笔记和笔记无效器,通过zkVM执行状态转换函数,验证交易的有效性,并将其应用于状态更新。文章还对zkVM在账户管理、签名者管理、私有资产管理、电路设计和应用逻辑中的作用进行了详细描述。
我们提出了一个基于 zkVM 的状态模型,以安全有效地处理状态转换,同时保护隐私。在我们的系统中,状态包括应用程序数据、账户、签名者、票据和票据失效器,每个都由稀疏 Merkle 树 (SMT) 或 Merkle 树表示。我们的 zkVM 执行状态转换函数,并接受签名的交易,并在将它们应用于状态之前验证它们的有效性。
目标:
状态由以下数据结构组成:
待办事项:
应用程序数据(钱包程序用于存储可变参数的持久存储)存储在稀疏 Merkle 树中。
账户存储在稀疏 Merkle 树中,其中 key 指的是账户的 ID,而 value 存储账户数据的哈希值。
每个账户存储以下数据:
[signer_0, ...]
我们的 zkVM 具有用于账户管理的操作码,例如 create_account、add_signer、remove_signer、deposit、withdraw 和 transfer。这些操作码分别支持创建账户、签名者管理和资产管理。
方法
创建:
create_account([signer_id]) -> account_id
签名者管理:
add_signer(account_id, signer_id)
remove_signer(account_id, signer_id)
待办事项:这类函数是否应限于更高权限的签名者组?
资产管理:
deposit(account_id, asset_id, balance)
withdraw()
transfer(from_account_id, to_account_id, asset_id, balance, expiration_date)
字段 signer_id
确定排序器应运行的状态转换函数中的子例程。
在上述任何一种情况下,都存在一种验证算法,用于检查签名者是否在某些消息上签名。
m。请注意,我们的交易电路需要实现上述每种方法的验证算法。
我们将私有资产存储在 票据 中。票据存储在(仅追加)Merkle 树中。票据失效器存储在基于 epoch 的稀疏 Merkle 树中。
每个票据存储以下数据:
zkVM 中的票据管理涉及创建和管理私有资产或票据。以下是如何实现它的方法:
create_note
:此操作创建一个与所有者账户相关联的新票据。zkVM 指令将生成一个新的票据 ID,计算票据哈希(包括资产 ID、数量、所有者账户 ID、到期日期和随机 nonce),并将票据哈希存储在票据树中。consume_note
:此操作允许票据的所有者使用该票据,并将其价值添加到其账户余额中。zkVM 将验证票据的所有权,对照票据树中的票据哈希检查票据的有效性,并更新账户的余额。update_note
:此操作更新票据的属性,例如其到期日期或数量。zkVM 将验证请求,检查票据的有效性,更新票据数据,并计算票据树中的新票据哈希并存储它。电路确保状态更新正确完成。我们这里使用术语电路,但它们可以在像 Valida 这样的虚拟机中实现。
私人花费电路声明一个元组 (asset_id, value)
,以及一系列失效器 nf_0, ...
,它们代表私人花费中花费的票据,以及一系列新的票据承诺。
私有花费电路在客户端证明。
zkVM 中的状态转换使用特定指令来处理状态更改。这些状态转换可能包括私有花费、公共花费、账户创建、账户更新等等。以下是 zkVM 如何处理应用程序逻辑的详细视图:
当从这种基于电路的方法切换到基于 zkVM 的方法时,这种交易的执行将会改变。在 zkVM 中,操作封装在指令中,而不是电路中。JoinSplit 交易的验证将在 VM 中使用一系列 zkVM 指令进行,这些指令将取代之前的电路。
在 zkVM 的上下文中,对私有花费的特定处理可能如下所示:
我们需要 Valida 支持这些操作并存储必要的数据(如未花费的票据集)。此外,虽然原始文档提到私有花费证明是在客户端生成的,但在基于 zkVM 的方法中,VM 本身将负责生成和验证这些证明。客户端只需要提供必要的输入即可。
应用程序逻辑电路负责更新状态。
公共输入:
prior_state
:表示先前状态中的所有树(应用程序数据、账户、签名者、票据、票据失效器)。它用于验证转换的正确性。external_actions
:与影响状态的外部环境的一系列交互。这包括资产提取和对外部合约的调用等操作。功能:
validate_transactions
:此函数验证状态转换中包含的所有交易的正确性。这包括检查交易签名、确保足够的账户余额以及验证转账。apply_transactions
:将所有有效的交易应用于 prior_state
。此函数更新账户余额,生成新票据,并根据交易修改签名者。handle_external_actions
:处理 external_actions
对状态的影响。这可能包括根据资产提取或由于对外部合约的调用而产生的任何影响来更新状态。generate_new_state
:通过将 apply_transactions
和 handle_external_actions
的结果应用于 prior_state
来生成 new_state
。输出:
new_state
:更新后的状态,由应用交易和处理外部操作产生。它包括所有树的更新版本(应用程序数据、账户、签名者、票据、票据失效器)。transaction_receipts
:每个已处理交易的收据列表。这些收据可能包括诸如更新后的账户余额、生成的新票据以及签名者的任何更改之类的信息。external_action_receipts
:每个已处理外部操作的收据列表。这些收据记录了外部操作对状态的影响。通过以这种方式组织应用程序逻辑,我们可以确保以受控和可预测的方式处理每个状态转换,这对于维护我们系统的完整性至关重要。
- 原文链接: hackmd.io/@ggo37zhVSB6nc...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!