我对想学点有关电脑的知识基本零知识这样,想请教一下我应该从那方面的课程学起?

工程领域从来没有黑科技;密码学不仅是工程。

密码学相关的安全技术在整个信息技术领域的重要地位无需多言。如果没有现代密码学和信息安全的研究成果,人类社会根本无法进入信息时代。区块链技术大量依赖了密码学和安全技术的研究成果。

实际上,密码学和安全领域所涉及的知识体系十分繁杂,本章将介绍密码学领域中跟区块链相关的一些基础知识,包括Hash算法与数字摘要、加密算法、数字签名、数字证书、PKI体系、Merkle树、布隆过滤器、同态加密等。读者通过阅读本章可以了解如何使用这些技术保护信息的机密性、完整性、认证性和不可抵赖性。

一、Hash算法与数字摘要

  • 有效期(Validity):证书的有效期限,包括起止时间;

  • 颁发者唯一号(Issuer Unique Identifier):代表颁发者的唯一信息,仅2、3版本支持,可选;

  • 主体唯一号(Subject Unique Identifier):代表拥有证书实体的唯一信息,仅2、3版本支持,可选;

  • 扩展(Extensions,可选):可选的一些扩展。v3中可能包括:

  • Key Usage:证书的用途或功能信息。

此外,证书的颁发者还需要对证书内容利用自己的公钥添加签名,以防止别人对证书内容进行篡改。

生成过程中需要输入地理位置、组织、通用名等信息。生成的私钥和csr文件默认以PEM格式存储,内容为Base64编码。

如生成的csr文件内容可能为:

openssl工具提供了查看PEM格式文件明文的功能,如使用如下命令可以查看生成的csr文件的明文:

需要注意,用户自行生成私钥情况下,私钥文件一旦丢失,CA方由于不持有私钥信息,无法进行恢复,意味着通过该证书中公钥加密的内容将无法被解密。

证书超出有效期后会作废,用户也可以主动向CA申请撤销某证书文件。

由于CA无法强制收回已经颁发出去的数字证书,因此为了实现证书的作废,往往还需要维护一个撤销证书列表(Certificate Revocation List,CRL),用于记录已经撤销的证书序号。

因此,通常情况下,当第三方对某个证书进行验证时,需要首先检查该证书是否在撤销列表中。如果存在,则该证书无法通过验证。如果不在,则继续进行后续的证书验证过程。

Merkle(默克尔)树,又叫哈希树,是一种典型的二叉树结构,由一个根节点、一组中间节点和一组叶节点组成。在区块链系统出现之前,广泛用于文件系统和P2P系统中,如图5-3所示。

最下面的叶节点包含存储数据或其哈希值;

非叶子节点(包括中间节点和根节点)都是它的两个孩子节点内容的哈希值。

进一步地,默克尔树可以推广到多叉树的情形,此时非叶子节点的内容为它所有的孩子节点内容的哈希值。

默克尔树逐层记录哈希值的特点,让它具有了一些独特的性质。例如,底层数据的任何变动,都会传递到其父节点,一层层沿着路径一直到树根。这意味树根的值实际上代表了对底层所有数据的“数字摘要”。

目前,默克尔树的典型应用场景有很多,下面分别介绍。

6.1、快速比较大量数据

对每组数据排序后构建默克尔树结构。当两个默克尔树根相同时,则意味着两组数据必然相同。否则,必然存在不同。

由于Hash计算的过程可以十分快速,预处理可以在短时间内完成。利用默克尔树结构能带来巨大的比较性能优势。

例如图5-3中,如果D1中数据被修改,会影响到N1、N4和Root。

因此,一旦发现某个节点如Root的数值发生变化,沿着Root→N4→N1,最多通过O(logn)时间即可快速定位到实际发生改变的数据块D1。

仍以图5-3为例,如何向他人证明拥有的某组数据(D0……D3)中包括给定某个内容D0而不暴露其他任何内容。

很简单,构造如图所示的一个默克尔树,公布N1、N5、Root。D0拥有者通过验证生成的Root是否跟提供的值一致,即可很容易检测D0存在。整个过程中验证者无法获知其他内容。

布隆过滤器因为其高效性大量应用于网络和安全领域,例如信息检索(BigTable和HBase)、垃圾邮件规则、注册管理等。

7.1、基于Hash的快速查找

在布隆过滤器之前,先来看基于Hash的快速查找算法。在前面的讲解中我们提到,Hash可以将任意内容映射到一个固定长度的字符串,而且不同内容映射到相同串的概率很低。因此,这就构成了一个很好的“内容→索引”的生成关系。

试想,如果给定一个内容和存储数组,通过构造Hash函数,让映射后的Hash值总不超过数组的大小,则可以实现快速的基于内容的查找。例如,内容“hello world”的Hash值如果是“100”,则存放到数组的第100个单元上去。如果需要快速查找任意内容,如“hello world”字符串是否在存储系统中,只需要将其在常数时间内计算Hash值,并用Hash值查看系统中对应元素即可。该系统“完美地”实现了常数时间内的查找。

然而,令人遗憾的是,当映射后的值限制在一定范围(如总数组的大小)内时,会发现Hash冲突的概率会变高,而且范围越小,冲突概率越大。很多时候,存储系统的大小又不能无限扩展,这就造成算法效率的下降。为了提高空间利用率,后来人们基于Hash算法的思想设计出了布隆过滤器结构。

7.2、更高效的布隆过滤器

布隆过滤器采用了多个Hash函数来提高空间利用率。对同一个给定输入来说,多个Hash函数计算出多个地址,分别在位串的这些地址上标记为1。进行查找时,进行同样的计算过程,并查看对应元素,如果都为1,则说明较大概率是存在该输入。如图5-4所示。

布隆过滤器相对单个Hash算法查找,大大提高了空间利用率,可以使用较少的空间来表示较大集合的存在关系。

实际上,无论是Hash算法,还是布隆过滤器,基本思想是一致的,都是基于内容的编址。Hash函数存在冲突,布隆过滤器也存在冲突。这就造成了两种方法都存在着误报(false positive)的情况,但绝对不会漏报(false negative)。

布隆过滤器在应用中误报率往往很低,例如,在使用7个不同Hash函数的情况下,记录100万个数据,采用2 MB大小的位串,整体的误判率将低于1%。而传统的Hash查找算法的误报率将接近10%。

同态加密(homomorphic encryption)是一种特殊的加密方法,允许对密文进行处理得到仍然是加密的结果。即对密文直接进行处理,跟对明文进行处理后再对处理结果加密,得到的结果相同。从抽象代数的角度讲,保持了同态性。

同态加密可以保证实现处理者无法访问到数据自身的信息。

如果定义一个运算符Δ,对加密算法E和解密算法D,满足:

则意味着对于该运算满足同态性。

同态性来自代数领域,一般包括四种类型:加法同态、乘法同态、减法同态和除法同态。同时满足加法同态和乘法同态,则意味着是代数同态,称为全同态(full homomorphic)。同时满足四种同态性,则称为算数同态。

对于计算机操作来讲,实现了全同态意味着对于所有处理都可以实现同态性。只能实现部分特定操作的同态性,称为特定同态(somewhat homomorphic)。

仅满足加法同态的算法包括Paillier和Benaloh算法;仅满足乘法同态的算法包括RSA和ElGamal算法。

同态加密在云计算和大数据的时代意义十分重大。目前,虽然云计算带来了包括低成本、高性能和便捷性等优势,但从安全角度讲,用户还不敢将敏感信息直接放到第三方云上进行处理。如果有了比较实用的同态加密技术,则大家就可以放心地使用各种云服务了,同时各种数据分析过程也不会泄露用户隐私。加密后的数据在第三方服务处理后得到加密后的结果,这个结果只有用户自身可以进行解密,整个过程第三方平台无法获知任何有效的数据信息。

另一方面,对于区块链技术,同态加密也是很好的互补。使用同态加密技术,运行在区块链上的智能合约可以处理密文,而无法获知真实数据,极大地提高了隐私安全性。

目前全同态的加密方案主要包括如下三种类型:

  • 基于理想格(ideal lattice)的方案:Gentry和Halevi在2011年提出的基于理想格的方案可以实现72 bit的安全强度,对应的公钥大小约为2.3 GB,同时刷新密文的处理时间需要几十分钟;

  • 基于整数上近似GCD问题的方案:Dijk等人在2010年提出的方案(及后续方案)采用了更简化的概念模型,可以降低公钥大小至几十MB量级;

目前,已知的同态加密技术往往需要较高的计算时间或存储成本,相比传统加密算法的性能和强度还有差距,但该领域被关注度一直很高,笔者相信,在不远的将来会出现接近实用的方案。

与同态加密相关的一个问题是函数加密。

同态加密保护的是数据本身,而函数加密保护的是处理函数本身,即让第三方看不到处理过程的前提下,对数据进行处理。

该问题已被证明不存在对多个通用函数的任意多密钥的方案,目前仅能做到对某个特定函数的一个密钥的方案。

密码学领域涉及的问题还有许多,这里列出一些还在发展和探讨中的相关技术。

零知识证明(zero knowledge proof)是这样的一个过程,证明者在不向验证者提供任何额外信息的前提下,使验证者相信某个论断是正确的。

例如,Alice向Bob证明自己知道某个数字,在证明过程中Bob可以按照某个顺序提出问题(比如数字加上某些随机数后的变换)由Alice回答,并通过回答确信Alice较大概率确实知道某数字。证明过程中,Bob除了知道Alice确实知道该数字外,自己无法获知或推理出任何额外信息(包括该数字本身),也无法用Alice的证明去向别人证明(Alice如果提前猜测出Bob问题的顺序,存在作假的可能性)。

  • 完整性(Completeness):真实的证明可以让验证者成功验证;

  • 可靠性(Soundness):虚假的证明无法让验证者保证通过验证,但允许存在小概率例外;

  • 零知识(Zero-Knowledge):如果得到证明,无法从证明过程中获知除了所证明信息之外的任何信息。

量子密码学(quantum cryptography)随着量子计算和量子通信的研究而受到越来越多的关注,将会对已有的密码学安全机制产生较大的影响。

量子计算的概念最早是物理学家费曼于1981年提出,基本原理是利用量子比特可以同时处于多个相干叠加态,理论上可以同时用少量量子比特来表达大量的信息,并同时进行处理,大大提高计算速度。如1994年提出的基于量子计算的Shor算法,理论上可以实现远超经典计算速度的大数因子分解。这意味着大量加密算法包括RSA、DES、椭圆曲线算法等都将很容易被破解。但量子计算目前离实际可用的通用计算机还有一定距离。

量子通信则提供对密钥进行安全分发的机制,有望实现无条件安全的“一次性密码”。量子通信基于量子纠缠效应,两个发生纠缠的量子可以进行远距离的实时状态同步。一旦信道被窃听,则通信双方会获知该情况,丢弃此次传输的泄露信息。该性质十分适合进行大量的密钥分发,如1984年提出的BB84协议,结合量子通道和公开信道,可以实现安全的密钥分发。

提示:一次性密码:最早由香农提出,实现理论上绝对安全的对称加密。其特点为密钥真随机且只使用一次;密钥长度跟明文一致,加密过程为两者进行二进制异或操作。

密码学与安全问题,一直是学术界和工业界都十分关心的重要话题,相关的技术也一直在不断发展和完善。然而,即便存在理论上完美的技术,也不存在完美的系统。无数例子证实,看起来设计十分完善的系统最后被攻破,并非是因为设计上出现了深层次的漏洞,而问题往往出在事后看来十分浅显的某些方面。

例如,系统管理员将登录密码贴到电脑前;财务人员在电话里泄露用户的个人敏感信息;公司职员随意运行来自不明邮件的附件;不明人员借推销或调查问卷的名义进入办公场所窃取信息……

著名计算机黑客和安全顾问Kevin David Mitnick曾在15岁时成功入侵北美空中防务指挥系统,其著作《The Art of Deception》大量揭示了如何通过社交工程学的手段轻易获取各种安全信息的案例。

本章主要总结了密码学与安全领域中的一些核心问题和经典算法。

通过阅读本章内容,相信读者已经对现代密码学的发展状况和关键技术有了初步了解。掌握这些知识,对于帮助理解区块链系统如何实现隐私保护和安全防护都很有好处。

现代密码学安全技术在设计上大量应用了十分专业的现代数学知识,如果读者希望成为这方面的专家,则需要进一步学习并深入掌握近现代的数学科学,特别是数论、抽象代数等相关内容。可以说,密码学安全学科是没有捷径可走的。

另外,从应用的角度来看,一套完整的安全系统除了核心算法外,还包括协议、机制、系统、人员等多个方面。任何一个环节出现漏洞都将带来巨大的安全风险。因此,要实现高安全可靠的系统是十分困难的。

区块链技术中大量利用了现代密码学的已有成果,包括哈希、加解密、签名、Merkle树数据结构等。另一方面,区块链系统和诸多新的场景也对密码学和安全技术提出了很多新的需求,反过来也将促进相关学科的进一步发展。

摘自:区块链原理、设计与应用

}

  黎跃春:孔壹学院创始人兼CEO,国内区块链布道先行者,通信和信息技术培养工程区块链高级授课专家。

  从零到壹学习密码学为一个系列,一共20讲,包括初识密码学、Hash 函数、对称加密算法、数字签名、椭圆曲线加解密、公钥基础设施( PKI )、零知识证明、随机数等,为大家详尽的介绍密码学的学习过程。今天我们将为大家介绍从零到壹学习密码学第十九讲:零知识证明。话不多说,马上开启我们的密码学学习之旅。

Proof),是由S.Goldwasser、S.Micali及C.Rackoff在20世纪80年代初提出的。它指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。零知识证明实质上是一种涉及两方或更多方的协议,即两方或更多方完成一项任务所需采取的一系列步骤。证明者向验证者证明并使其相信自己知道或拥有某一消息,但证明过程不能向验证者泄漏任何关于被证明消息的信息。大量事实证明,零知识证明在密码学中非常有用。如果能够将零知识证明用于验证,将可以有效解决许多问题。

  阿里巴巴被强盗抓住,为了保命,他需要向强盗证明自己拥有打开石门的密码,同时又不能把密码告诉强盗。他想出一个解决办法,先让强盗离开自己一箭之地,距离足够远让强盗无法听到口令,足够近让阿里巴巴无法在强盗的弓箭下逃生。阿里巴巴就在这个距离下向强盗展示了石门的打开和关闭。

  这个整个过程就是零知识证明,证明者能够在不向验证者提供任何有用信息(石门的口令)的情况下,使验证者相信某个论断(阿里巴巴知道打开石门的方法)是正确的。

  zk-SNARK 它是一种非常适合区块链的零知识验证技术,可以让别人在不知道具体交易内容的情况下验证交易(或者是智能合约函数调用)的有效性。有了zk-SNARK,我们既保留了区块链互相不信任个体间的共识达成问题,又保护了交易隐私,简直就是在众目睽睽下原地隐身。

  在正式深入zk-SNARK的之前,我们不妨先看看它有哪些实际的应用。Zcash 是第一个应用zk-SNARK技术的区块链,它能够提供完全隐私化和加密化的虚拟货币转账。完美解决了老董发工资的难题。

  以太坊(Ethereum)目前也在试图把Zcash的隐私交易功能作为一个预编译合约链接到其上的其他智能合约中(由于如果不使用预编译,每个区块的gas限制将无法完成复杂的zk-SNARK运算)。这被称为ZoE (Zcash over Ethereum),不过即使做了预编译优化,他能提供的隐私验证能力非常有限。

  尚未正式发布的Hawk是一个完全采取了zk-SNARK的区块链智能合约部署系统。

  当然zk-SNARK所能提供的隐私化交易未来还会有很多其他领域的应用。一个例子是通过区块链进行的拍卖,每个参与竞标的人无需暴露自己的身份和标的具体内容,这将让更多类型的拍卖得以在区块链上实现。另一个例子是匿名选举,投票人无需暴露自己身份就可以在区块链上参与投票。此外,zk-SNARK还可以使能一些“选择性公开”的场景,比如你可以在区块链上证明你在某一个城市而不暴露你的具体位置。

  zk-SNARK是一种特别适合区块链的零知识论证 算法(论证与验证并不完全一样,为了简洁,在本文中不对验证和论证作区分)。这里为什么说zk-SNARK特别适合区块链呢?因为zk-SNARK在实现零知识验证的同时还具有以下几个特点:Succinct (简洁性):验证者(verifier)只需要少量计算就可以完成验证。这对于区块链非常重要,因为区块链上为了能够快速达到共识,每一个计算步骤不能过于复杂。

  Non-interactive (非交互性):示证者(prover)和验证者(verifier)之间只需要交换极少量的信息即可完成整个验证过程。这对于区块链同样至关重要,因为区块链上节点众多,并且每个节点都需要每一笔对交易进行验证,所以验证过程必须只涉及极少量的信息交换,否则通信成本会非常巨大。

  zk-SNARK的使用场景例子

  为了理解zk-SNARK是怎么工作的,我们先考虑一个非常简单的场景:Alice想要向Bob证明她知道一组数x和y使得x+y=7,同时不让Bob知道x和y的具体数值。

  一个简单的办法是使用一种神奇的“加密函数”E(x),这种加密函数有三个重要性质:

  如果x,y不同,那么它们的加密函数值E(x)和E(y)也不相同。

  给定E(x)的值,很难反推出x的值。

  给定E(x)和E(y)的值,我们可以很容易地计算出某些关于x,y的加密函数值。比如,我们可以通过E(x)和E(y)计算出E(x+y)的值。

  在这里,我们不深入讨论这种加密函数是什么,有一定抽象代数知识的读者可以去查看原始zk-SNARK的论文[1](事实上,椭圆曲线配对也是zk-SNARK的一个重要创新)。

  有了这种加密函数,我们就可以很容易地出以下验证方案1.0:

  Bob通过收到的E(x)和E(y)计算出E(x+y)的值 (利用了加密函数的性质3),

  Bob同时计算E(7)的值,如果E(x+y)=E(7),那么验证通过,否则验证失败。

  由于加密函数的性质1,如果E(x+y)=E(7),则必然x+y=7成立,验证有效;同时由于加密函数的性质2,Bob无法从E(x),E(y)反推出x,y的具体数值。因此,Alice在不泄露x,y具体数值的情况下向Bob验证了x+y=7。

  但是上述方案没有完全实现“零知识”,因为E(x)和E(y)还是泄露了一些关于x和y的信息。比如我们限定x,y为正整数,则Bob可以穷举所有相加为7的数字组合,然后把这些数字组合与收到的E(x), E(y)进行对比,从而获得x,y的具体数值。解决这个问题的方法是Alice产生一个秘密的随机数t,然后发送x+t和y-t的加密函数值E(x+t), E(y-t)给Bob。由于(x+t)+(y-t)=7,所以Bob那里仍可以验证通过,同时由于“随机偏移”t的引入,Bob无论如何也猜不到x,y的真实数值。

  于是我们现在有了验证方案2.0:

  Bob同时计算E(7)的值,如果E(x+y)=E(7),那么验证通过,否则验证失败。

  以上方案实现了完全的“零知识”验证,看似我们的问题已经解决了,可真的是这样吗?

  很可惜并不是!上面这个算法的问题在于它只能验证一些非常简单的知识(不过在实际中这个验证协议已经非常有用,比如RSA加密协议)。而在实际的区块链操作中,需要验证的知识可能是非常复杂的。在很多时候,以上这种仅仅依赖加密函数的方案就不够用了。

  接下来我们考虑一个稍微复杂一点的场景:Alice需要向Bob证明她知道一个满足一定性质的秘密多项式P(x),并且不泄露具体这个多项式P(x)是什么。

  注意了,这个多项式验证问题非常重要!我稍后会提到:

  无论多复杂的验证问题都可以最终简化为一个多项式验证问题!

  无论多复杂的验证问题都可以最终简化为一个多项式验证问题!

  无论多复杂的验证问题都可以最终简化为一个多项式验证问题!

  重要的问题说三遍。

  下面我们来看如何修改之前的验证算法来解决多项式验证的问题。

  先给大家先补习一下数学知识,一个度为d的多项式P(x)可以写成以下形式:

  为什么之前利用加密函数的方案在这里不能直接套用了呢?一个原因是之前我们只需要验证一组具体的值满足一定性质(如x=1和y=6满足x+y=7),而这里的多项式中x的值可能有无穷多个取值,穷举所有的可能性会消耗大量的计算资源。一个巧妙的办法是与其验证所有可能的取值,我们让Bob随机选一个x的值(如x=s),然后Alice仅仅需要向Bob证明多项式P(x)在x=s这一点的取值P(s)满足某种性质。这个随机取样的方法之所以合理,是因为两个不同的多项式在大多数情况都是不相等的,比如两条不同的直线最多有一个相交的点。如果我们随机取一个点,两个不同的多项式取值相同的概率几乎可以忽略不计。采用这个随机取样的办法,验证工作的计算量就大大降低了,这就是zk-SNARK中

  另外和验证方案2.0一样,Alice需要引入一个“随机偏移” R(s)来使得Bob完全得不到任何关于P(s)的信息。注意P(s)+R(s)必须满足待验证的性质。我们在这里不具体介绍R(s)是如何产生的。

  加上这个随机采样的办法,我们得到了验证方案3.0:

  Bob向Alice发送一个随机点s,

  Bob验证接收到的加密函数值E(P(s)+R(s))是否满足给定的性质。

  但是验证方案3.0有一个重大缺陷。Bob直接把随机点s的取值发送给了Alice,而P(s)需要满足的性质又是公开的,这就意味着Alice即使不知道多项式P(x)是什么,她也完全可以找一个与P(s)不同但是仍然满足条件的值y,并把y的加密函数值E(y)发给Bob。这种情况Bob仍然会验证通过。怎么处理这个缺陷呢?一个简单的解决办法就是把随机点s加密发给Alice,但是这样做的坏处就是Alice无法计算P(s), E(sd)计算出E(P(s)+R(s))的数值的,同时随机点s的具体数值也没有暴露。

  于是我们得到了验证方案4.0:

  Bob验证接收到的加密函数值E(P(s)+R(s))是否满足给定的性质。

  不过仔细想想验证方案4.0也有个问题。因为Bob只在一个随机点s进行了验证,Alice完全可能是人品爆发恰好在s这一点蒙对了,而实际并不知道符合条件的多项式P(x)长啥样!那么Bob怎么验证Alice确实知道多项式P(x),而不是恰好蒙对的呢?答案仍然是随机化!

  我们可以让Bob在产生随机点s的同时再产生一个随机数k,然后向Alice同时发送关于s和k的信息。之后Bob要求Alice返回两个数,一个是P(s)的加密值E(P(s)),另一个是kP(s)的加密值E(kP(s))。注意k是一个只有Bob自己知道的秘密随机值,如果Alice可以同时告诉Bob关于P(s)和kP(s)的信息,则证明Alice不是瞎蒙的,而是确实知道P(x)这个多项式长啥样。具体原因是由于一个叫“知识系数假设”

  现在我们有了验证方案5.0 (最终方案):

  Bob验证接收到的加密函数值E(P(s)+R(s))是否满足给定的性质,并且验证收到的另一个加密函数值是不是E(kP(s)+kR(s))。

  以上基本就是zk-SNARK的完整验证流程了。不过最后还有几个重要的设计细节需要提一下(相信我,这真的是最后了)。

  第一,我们注意到Bob(验证者)需要发送给Alice(示证者)的信息是不随验证内容变化的,因此可以事先在区块链中一次性设置好,之后任何验证过程都可以复用这个设置,验证者不再需要向示证者发送任何信息。这个事先设置好的信息被称为Common Reference String(CRS, 共同参考字符串)。一个重要的考虑是随机点s和随机系数k是必须严格保密的,否则就会有伪造证明通过验证。那么在实际中,这个随机点s和随机系数k是保存的呢?在Zcash的系统里,CRS中存放的实际上只是随机点s和随机系数k的一系列加密值,而s和k的明文则由6个“被充分信任的人”私下保存,这6个人处在地球上6个不同的位置,这些机密的随机数被拆开保存在这6个人手上,只要不是这6个人都变成“坏人”,这些随机数信息就不会被完整恢复。一个有意思的故事是,这6个“被充分信任的人”在最初的时候举行了一个神圣的仪式,共同参与并见证了这个随机点s和随机系数k的产生。

  第二,以上我们只是讨论了多项式验证的问题。但是实际我们要验证的交易程序可能是非常复杂的。zk-SNARK提供了一个系统化的方法可以把任何验证程序转化成一个叫Quadratic Span Program (QSP)的多项式验证问题。

  之前说了zk-SNARK那么多的好处,那么它目前有没有什么缺陷呢?那必然是有的。

  第一个问题:虽然zk-SNARK通过随机采样的方式大大减小了验证工作的计算量,但是由于需要验证一个较为复杂的多项式性质,其和传统的验证过程相比仍然耗费了更多了计算资源。这仍是目前很多区块链无法承受的计算需求。因此,如何针对zk-SNARK进行计算优化仍是一个开放问题。

  第二个问题:我们提到zk-SNARK有一个初始设置的阶段,来生成“绝对机密”的随机信息。目前这些绝密随机信息的生成和保存仍然非常原始(参见之前提到的神秘仪式),很难让人完全放心,也很难进行拓展。比如,未来每一个需要隐私保护的智能合约可能都会有自己的初始随机信息要生成,如何确保这些初始随机信息不会被坏人泄露?同时业界和学术界也在研究如何在zk-SNARK中避免这个让人诟病的初始设置步骤

  zk-SNARK 算法的主要作者们写了一个 libsnark 库,提供了一些基础组件,zcash 用的零知识证明库就是 libsnark 的一个 fork 版本。我本人刚开始看到这个库时也是一筹莫展,即使在我了解了这么多关于 zk-SNARK 背后的技术知识后。而后,寻得一个作者编写的简单例子,才基本入了门。

}

我要回帖

更多关于 想学点有关电脑的知识 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信