从 Zcash 和 Aleo 的技术出发,理解隐私交易的设计原理
2022-09-0710:22
Sin7y
2022-09-07 10:22
Sin7y
2022-09-07 10:22
收藏文章
订阅专栏


引言

从论文的角度看,Aleo 的可编程隐私设计所采用的的隐私设计和早期的 Zcash 的白皮书(zerocash)更为相近,类似的 Key 结构,类似的 Note 结构,类似的称呼(nf 在 zerocash 里称为 sn, serial number)。本文是基于 Zcash 最新的论文和 Aleo 的 ZEXE 做的比较,虽然在具体的细节上有所不同,比如 Key 结构,具体使用的密码学方法;但是在 high-level 的设计上大体相同。


除了前面所讲述的技术细节外,仍然存在一些其他的技术细节暂未涉及,比如 delegate prover 方案,零知识证明算法,递归 / 聚合方案等,有兴趣的同学可继续研究。

Zcash

1. 关于 Zcash?

一个简短的视频了解 Zcash,大概需要 2 分钟。

https://zcash.readthedocs.io/en/latest/rtd_pages/basics.html


特点:

• 匿名版的 BTC,类 UTXO 模型

• 只能做支付场景,不具备可编程性


2. 主要概念

注意: Zcash 经过多次协议升级,我们只关注最新版本。主要介绍 Zcash 里的各个核心概念。


2.1 Key components

图片来源

(Zcash protocol specification: section 3.1, page 12)


• sk:支出密钥,统一生成

• ask:支出授权密钥

• ak:支出验证密钥

• nk:无效衍生密匙

• rivk:Commitivk 随机性

• dk:分散密匙

• ivk:KAOrchard 私人密钥 / 输入查看密匙

• ovk:输出查看密匙

• pkd:传输密匙

• 支出密钥:密钥

• 全面查看密匙:解密交易背景

• 输入查看密匙

• 输出查看密匙

• 屏蔽支付地址:每次都应不同

你可以在 Zcash protocol specification: section 4.2.3, page 36 了解这些 Key 的计算方式。


2.2 Note

note 是 Zcash 协议中的基本单元,类似于 BTC 中的 UTXO;在 Zcash 中,所有交易的输入和输出都是 notes。当然,Zcash 也支持非匿名的交易,这样和 BTC 的交易模式一样。

所以,要想更深入的了解 Zcash,得先需要了解 note 的数据结构:

图片来源

(Zcash protocol specification: section 3.2, page 14)


• {d′pkd}:note 所有者的地址信息

• v:note 对应的金额

• {ρ 'ψ}:计算 nullifier 的随机数

• rcm:用于计算 note commitment 的随机数


在 Zcash 的协议中,因为隐私的需求,note 是不能公开的,因此,需要计算对应的 commitment 来代表这个 note,计算方式如下:

图片来源

(Zcash protocol specification: section 3.2, page 15)


2.3 Action transfer

一笔交易里,可能包含多个 action transfer,每个 action transfer 会花费老的 note,生成新的 note,其数据结构如下:

图片来源

(Zcash protocol specification: section 4.6, page 41)


• cvnet:用于 action transfer 的 balance 校验,通过 binding signature 实现,不包含在 zk proof 里

• rtOrchard:上一个区块对应的状态跟,用于校验花费的 note 的有效性

• nf:花费的 note 的标识,用于防止双花

• rk:用来验证 spender 具有花费的 note 的权利,通过 spendAuthSig 签名验签的形式

• cmx:生成新的 note 的承诺

• epk:临时公钥,用来解密新 note 得 noteplaint 信息

• Cenc,Cout:新 note 被加密后的密文

• enbaleSpends,enableOutputs:指示当前 action transfer 的类型

• π:zk proof


2.4 Action statement

公共输入是:

 {rtOrchard,cvnet,nfold,rk,cmx,enbaleSpends,

enableOutputs}

隐私输入是:

{path,pos,goldd,pkoldd,voldoldold,rcmold,cmold

α,akP,nk,rivk,

gnewd,pknewd,vnewnew,rcmnew,rcv} 

证明 statement 为:

图片来源 (Zcash protocol specification: section 4.17.1, page 40)


•  花费的 note 的完整性,和 noteplaint 唯一绑定

•  花费的 note 的有效性,cm tree 的存在性证明

•  Value 承诺的完整性,和 rcv, old value, new value 唯一绑定

•  Nullifier 的完整性,防止 double spend,维护一个花费的 note set

•  花费的 note 的合法性

•  地址的完整性

•  新 note 的完整性

•  flag 的合法性


2.5 交易结构和示例

2.5.1 交易结构

图片来源(Zcash protocol specification: section 7.1, page 119)


整个交易结构包含四个部分:

•  Public info (1 - 5)

•  Transparent transactions info (6 - 9)

•  Sapling transactions info (10 - 16)

•  Orchard transaction info (17 - 25)


2.5.2 从 transparent 到 shield

Orchard 协议里包含两种地址, transparent address(TA) 和 shield address(SA)。一般,为了执行隐私交易,需要先从 TA 往 SA 转账,此时对应的交易结构应为:

• Public info (1 - 5)

• Transparent transactions info (6 - 9)

ⅰ. tx_in_*:实际值

ⅱ. tx_out_*:默认值

• Sapling transactions info (10 - 16)

ⅰ. All:默认值

• Orchard transaction info (17 - 25)

ⅰ.  All:实际值


2.5.3 从 shield 到 shield

Orchard 协议里包含两种地址, transparent address(TA) 和 shield address(SA)。一般,为了执行隐私交易,需要先从 TA 往 SA 转账,此时对应的交易结构应为:

• Public info (1 - 5)

• Transparent transactions info (6 - 9)

ⅰ. All:默认值

• Sapling transactions info (10 - 16)

ⅰ. All:默认值

• Orchard transaction info (17 - 25)

ⅰ. All:实际值


2.5.4 从 shield 到 transparent

Orchard 协议里包含两种地址,transparent address(TA) 和 shield address(SA)。一般,为了执行隐私交易,需要先从 TA 往 SA 转账,此时对应的交易结构应为:

• Public info (1 - 5)

• Transparent transactions info (6 - 9)

ⅰ. tx_in_*:默认值

ⅱ. tx_out_*:实际值

• Sapling transactions info (10 - 16)

ⅰ. All:默认值

• Orchard transaction info (17 - 25)

ⅰ. All:实际值


2.6 如何实现隐私?

• Unlinkable

生成的 note 用 cm 表示,花费的 note 用 nf 表示,nf 和 cm 之间无任何联系,因此,任何人都无法通过这些信息去判断任何一个被生成的 note 是在哪一笔交易里被花费的。

• Private

ⅰ. Sender address:

交易信息里不包含 sender 地址且 spendAuthSig 为一次性签名(每次都不一样,所以公钥不同,rk)。

ⅱ.Receiver address:

交易里不包含 receiver 的地址 且 新的 Note plaint 用的是 recevier 的公钥加密(接受者的隐私地址也是一次性的)。

. Value:

用 pedersen commitment 形式隐藏 Note,且通过 bindsig 来保证交易的 balance 属性。


Aleo

1. 和 Zcash 的异同

Zcash 只能执行基于 OUTX 模型的隐私交易,不具备可编程性;因此,Aleo 和 Zcash 最主要的区别是隐私可编程性;相同点是都支持隐私属性(交易隐私,不只包含资产类)。


2. Aleo VS Zcash

2.1 Unit

和 Zcash 的 note 不同,Aleo 里的基本操作单元是 record(BTC 里的是 UTXO),下面让我们看一下两者的主要区别:

图片来源

(Zcash protocol specification: section 3.2, page 14)


图片来源

(Zexe protocol specification: section 3.1, page 17)


虽然具体参数名称不相同,但是从功能角度来看,两者之间具有对应关系:

分别对应 note 拥有者的地址信息,承诺相关信息, nf/sn 相关信息,value 相关信息。


所以,两者结构基本类似;主要的区别在于 record 里的 birth predicate,death predicate。这是两个 Boolean 类型的函数,代表着,当一个 record 在 birth(generate) 和 death(spend) 阶段,分别需要满足的条件,这一块是支持 user-defined,因此具有可编程性。


2.2 交易结构

图片来源

(Zexe protocol specification: section 3.1, page 17)


和 Zcash(2.5.1) 的交易主要结构相比,仍然相似:

▪ 消费的 record 对应的序列号 sn,在 Zcash 里用 nf 表示,都是具有全局唯一性。

▪  新生成的 record 对应的承诺。

▪ 新生成 record 的 plaint,包括拥有者信息,对应的 birth/death predicate 等。


2.3 Prover statement

图片来源

(Zexe protocol specification: section 2.4, page 13)


需要证明:

▪ Old record 的有效性

▪ Old record 的合法性(具备花费 record 的权利)

▪ New record 的有效性

▪ Birth/Death predicate 的有效性(类似于 Zcash 里的 Balance 校验)


3. 其他

3.1 为什么都是 utox-based,不是 account-based?

Remark2.3(Zexe protocol specification: section 2.3, page 11)

https://eprint.iacr.org/2018/962.pdf


参考

1. (Zcash)Zcash protocol specification(文中前 6 张图片来源):

https://zips.z.cash/protocol/protocol.pdf


2. (Aleo)Zexe protocol specification(Figure4/5/6,Remark2.3):

https://eprint.iacr.org/2018/962.pdf


3. 协议升级:https://z.cash/upgrade/


4. zerocash:https://eprint.iacr.org/2014/349.pdf

关于我们

Sin7y 成立于 2021 年,由顶尖的区块链开发者组成。我们既是项目孵化器也是区块链技术研究团队,探索 EVM、Layer2、跨链、隐私计算、自主支付解决方案等最重要和最前沿的技术。

微信公众号:Sin7y

GitHub: Sin7y

Twitter: @Sin7y_Labs

Medium: Sin7y

Mirror: Sin7y

HackMD: Sin7y

HackerNoon: Sin7y

Email: contact@sin7y.org


【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

专栏文章
查看更多
数据请求中

推荐专栏

数据请求中

一起「遇见」未来

DOWNLOAD FORESIGHT NEWS APP

Download QR Code