声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。
边肖:记得要集中注意力。
作者:罗纳德曼纳克
翻译和校对3360增密阿健。
来源:以太坊爱好者
许多技术博客发表了关于零知识证明(ZKP)的文章。最近我自己写了一篇文章,对比了新将军zk-SNARK。我注意到很少有文章用简单的语言解释ZKP用例。实际上,ZKP不仅可以用于保护隐私,还可以因为其丰富多样的功能而改变区块链的运作方式。
00-1010由于区块链的数据规模会随着新区块的出现而不断增长,其规模可能会变得非常大。这是设计使然,我们已经开始接受这个现实。然而,最近推出的Coda测试网络有些不同。首先,Coda的区块链数据规模是恒定的,不会增长。其次,它的整个区块链大小只有22kb!这意味着,即使你使用80年代的Commodore 64或ZX频谱来运行节点,也毫不费力。然而,与传统的区块链相比,Coda的安全性更差。越来越多的项目正朝着这个方向发展:和平号和斯特林号(我是斯特林号的一员)即将发射类似于Coda但功能更丰富的“简洁区块链”。那么他们具体是怎么做的呢?任何运行过区块链节点的人都经历过同步一个节点需要几个小时甚至几天的痛苦。区块链的数据量往往非常巨大,大多数家庭电脑的硬盘和带宽都无法满足运行节点的要求。这就导致了集权。即使有以太坊这样的流行区块链,整个网络也只有1万个左右的节点。这些节点大部分托管在AWS上,属于少数几个实体。区块链并不像很多人想的那样去中心化。
为什么同步区块链需要这么长时间?原因有二。第一个原因很明显:下载数百GB或更多的数据需要一段时间。其次,节点下载数据后,需要对整个区块链进行验证,因为恶意节点可能会给你发送错误的数据。
为了验证区块链,必须从创建块中重放它:执行第一个事务,并确认计算的状态与下载的状态一致。然后验证下一个交易,直到您验证了整个区块链中的所有交易。这是费时费力的;而在你之前,成千上万的节点已经进行了同样的计算。
但这是必须的,因为在传统的计算模式下,要知道计算是否正确,唯一的方法就是再做一遍。这对于小型计算很好,但是对于相对大型的计算就不太友好了,比如重放区块链。
00-1010事实证明,有一种技术可以降低验证计算结果的成本而无需重新计算:零知识证明(ZKP),而zk-SNARK可能是所有零知识证明技术中最著名的。那么如何组合呢?我们必须用zk-SNARK重写区块链的回放功能。Zk-SNARK会输出两种结果:初始输出(就像初始重放函数会输出的结果一样)和证明计算结果正确的小数学证明。这个证书可以小到200字节(没错,你没看错,小于1KB)。
不需要所有(甚至多个)计算机都执行重放功能。只有一台计算机需要创建证书,其他所有计算机都可以根据自己的需要验证结果。验证只需要几毫秒,无论初始计算需要多长时间(甚至几小时、几天或几年,都无所谓)。这些证书可以贴在网上,通过u盘传播,甚至可以印在t恤上。
如果恶意节点改变了平衡,它的证明将与结果不匹配,并且所有验证者将拒绝该状态。如果恶意节点操纵zk-SNARK代码,结果也会被其他节点拒绝。(还有第三个参数——,系统中开放的共享字符串,用zk-SNARK代码绑定证明。一旦代码被篡改,其证明将与共享字符串不匹配,因此验证者将拒绝计算结果。)
我们摆脱了对重复昂贵计算的依赖,同时也不再需要下载整个区块链(因为我们已经有了证明区块链存在和有效性的数学证明)。你只需要下载当前状态(例如最新的块)加上一个小证明,证明当前状态是一个有效区块链的一部分,然后花几个毫秒验证计算结果。
00-1010验证证书的过程非常快。创建证书的过程是怎样的?事实证明,创建证明所需的时间是不固定的,与传统计算相比,该过程在计算和内存方面的效率要低得多。事实上,虽然使用zk-SNARK的播放功能听起来很美,但实际上并不是一个优秀的解决方案。占用内存巨大,甚至比原来的非zk-SNARK播放功能还慢。但是现在有了另一个优雅的解决方案。通过一些技巧,我们可以使用递归zk-SNARK。通过递归,我们不再需要从头验证区块链,而是可以基于先前的状态构建新的状态。这样快多了。请注意,递归的zk-SNARK不如非递归的zk-SNARK高效,但是最近zk-SNARK的构造有了很大的进步。
递归zk-SNARK程序使用上一个状态、这个状态的证明和新事务作为输入。它验证最后的状态(使用提供的证据)并检查新状态下的事务是否有效。如果有效,它将输出新的状态及其证明。
一旦新的状态和证书被分发给网络,所有节点可以直接丢弃旧的状态,而不用担心任何负面后果。新节点只需要下载最新状态及其证明。这就是为什么Coda、Mir、Starlin可以实现数据规模不变的区块链。
在我们最后的例子中,只有一个节点将创建一个新的块和证明。显然,不是所有的块都必须由同一个节点生成。比如可以从众多节点中随机选择一个节点创建一个块(如果采用可验证的随机函数,节点甚至可以内部选择节点进行阻塞,不能作恶)。我们甚至可以做得更好。我们可以把区块生产的逻辑分成几个zk-SNARK。
最终结果是,区块链生产者不需要拯救整个区块链,而只需要拯救最后一个州。这个解决方案可以小多少?传统的Coda节点只需要22KB的空间来存储证据、当前状态和到平衡的Merkel路径。使用22KB的存储空间,该节点可以验证整个区块链,查询余额,并创建事务。但是为了产生一个块,节点需要做更多的事情:它需要前一个状态的完全平衡的默克尔树。默克尔的树的大小取决于钱包的数量。即使Coda拥有和以太坊一样多的钱包,一个Coda的区块制作商仍然只需要1GB的存储空间。最小的以太坊节点需要230GB(截至2019年12月)。这是一个巨大的差距。
通过这种方式,网络中将有更多的活跃节点,从而提高去中心化程度,并为与区块链互动的程序开辟许多新的可能性,而无需求助于Infura或Metamask等解决方案。考虑到99%的用户在安装Metamask之前就已经放弃了,这应该会产生巨大的影响。
感谢Daniel Lubarov (Mir)、Shane Vitarana、Stan van de Burgt、Taariq Lewis和Dmitriy Berenzon校对本文。
(完)