1. Aleo 项目概述

区块链是一个分布式系统,区块链数据公开透明,任何人都可以查看,这也暴露了用户的隐私信息。如何保护数据的隐私成为区块链一个亟待解决的问题。Zerocash 是基于 Bitcoin 的 UTXO 模型的隐私交易协议,则 Zether 是基于 Ethereum 的账户模型的隐私交易协议。这些协议使用零知识证明技术一定程度上保护交易数据的隐私性,实现交易的发送方接收方和交易金额的完全隐藏。但是这些协议无法做法智能合约/函数层面的隐私性。

Aleo 是一个面向隐私的区块链平台项目,致力于提供高度隐私保护的智能合约和去中心化应用程序。通过使用零知识证明等密码学技术,允许用户在不泄露原始数据的情况下验证隐私数据的有效性和合理性。即实现链下零知识证明的生成,链上实现零知识证明的高效验证(交易的简洁性)。

Aleo 主要包含如下几个大的模块:

· 智能合约:与以太坊等平台类似,Aleo 支持智能合约的开发和执行。不同之处在于,Aleo 的智能合约着重于提供更高水平的隐私。

· leo 语言:Aleo 提供了一种名为 leo 的编程语言,专为隐私保护而设计。Aleo 语言使开发人员能够创建支持隐私的智能合约,并在保护用户数据的同时实现数据完整性。

· Aleo instructions:Aleo 提供了一套指令,为开发人员提供了一个易于使用的环境,使其能够编写支持隐私和完整性的程序。

2. account 模型

与 Ethereum 账户类似,Aleo 的账户也是用于管理用户的私钥,通过私钥可以派生出公钥/地址,顾名思义公钥/地址是可以公开的。任何用户可以通过公钥与其他人进行交易。而通过私钥,用户可以访问和控制自己的资金。因此私钥的安全性尤为重要,一旦丢失,则丧失账户资金的所有控制权。

账户的作用是进行签名和加密等处理。Aleo 的账户主要包含 privateKey, viewKey, address, 如下图展示了账户密钥之间的关系。

2.1 privateKey

Aleo privateKey 代表了用户唯一的身份,在 Aleo 中主要作用是

· 派生公钥

· 参与交易签名,即授权一笔附有零知识证明的交易的执行

· 参与某些加密算法运算。

privateKey 主要包含 3 部分:

2.2 computeKey

由私钥计算而来,其中 G 为椭圆曲线群的生成元,此处不做详细介绍。computeKey 作为签名结构体的一部分,它可以代表用户对交易进行签名的生成和验证。详见 2.6.

2.3 viewKey

Aleo 账户的 viewKey 是由 PrivateKey 计算出来的,主要作用对 Aleo 链上交易输入/输出数据进行加密/解密处理。具体可参考 Record 模型中介绍。

2.4 地址 address

在 Aleo 中地址是用户唯一公开的身份标识。它用于接收/发送官方的 token(Aleo credits),可以与其它用户或者应用尽心交互。地址的计算方式有如下几种:

2.5 graphKey

2.6签名算法

用户之间进行交互,都需要确认发送方的身份,签名的作用是确认消息发送方的身份和消息内容的完整性。因此 Aleo 中引入了 Schnorr 签名算法,用于对交易进行签名。

一般签名算法主要包含 4 个算法,

2.7 私钥的加密存储

类比于助记词,私钥对用户至关重要,它对账户拥有绝对的控制权,一旦丢失将无法恢复。根据 Aleo 私钥派生算法,我们发现 seed 非常重要,privateKey 的核心在于这个随机 seed,一旦拥有 seed,我们就完全能够生成账户的$$sk_{sig},r_{sig}$$。

通常在创建账户时,生成的私钥存储在本地,从安全性考虑,存储私钥时需要对私钥进行加密处理。具体算法如图所示。核心思想是引入随机性隐藏/blind seed,然后引入 PRF 确定性生成多个随机数,为每个明文字段/field 上的一个元素进一步进行随机化处理/加密处理。

3. Record 模型

一笔交易中会有很多的 inputs 和 outputs,而 inputs 和 outputs 可以是 record 类型,Record 默认是 private 的即是加密的。Aleo record 类似于 UTXO,如果 record 作为一个函数的输入,那么表示该 record 将被消费 consumed,不能再被使用。即它的唯一标识序列号 sn 被公布。在多数情况下,一个函数的输出会创建出新的 record。

3.1 Record 明文字段

Record 是 Aleo 中非常重要的数据结构,它用于编码用户的资产和状态数据。它会包含如下 3 个字段:

· owner:该 record 的所有者

· data:program 的 data

· nonce:唯一标识一个 record,确保每个 Record 的都是唯一的,因此 nonce 值都是唯一的

示例如下图所示

3.2 Record 密文字段

在 Aleo 中,通过状态函数来消费 records 和创建 records,而一笔交易中包含了多个状态转移函数。默认情况下,record 是 private 的,即 record 中的所有字段都是经过加密的。要介绍 Record 的加密算法前,我们需要先了解密钥共享协议。

3.2.1 密钥共享协议

如下是用户 A 为用户 B 生成仅用户 B 可以解密的信息。具体做法是:

· 用户 A 获取消息接收方 B 的地址(公开的)

· 用户 A 生成临时私钥和公钥,并将公钥共享给用户 B

· 用户 B 可以计算出一个共享密钥 K_B

· 用户 A 也可以计算出一个共享密钥 K_A

通过计算发现 K_A 与 K_B 相等。即用户 A 与用户 B 在交互过程中并没有泄漏任何隐私信息,但是能够得到一个共享的会话密钥。这对于 Record 加密处理非常重要。

3.2.2 Record 加密

假设用户 A 要给用户 B 创建一个加密的 Record, 通过上述密钥共享协议思想,

· 用户 A 为用户 B 生成一个临时公钥,该公钥作为 nonce 进行公布,

· 用户 A 生成共享密钥 K,并用该共享密钥 K 作为伪随机函数 PRF 的输入,生成多个随机值

· 使用 PRF 生成的随机值为 Record 中 private 字段进行随机化/加密。

当该 Record 作为交易的 output 签名上链后,由于它是密文状态的,除了用户 B 即该 Record 的 ownerB 可以解密查看数据,其他用户均不可见。

· 用户 B 使用自己的 viewKeyB 和 Record 中的 nonce 值,计算共享密钥 K

· 使用 PRF(K) 生成多个随机值,然后使用随机值解密获取 Record 原始明文数据。

3.3 Record 的承诺

交易签名的时候,会将所有的 inputs 和 outpus 按照 constant、public、private、Record 等类型进行处理,作为签名的消息,其中 Record 类型的 input/output 会进行 commit 处理。即生成 commit, gamma, serialNumber, tag。

4. Aleo 的交易

该部分简要介绍 Aleo 的 credits.aleo 中几种交易类型。在介绍交易之前我们先简要介绍一些 Aleo Program。

4.1 Program

在 Aleo 中 zero-knowledge 的 program 应用可以通过如下两种语言进行编写

· Leo: 类似于 Ethereum 的 solidity,Aleo 引入高级语言 Leo 开发各种隐私应用,然后通过编译器将 program 编译成 Aleo.VM 能识的指令 (Aleo instructions/bytecode),

· Aleo instructions: Aleo 指令是一个静态类型的语言,用于编写隐私应用程序。通过零知识证明技术,Aleo 能够实现链下计算,链上验证计算的一致性。

program 的 functionality,

· extensibility:用户可以自由定义自己的 program

· isolation:恶意的 program 不会影响到诚实的 program

· inter-process communication: program 函数可以交互。

4.2 Aleo 的 ZK 协议概述

近几年零知识证明被广泛应用到区块链中,它成为隐私性和扩展性的重要工具。在可验证的外包计算、匿名证书、范围证明、隐私密码学货币以及 L2 上具有广泛的应用。在实际应用中客户端交易频繁,因此要部署高效实用的零知识证明协议,需要该协议的证明足够小,验证足够高效(small proof size and fast verification)。

Aleo 通过使用零知识证明技术实现隐私功能,在实际中主要使用的是 Marlin 协议,它是 zk-SNARKs 协议的一个具体实例。根据是否有 trusted-setup,我们将 zk-SNARKs 的构造简要分为如下几类:

· trusted-setup: 代表为 Groth16,使用的 KZG 多项式承诺方案,该方案引入了一个可信的 CRS,针对不同的应用场景,需要重新生成。因此该协议该协议更适用于单一不变的应用场景。如 Zcash 使用该技术实现基于 UTXO 模型的隐私交易证明。

· updatable SRS:代表协议为 Plonk,目前应用最为广泛的协议,该协议本质上也是需要可信的公共参考串设置,只不过全局的公共参数只需要生成一次,针对不同的应用场景,公共参考串可以进行更新,因此能够适用于各种各样的应用场景。

· no trusted setup:典型协议代表为 bulletproof,它无需可信的参数设置,但是它的证明生成和验证相对上述两种更慢一些。

Aleo 使用的 Marlin 协议,它与 Plonk 的区别在于它的 marlin 的算术化语言是 R1CS,plonk 是 plonkish (custom gate + lookup)。此外 Aleo 实现了一层的递归零知识证明来达到详细协议后续再展开。

4.3 Aleo credit 交易

Aleo 部署了网络原生 token 合约 credit.aleo 的合约。该合约实现了隐私转账功能。合约中主要定义了两个数据结构,record credits 和 mapping account。其中 record credits 用于记录 private 状态,而 mapping acocunt 用于记录 public 的状态。合约能够支持如下几种交易:

· transfer_private:实现发送者和接收者完全隐私的转账交易。即通过隐私的 Record 进行相互转账。如 user1 消费自己的两个 record1 和 record2(类似于 UTXO),为 user2 生成一个新的 record3。而 Record 的加密方式请参考上述第 3 部分。

· transfer_private_to_public:实现隐私发送者给公开接收者转账功能。如 user1 消费自己的两个 record3 和 record4,为公开的 user3 进行转账,由于 user3 是公开的,因此该交易中 user3 的状态将使用 mapping account 来记录

· transfer_public:完全公开透明的交易

· transfer_public_to_private:实现公开的发送者到隐私接收者转账功能。