免责声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。
小编:记得关注
原文链接:medium
作者: 罗纳德曼纳克
翻译校对: 曾米阿建
资料来源:以太坊爱好者
有很多技术博客都写过关于零知识证明(ZKP) 的文章。最近,我自己写了一篇文章比较新的通用zk-SNARKs。我注意到很少有文章用通俗易懂的语言解释ZKP 用例。事实上,ZKP 不仅仅可以用来保护隐私,因为其丰富多样的功能,ZKP 甚至可以改变区块链的运行方式。
第一:紧凑型区块链,从千兆字节到千字节因为区块链的数据量会随着新区块的产生而不断增长,它的规模会变得非常大。这是设计使然,我们已经接受了这个现实。然而,最近推出的Coda 测试网有点不同。首先,Coda 的区块链数据规模是恒定的,不会增长。其次,它的整个区块链只有22kb大小!这意味着即使你使用1980 年代的Commodore 64 或ZX Spectrum 来运行节点,也毫不费力。然而,与传统的区块链相比,Coda 的安全性堪称一流。也有越来越多的项目朝着这个方向发展:Mir 和Starling(我是Starling 的一部分)将在不久的将来推出类似于Coda 但功能更丰富的“干净区块链”。那么他们究竟是怎么做到的呢?任何运行过区块链节点的人都经历过同步一个节点数小时甚至数天的痛苦。区块链中的数据量往往非常庞大,以至于大多数家庭的电脑硬盘和带宽都无法满足运行节点的要求。这导致集中化。即使像以太坊这样流行的区块链,其整个网络也只有大约10,000 个节点。这些节点中的大部分仍然托管在AWS 上,属于少数实体。区块链并不像许多人想象的那样去中心化。
为什么同步区块链需要这么长时间?有两个原因。第一个原因很明显:下载数百GB 或更多的数据可能需要一段时间。其次,节点下载完数据后,需要对整个区块链进行校验,因为可能会有恶意节点给你发送错误的数据。
要验证区块链,必须从创世块开始重放:执行第一笔交易,确认计算状态与下载状态一致。然后验证下一笔交易,直到你验证了整个区块链中的所有交易。这样做很费时间;并且有数千个节点在您之前执行相同的计算。
但这是必要的,因为在传统的计算模型中,只有重新计算才能知道计算是否正确。这对于小的计算来说还好,但对于更大的计算就不那么友好了,比如重放区块链。
使用ZKP提高效率和带宽利用率事实证明,有一种技术可以在不重新计算的情况下降低验证计算结果的成本:零知识证明(ZKP),而zk-SNARK可能是所有零知识证明技术中最著名的.那么如何组合呢?我们必须用zk-SNARK 重写区块链的重放功能。 zk-SNARK 将输出两件事:初始输出(就像原始重放函数的输出一样)和一个小的数学证明,证明计算是正确的。这个证明可以小到200 字节(是的,你没看错,不到1KB)。
没有必要让所有(甚至多台)计算机都执行重放功能。只有一台计算机需要创建证明,所有其他计算机都可以根据需要验证结果。验证只需要几毫秒,无论初始计算花费了多长时间(甚至几小时、几天或几年,都没有关系)。这些证明可以在线发布、通过U 盘传播,甚至印在T 恤上。
如果恶意节点改变了余额,其证明将与结果不匹配,所有验证者将拒绝该状态。如果恶意节点篡改zk-SNARK 代码,其结果也会被其他节点拒绝。 (系统中还有第三个参数——,公共共享字符串,将证明绑定到zk-SNARK代码,一旦代码被篡改,其证明将与共享字符串不匹配,验证者拒绝计算.)
我们已经摆脱了重复执行昂贵计算的需要,我们不再需要下载整个区块链(因为我们已经有了区块链存在且有效的数学证明)。您只需下载当前状态(例如最新的区块)加上当前状态是有效区块链的一部分的小证明,然后花几毫秒来验证计算。
通过递归组合验证证明的过程非常快,但是创建证明的过程呢?事实证明,创建证明所需的时间不是恒定的,与传统计算相比,该过程的计算量和内存效率都非常低。事实上,虽然使用zk-SNARK 的replay 功能听起来很漂亮,但在实践中并不是一个优秀的解决方案。它消耗大量内存,甚至比原来的非zk-SNARK 重放功能还要慢。但现在有另一个优雅的解决方案。通过一些技巧,我们可以使用递归zk-SNARKs。通过递归,我们不再需要从头开始验证区块链,而是可以在之前的状态之上构建新的状态。这要快得多。请注意,递归zk-SNARK 不如非递归zk-SNARK 高效,但最近的zk-SN
ARK 构建已取得了巨大的进步。
递归的 zk-SNARK 程序使用上一个状态、该状态的证明以及新的交易作为输入。它(使用提供的证明)验证上一个状态,并检查新状态中的交易是否有效。如果有效,它将输出新状态及其证明。
一旦新状态和证明分发到了网络中,所有节点都可以直接抛弃旧的状态,而不用担心产生任何负面后果。新节点只需要下载最新的状态及其证明就可以了。这就为什么 Coda、Mir、和 Starlin 能实现数据规模恒定的区块链。
在我们上一个例子中,只有一个节点会创建新的区块及证明。很显然,并非所有区块都必然是同一个节点产生的。例如,可以从众多节点中随机选择一个节点来创建区块(如果采用了可验证的随机函数(Verifiable Random Function),节点们甚至可以在内部选出节点来出块,且无法作恶)。我们甚至可以做的更好。我们可以将区块生产的逻辑划分为多个 zk-SNARK。
最终的结果就是区块生产者不需要再保存整条区块链,而只需要保存上一个状态。这种解决方案可以小多少呢?一个常规的 Coda 节点只需要占用 22KB 的空间用于存储证明、当前状态和指向一个余额的默克尔路径。通过 22KB 的存储,节点可以验证整条区块链、查询余额、以及创建交易。但要想生产区块,节点需要做更多的操作:它需要上一个状态的全余额默克尔树。默克尔树的大小取决于钱包的数量。即便 Coda 拥有的钱包数量和以太坊一样多,一个 Coda 的区块生产者仍然只需要 1GB 大小的存储空间。而最小的以太坊全节点则需要 230GB(截止 2019 年 12 月)。这是一个巨大的差距。
通过这种方式,网络中会有更多活跃的节点,进而增加其去中心化程度,并为与区块链交互的程序开辟了许多新的可能性,而不用再借助诸如 Infura 或 Metamask 等解决方案。考虑到 99% 的用户在安装 Metamask 之前就已经放弃了,这应该会带来巨大的影响。
感谢 Daniel Lubarov (Mir)、Shane Vitarana、Stan van de Burgt、Taariq Lewis、和 Dmitriy Berenzon 对本文的校对。
(完)