Zcash是zk-SNARKs的第一个广泛应用,zk-SNARKs是一种新颖的零知识密码学形式。Zcash的强大隐私保证源于Zcash中的屏蔽交易可以在区块链上完全加密,但仍然可以通过使用zk-SNARK证明在网络共识规则下验证为有效。
首字母缩略词zk-SNARK代表“零知识简洁非交互式知识论证”,并且指的是一种证据构造,其中人们可以证明拥有某些信息,例如秘密密钥,而不会泄露该信息,并且之间没有任何交互。证明者和验证者。
“零知识”证明允许一方(证明者)向另一方(验证者)证明陈述是真实的,而不会泄露超出陈述本身有效性的任何信息。例如,给定随机数的散列,证明者可以说服验证者确实存在具有该散列值的数字,而不会揭示它是什么。
在零知识的“知识证明”中,证明者不仅可以使验证者相信该数字存在,而且实际上他们知道这样的数字 - 再次,不会泄露有关该数字的任何信息。“证明”和“论证”之间的区别是非常技术性的,我们不在这里讨论它。
“简洁”的零知识证明可以在几毫秒内得到验证,证据长度只有几百字节,即使对于非常大的程序的陈述也是如此。在第一个零知识协议中,证明者和验证者必须来回传递多轮,但在“非交互式”构造中,证明包括从证明者发送到验证者的单个消息。目前,产生非交互性且足够短以发布到块链的零知识证明的最有效的已知方式是具有初始设置阶段,其生成在证明者和验证者之间共享的公共参考串。我们将此公共引用字符串称为系统的公共参数。
如果某人有权访问用于生成这些参数的秘密随机性,他们将能够创建对验证者有效的假证明。对于Zcash,这意味着恶意方可能制造假币。为了防止这种情况发生,Zcash通过精心设计的多党仪式产生了公共参数。要了解有关我们的参数生成仪式的更多信息,并查看我们为防止Zcash必不可少的秘密随机性(例如计算机被打捞)而采取的预防措施,请访问我们的Paramgen页面。要了解更多有关参数生成协议背后的数学,阅读我们的博客文章或白皮书(1,2)的话题。
如何在Zcash中构建zk-SNARK
为了在Zcash中具有零知识隐私,根据网络的共识规则确定交易有效性的功能必须返回交易是否有效的答案,而不揭示其执行计算的任何信息。这是通过在zk-SNARK中编码一些网络共识规则来完成的。在高层次上,zk-SNARKs首先将您想要证明的内容转化为关于知道某些代数方程的解的等价形式。在下一节中,我们简要概述了如何将确定有效事务的规则转换为方程式,然后可以在候选解决方案上进行评估,而不会向验证方程的各方泄露任何敏感信息。
计算→算术电路→R1CS→QAP→zk-SNARK
将事务有效性函数转换为数学表示的第一步是将逻辑步骤分解为最小可能的操作,从而创建“算术电路”。类似于布尔电路,其中程序被编译为离散的单个步骤,如AND,OR,NOT,当程序转换为运算电路时,它被分解为单个步骤,包括加法,减法的基本算术运算,乘法和除法(尽管在我们的特定情况下,我们将避免使用除法)。
下面是计算表达式(a + b)*(b * c)的运算电路的示例:
看一下这样的电路,我们可以将输入值a,b,c视为从导线向左“向右”走向输出线。我们的下一步是构建所谓的Rank 1约束系统或R1CS,以检查值是否“正确行进”。在这个例子中,R1CS将确认,例如,从b和c进入的乘法门出来的值是b * c。
在此R1CS表示中,验证器必须检查许多约束 - 几乎每个约束电路。(由于技术原因,事实证明我们只对来自乘法门的电线有一个约束。)在2012年关于该主题的论文中,Gennaro,Gentry,Parno和Raykova提出了一种很好的方法来“将所有这些约束捆绑成一个” 。该方法使用称为二次运算程序(QAP)的电路表示。现在需要检查的单个约束是在多项式之间而不是在数字之间。多项式可能非常大,但这是正常的,因为当多项式之间不存在同一性时,它将无法保持在大多数点。因此,您只需检查两个多项式是否在一个随机选择的点匹配为了以高概率正确验证证据。
如果证明者事先知道验证者将选择检查哪一点,他们可能能够制作无效的多项式,但仍然满足该点的身份。使用zk-SNARKs,使用复杂的数学技术,例如同态加密和椭圆曲线的配对,“盲目地”评估多项式 - 即不知道正在评估哪个点。上面描述的公共参数用于确定将检查哪个点,但是以加密形式,以便证明者和验证者都不知道它是什么。
到目前为止的描述主要解决了如何在“SNARKs”中获得S和N - 如何获得简短的,非交互式的单一消息证明 - 但是没有解决允许“zk”(零知识)部分证明他们保密秘密投入的保密性。事实证明,在这个阶段,通过让证明者使用仍然满足所需身份的原始多项式的“随机移位”,可以容易地添加“zk”部分。
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”数字(以后用于导出无效符号)和随机的随机数。
承诺= HASH(收件人地址,金额,rho,r)
当花费屏蔽事务时,发送者使用他们的消费密钥来发布一个无效符号,该无效符号是来自尚未花费的现有承诺的秘密唯一编号(“rho”)的散列,并提供零知识证明,证明该他们被授权消费。此散列必须不在已跟踪区块链中每个节点所保留的已用事务的空值集中。
Nullifier = HASH(消费密钥,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应用的解决方案中受益,取得联系我们的业务发展团队。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。