在2012年关于该主题的论文中,Gennaro,Gentry,Parno和Raykova提出了一种很好的方法来“将所有这些约束捆绑成一个” 。该方法使用称为二次运算程序(QAP)的电路表示。现在需要检查的单个约束是在多项式之间而不是在数字之间。多项式可能非常大,但这是正常的,因为当多项式之间不存在同一性时,它将无法保持在大多数点。因此,您只需检查两个多项式是否在一个随机选择的点匹配为了以高概率正确验证证据。
如果证明者事先知道验证者将选择检查哪一点,他们可能能够制作无效的多项式,但仍然满足该点的身份。使用zk-SNARKs,使用复杂的数学技术,例如同态加密和椭圆曲线的配对,“盲目地”评估多项式 - 即不知道正在评估哪个点。上面描述的公共参数用于确定将检查哪个点,但是以加密形式,以便证明者和验证者都不知道它是什么。
到目前为止的描述主要解决了如何在“SNARKs”中获得S和N - 如何获得简短的,非交互式的单一消息证明 - 但是没有解决允许“zk”(零知识)部分证明他们保密秘密投入的保密性。事实证明,在这个阶段,通过让证明者使用仍然满足所需身份的原始多项式的“随机移位”,可以容易地添加“zk”部分。
有关zcash中zk-SNARK背后关键概念的逐步深入解释,请参阅我们的SNARKs Explainer系列,其中包含以下帖子:
Zcash使用bellman,一个用于zk-SNARK的Rust语言库。在Sapling升级之前,Zcash使用了C ++库的分支libsnark。要深入了解用于Zcash zk-SNARK的协议,请参阅Pinocchio协议上的文章,该协议在Sapling升级之前使用,而Jens Groth目前使用的zk-SNARK。

如何应用zk-SNARK来创建屏蔽事务

在比特币中,通过链接发送方地址,接收方地址以及公共区块链上的输入和输出值来验证交易。Zcash使用zk-SNARK来证明满足有效交易的条件,而不会泄露有关所涉及的地址或价值的任何重要信息。屏蔽事务的发送者构造证据以证明:
输入值与每个屏蔽传输的输出值相加。发件人证明他们拥有输入票据的私人支出键,赋予他们消费的权力。输入注释的私人支出密钥以加密方式链接到整个交易上的签名,使得交易不能被不知道这些私钥的一方修改。
此外,屏蔽交易必须满足下面描述的一些其他条件。
比特币跟踪未使用的交易输出(UTXO)以确定可花费的交易。在Zcash中,屏蔽等效的UTXO被称为“承诺”,并且花费承诺涉及揭示“无效”。Zcash节点保留已创建的所有承诺的列表,以及已显示的所有无效符。承诺和无效符存储为哈希值,以避免披露有关承诺的任何信息,或哪些无效符与哪些承诺相关。
对于由屏蔽支付创建的每个新笔记,将发布一个承诺,其中包含以下散列:发送笔记的地址,发送的金额,此笔记所特有的“rho”数字(以后用于导出无效符号)和随机的随机数。
Commitment = HASH(recipient address, amount, rho, r)
当花费屏蔽事务时,发送者使用他们的消费密钥来发布一个无效符号,该无效符号是来自尚未花费的现有承诺的秘密唯一编号(“rho”)的散列,并提供零知识证明,证明该他们被授权消费。此散列必须不在已跟踪区块链中每个节点所保留的已用事务的空值集中。
Nullifier = HASH(spending key, rho)
屏蔽事务的零知识证明验证除了上面列出的条件之外,以下断言也是如此:
对于每个输入注释,存在显示的承诺。无效化器和注释承诺是正确计算的。输出音符的无效符与任何其他音符的无效符冲突是不可行的。
除了用于控制地址的消费密钥之外,Zcash还使用一组证明和验证密钥来创建和检查证明。这些密钥在上面讨论的公共参数仪式中生成,并在Zcash网络中的所有参与者之间共享。对于每个屏蔽事务,发送方使用其证明密钥生成其输入有效的证明。通过用验证密钥检查证明者的计算,矿工检查屏蔽的交易是否遵循共识规则。Zcash的证明生成方式的设计要求证明者预先做更多的工作,但它简化了验证,因此主要的计算工作被卸载到事务的创建者(这就是为什么创建一个屏蔽的Zcash事务可以占用到40秒,
Zcash的屏蔽事务的隐私依赖于标准的,经过反复验证的密码术(哈希函数和流密码),但它增加了zk-SNARK,应用于承诺和无效系统,允许发送者和接收者进行屏蔽事务证明加密交易有效。为加密货币提供隐私的其他方法依赖于模糊交易之间的联系,但Zcash交易可以存储在完全加密的区块链上这一事实为加密货币应用开辟了新的可能性。加密交易允许各方享受公共区块链的好处,同时仍然保护他们的隐私。计划的未来升级将允许用户自行选择性地披露有关屏蔽交易的信息。请参阅Zcash的近期未来博客文章,了解Zcash的未来计划。
有关如何在Zcash中构建屏蔽事务的更深入说明,请参阅我们关于屏蔽地址之间的事务如何工作的博客文章。有关当前Zcash协议的完整详细信息,请参阅我们的协议规范。

zk-SNARKs的未来应用

在Zcash中创建屏蔽事务只是zk-SNARK的许多可能应用中的一个例子。从理论上讲,您可以使用zk-SNARK来验证任何关系,而不会泄露输入或泄漏信息。生成复杂函数的证明对于许多应用来说仍然是计算密集型的,但是Zcash团队正在推动优化zk-SNARK的界限,并且已经通过更高效的实现开辟了新的领域。
目前看来,Zcash的zk-SNARK实现可以作为企业用例的零知识安全层添加到任何现有的分布式分类账解决方案中。Zcash团队的科学家是世界上zk-SNARKs知识最渊博的研究人员之一,他们不断致力于提出新的应用并提高零知识协议的效率。如果你的业务需要,可以从零知识证明或具有强大的隐私blockchain应用的解决方案中受益,取得联系我们的业务发展团队。
附加信息
参考
协议规范
原始Zerocash论文
简洁非交互式零知识证明
多方协议参数生成
Zcash Ceremony