提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Aleo虚拟机AVM学习
全局状态
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