Aleo虚拟机AVM学习

Aleo虚拟机(AVM)是隐私计算平台的核心,其全局状态不直接存储原始交易信息,采用Transition表示状态变化。账户信息包括private_key、view_key和address。签名算法用于验证交易,Transition和Record涉及加密和解密过程,确保数据隐私。AVM是一个堆栈机器,构造R1CS电路并使用Marlin算法生成证明,保证交易和Transition逻辑的正确性。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


全局状态

Aleo 正在实施隐私计算平台。为了保护隐私,原始交易信息不应在全局状态中暴露。全局状态由块头的 Merkle 树的 Merkle 根表示。

在这里插入图片描述
Transition是一个新名词。它是指交易中某些状态的变化。交易数据在“加密”后存储在块中。简单来说,与一般区块链中的全局状态不同,原始交易数据不直接包含在全局状态中。

账户信息

一个账户包括三种密钥:private_key、view_key和address。
账户信息在account/src/lib.rs中定义:

pub struct Account<N: Network> {
  /// The account private key.
  private_key: PrivateKey<N>,
  /// The account view key.
  view_key: ViewKey<N>,
  /// The account address.
  address: Address<N>,
}

计算方式如下:
在这里插入图片描述

私钥中最关键的部分是seed随机种子。可以说所有的密钥都可以从seed中推导出来。 pk_sig 和 pr_sig 也是公开信息

签名算法

签名算法在console/account/src/signature/sign.rs中定义:

/// Returns a signature `(challenge, response, compute_key)` for a given message and RNG, where:
///     challenge := HashToScalar(nonce * G, pk_sig, pr_sig, address, message)
///     response := nonce - challenge * private_key.sk_sig()
pub fn sign<R: Rng + CryptoRng>(private_key: &PrivateKey<N>, message: &[Field<N>], rng: &mut R) -> Result<Self> {

消息是需要签名的原始数据,nonce是随机选择的。

在这里插入图片描述签名由challenge, response, compute key组成。验证签名时,可以使用challenge/response和 pk_sig 重新计算 g_r。使用给定的compute key/address/message,可以确定challenge是否正确,从而确认对 sk_sig 的了解。这里私钥是一个knowledge

Record/Transition

Record 表示全局状态中程序的某些状态。例如,一个账户的余额可以用一个Record来表示。记录类似于比特币网络中的 UTXO。transaction中的一个transition可以由多个输入和输出Record组成transaction包含transition包含Record。由于 Aleo 是一个隐私平台,每条Record在交易发送之前都经过加密。在深入研究 Records 的加密之前,让我们先介绍一下 Transitions。 Transition的数据结构定义在synthesizer/src/block/transition/mod.rs中:

pub struct Transition<N: Network> {
  /// The transition ID.
  id: N::TransitionID,
  /// The program ID.
  program_id: ProgramID<N>,
  /// The function name.
  function_name: Identifier<N>,
  /// The transition inputs.
  inputs: Vec<Input<N>>,
  /// The transition outputs.
  outputs: Vec<Output<N>>,
  /// The inputs for finalize.
  finalize: Option<Vec<Value<N>>>,
  /// The transition proof.
  proof: Proof<N>,
  /// The transition public key.
  tpk: Group<N>,
  /// The transition commitment.
  tcm: Field<N>,
}

Transition 的输入和输出由输入/输出Record列表组成。该证明是 Transition(具有状态转换的子函数)的逻辑证明。顺便说一下,一个transaction可以包含多个 Transitions。接下来详细解释一下tpk代表什么。

如前所述,Transaction 由多个 Transitions“组合”而成。链上记录包含加密信息和多个 Transitions 的证明。每个 Transition 的执行都需要用户签名,并由 Request 表示。一个或多个Request形成授权。

pub struct Request<N: Network> {
  /// The request caller.
  caller: Address<N>,
  /// The network ID.
  network_id: U16<N>,
  /// The program ID.
  program_id: ProgramID<N>,
  /// The function name.
  function_name: Identifier<N>,
  /// The input ID for the transition.
  input_ids: Vec<InputID<N>>,
  /// The function inputs.
  inputs: Vec<Value<N>>,
  /// The signature for the transition.
  signature: Signature<N>,
  /// The tag secret key.
  sk_tag: Field<N>,
  /// The transition view key.
  tvk: Field<N>,
  /// The transition secret key.
  tsk: Scalar<N>,
  /// The transition commitment.
  tcm: Field<N>,
}

每个Request对应一个Response:

pub struct Response<N: Network> {
  /// The output ID for the transition.
  output_ids: Vec<OutputID<N>>,
  /// The function outputs.
  outputs: Vec<Value<N>>,
}

Request/Transition 的签名算法与上述签名算法相同。对于Transition signing,消息内容如下。实现代码可以在 sign 函数中的 console/program/src/request/sign.rs 中找到。
在这里插入图片描述
下面我们来看一下Records的加密过程。
Records 的加密逻辑在 console/program/src/data/record/encrypt.rs 中的 encrypt 函数中实现:

rustCopy code
pub fn encrypt(&self, randomizer: Scalar<N>) -> Result<Record<N, Ciphertext<N>>> {

Records 的解密逻辑在 decrypt 函数中的 console/program/src/data/record/decrypt.rs 中实现:

rustCopy code
pub fn decrypt(&self, view_key: &ViewKey<N>) -> Result<Record<N, Plaintext<N>>> {

详细的加密过程如下:
在这里插入图片描述
每个 Transition 都有一个独特的 tvk。当授权用户查看记录时,系统会根据用户的view_key判断该用户是否有访问权限。

AVM

AVM 代表 Aleo 虚拟机。它是一个堆栈机器,在堆栈内执行特定的功能。主要逻辑涉及从函数中的每条指令构造一个完整的算术电路(R1CS)。在构建 R1CS 之后,使用 Marlin 算法生成相应的证明。
在这里插入图片描述
详细实现可以在synthesizer/src/process/stack/execute.rs中的execute_function函数中找到。让我们仔细看看具体函数的执行证明了什么。
在这里插入图片描述
每笔Transaction都有包含证明,确保输入信息的正确性。 Transition 的 proof 字段中包含其他逻辑证明,证明特定 Transition 逻辑的正确性。

这是 AVM 设计及其关键组件的简要概述。您可以在提供的 GitHub 存储库中找到更详细的信息和实现代码。

全文翻译自 https://trapdoortech.medium.com/deep-into-avm-aleo-virtual-machine-6ce47e959927

AVM代码仓库 https://github.com/AleoHQ/snarkVM.git

`systemctl` 是一个用于与 systemd 系统和服务管理器交互的命令行工具。systemd 是大多数现代 Linux 发行版的初始化系统和服务管理器,负责启动系统、管理系统服务、提供日志等功能。如果你在尝试运行 `systemctl` 命令时收到 "command not found" 的错误,这通常意味着 systemd 没有安装在你的系统上,或者 `systemctl` 可执行文件不在你的系统环境变量中指定的路径内。 如果你的系统确实使用 systemd 并且出现了这个错误,你可以尝试以下几种解决方法: 1. 检查是否安装了 systemd: 你可以尝试安装 systemd,不过这通常取决于你的 Linux 发行版。在基于 Debian 的系统上,你可以使用以下命令尝试安装: ```bash sudo apt-get update sudo apt-get install systemd ``` 在基于 Red Hat 的系统上,可以使用: ```bash sudo yum install systemd ``` 2. 确认路径: 如果 systemd 已经安装但仍然提示命令找不到,你需要确保 `systemctl` 的路径包含在环境变量 `PATH` 中。你可以通过运行 `whereis systemctl` 或 `which systemctl` 来查找 `systemctl` 的位置。 3. 使用替代工具: 如果你不打算使用 systemd,或者你的系统使用其他初始化系统(如 System V 或 Upstart),你可能需要使用相应的替代工具,例如 `service` 或 `chkconfig`。 在你提供的命令行提示符中,`(base)` 可能是某个特定环境或配置的标记,而 `tom@ideal-lush-3450-549485c5c6-5cn65` 表示你当前登录的用户和主机名。`~/fssd/aleo3/__MACOSX$` 表示你在名为 `fssd/aleo3/__MACOSX` 的目录中,最后的 `$` 表示你正在使用普通用户权限。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值