Zcash安全属性分析

Zcash是一种开源的、去中心化的数字货币,2016年10月开始发行。其特点是隐私性更好。Zcash主要包括Setup、CreateAddress、Mint、Pour、VerifyTransaction和Receive六个过程。它在BitcoinCore的基础上增加了零知识证明协议,使得交易可以验证,但交易的参与者以及交易金额可以不公开。

零知识证明协议(示意图见图2-10)是证明者能够在不泄漏任何有用信息的情况下,使验证者相信他知道一个秘密。Goldwasser等人在1985年最先提出了交互式零知识证明。由于交互式证明要求交互的各方同时在线,而且证明过程比较耗时,于是1988年又提出了非交互式零知识证明。图2-10是一个简单的非交互零知识证明协议[1]。假设Alice计划证明她知道一个秘密x,并且x满足离散对数y=gx mod p。

零知识证明协议

零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。一个零知识证明协议包含3种算法:KeyGen,Prove和Verify。KeyGen是一种随机算法,输入公共参数,输出证明密钥pk和验证公钥vk;Prove算法输入证明公钥pk、实例x以及证据a,输出一个零知识证明π;Verify算法则输入验证密钥sk、实例x以及证明π,输出一个判定比特。一个零知识证明必须满足以下几个条件。

1)完备性,如果论断是真的,诚实的证明者能够说服诚实的验证者,相信这个事实。

2)可靠性,如果论断是假的,除了一些小概率,不诚实的证明者无法说服诚实的验证者,相信该论断是真的。

3)零知识,如果论断是真的,不诚实的验证者将不能获得其他任何信息,除了该论断是真的。

4)零知识证明协议的核心使用了同态隐藏函数,同态隐藏E(x)是这样一类函数,即满足不可逆、唯一性和生态性的函数。

①不可逆:对于大部分x,给定E(x),很难计算出x。

②唯一性:对于不同的输入,输出也不同,即当x≠y时,E(x)≠E(y)。

③同态性:E(x)*E(y)=E(x○y)。其中○是函数E(x)定义域中的运算,*是函数E(x)值域中的运算。

利用这类函数的同态性,在证明时只需对值域中的元素E(x)、E(y)操作,就可以知道定义域中的元素x、y满足什么关系。同时,又因为具有不可逆性,攻击者无法从E(x)逆推出秘密x。

Zcash提供两种地址:t-地址和z-地址。其中t-地址是公开地址,就像比特币中的地址;而z-地址是秘密地址。下面将描述如何在z-地址之间进行交易,达到保护隐私的目的。

假设某个节点已经正确接收到了未消费交易的输出(UTXO),不妨用未消费note表示每一个UTXO。其中包含了地址和资金,而地址其实就是公钥。简单起见,假设每一个note只含有1元,而且每一个地址至多只有一个note。那么,在某一时刻,该节点的数据库中包含了未消费note的列表,而且每一个note可以简单地用地址来表示,比如:

Note1=(PK1),Note2=(PK2),Note3=(PK3)

事实上,为了增强隐私性,每个note中还可以添加一个随机数r:

Note1=(PK1,r1),Note2=(PK2,r2),Note3=(PK3,r3)

然后使用Hash函数进行压缩,使得它们不可逆:

H1=HASH(Note1),H2=HASH(Note2),H3=HASH(Note3)

为了区分已经消费和未消费的note,需要引入一个废弃集合(NullifierSet),这个集合记录了已经消费的note中随机数的Hash值,如表2-2所示。

NOTE集合与废弃集合的区别

现在不妨设PK1是张三的地址,他准备把1元支付给李四,李四的地址为PK4。假设张三和李四构建了一个秘密通信信道,当然,这个秘密信道在Zcash中并不是必需的。张三执行如下步骤:

1)他选择一个随机数r4,并定义新的note:Node4=(PK4,r4)

2)他通过秘密通信信道把Node4发送给李四。

3)他把nf2=HASH(r1)发送给所有节点。

4)他把H2=HASH(Node4)发送给所有节点。

当各个节点接收到nf2和H4后,就会验证nf2对应的note是否已经消费。验证方法也很简单,只需验证nf2是否已经在废弃集合中。如果没有在废弃集合中,就把nf2加入废弃集合,同时把H4加入HashedNotes集合,如表2-3所示。

更新后的集合

在以上步骤中,各个节点验证了Node1未消费,但没有验证Node1属于张三,甚至没有验证它是一个合法的note,即计算Node1的Hash值,再确认这个Hash值的确在hashednotes集合中。有一种简单的方法,是张三公开Node1来证明他拥有Node1,但这又丧失了隐私性。所以,Zcash使用了零知识证明。张三公开一个证明π使得其他节点相信:无论谁发布这笔交易,他就知道公钥PK1、私钥sk1和随机数r1的值,而且满足:

1)Node1=(PK1,r1)的Hash值在HashedNotes集合中;

2)sk1是公钥PK1对应的私钥,知道sk1的用户就意味着拥有Note1

3)r1的Hash值是nf2。零知识证明的特性能确保PK1、sk1和r1不会泄漏。为了通俗易懂,我们忽略了很多的细节,有兴趣的读者可以查阅Zcash的协议标准。

blob.png

868区块链学习网为您整理《Zcash安全属性分析》仅供参考。