陀螺科普 | 零知识证明如何改变区块链

IP归属:广东

关于零知识证明(ZKP)的技术博客文章很多。我最近写了一篇自己的文章,比较了新的通用zk-SNARKs。我注意到在ZKP用例上缺少非技术性的帖子。ZKP不仅可以用于隐私,还可以用于其他用途。ZKP非常灵活,因此可能会重新定义区块链的工作方式。

第1部分:简洁的区块链,从千兆字节到千字节

区块链可能很大,并且每个区块的大小都在不断增长。那是设计使然。我们已经接受了这是事实。但是,Coda最近的测试网却有所不同。首先,Coda的区块链是固定大小的。它没有增长。其次,它只有22 KB(!)的大小。它很容易安装在1980年代的Commodore 64或ZX Spectrum中。然而,Coda的安全性甚至可以说比传统的区块链还要安全。接下来还有更多项目:Mir和Starling(我是Starling的一部分)将很快推出类似但功能更广泛的“简洁区块链”。它是如何工作的?

曾经旋转过一个区块链节点的任何人都知道痛苦:同步节点需要数小时甚至数天。区块链通常是如此之大,以至于磁盘空间和带宽需求超出了大多数人的家庭需求。这导致集中化。甚至像以太坊这样的流行区块链也仅包含约10,000个节点。其中大多数托管在AWS上,并且节点仅由少数几个实体拥有。区块链的分散性不如许多人想象的那样。

为什么同步区块链需要这么长时间?有两个原因。第一个原因很明显:下载数百GB或更多的数据需要一段时间。其次,区块链需要在下载后进行验证,因为恶意节点可能向您发送了不正确的数据。

要验证区块链,必须从创世块中重播它:执行第一个交易并确认计算出的状态等于下载状态。移至下一个交易,直到您检查了区块链中的每个交易。这既浪费时间又浪费时间。在您进行之前,成千上万的节点已经进行了完全相同的计算。

之所以需要这样做,是因为在传统计算中,知道计算是否已正确计算的唯一方法是重做计算。对于小型计算而言这很好,但对于诸如重播区块链之类的慢速计算而言却不是很好。

ZKP可提高效率和带宽

事实证明,有一种方法可以廉价地验证计算结果而无需重做计算:零知识证明(ZKP),其中的zk-SNARK可能是最着名的。

如何运作?我们必须将区块链重播功能重写为zk-SNARK。zk-SNARK将输出两件事:原始输出(就像原始重放功能一样)和一个小的数学证明,证明结果计算正确。证明可以小到200个字节(是的,小于一千字节)。

不需要所有(甚至多台)计算机都运行重放功能。一台计算机可以创建证明,无数台计算机可以在他们认为合适的任何时间进行验证。无论原始计算花费了多长时间(即使是数小时,数天或数年,这都没关系),验证只需要几毫秒。该证明可以通过USB记忆棒在线分发,甚至可以印在T恤上。

如果恶意节点更改余额,则证明将与结果不匹配,并且任何验证者都将拒绝该状态。如果恶意节点更改了zk-SNARK代码,结果也将被拒绝。(第三个参数是将证明与zk-SNARK代码也绑定在一起的公共共享字符串。如果更改了代码,则证明和共享字符串将不匹配,并且验证程序将拒绝结果。)

我们消除了重做昂贵计算的需要,并且不再需要下载区块链(因为我们已经有了数学证明,该区块链存在并且有效)。您只需要当前状态(例如最后一个块),再加上一个微小的证明即可证明当前状态是有效区块链的一部分,并花费几毫秒的时间来验证结果。

递归组合

验证证明很快,但是如何创建证明呢?事实证明,它不是固定的时间,与传统计算相比,它在计算和内存方面的效率要低得多。实际上,尽管重播功能的zk-SNARK版本听起来不错,但实际上并不是一个很好的解决方案。它在内存方面将是巨大的,甚至比原始的非zk-SNARK重播功能还要慢。

但是,还有另一个优雅的解决方案。通过一些技巧,事实证明可以使用递归zk-SNARK。通过递归,我们不必从头开始验证区块链,但是我们可以在先前状态的基础上进行构建。那要快得多。请注意,递归zk-SNARK的效率不如非递归zk-SNARK,但是最近的zk-SNARK构造取得了长足的进步。

递归zk-SNARK程序将先前状态,属于先前状态的证明和新交易用作输入。它使用提供的证明来验证先前状态,并检查处于新状态的交易是否有效。如果是这样,它将输出新状态和证明。

将新状态和证明分发到网络后,所有节点都可以简单地丢弃先前的状态,而不会产生任何负面影响。新节点仅需要下载最新状态和证明。这就是Coda,Mir和Starling能够拥有一个微小的固定大小的区块链的方式。

在我们的最后一个示例中,只有一个节点将创建一个新块和证明。显然,不必由同一个单个节点来生成每个块。例如,可以从许多节点中随机选择一个节点(具有“可验证的随机功能”的节点甚至可以随机选择自己而不作弊)。我们可以做得更好。我们可以将块生成逻辑划分为多个zk-SNARK。

最终结果是区块生产者不需要完整的区块链,而只需要先前的状态。这样的解决方案会缩小多少?常规的Coda节点仅需要22 KB即可存储证明,当前状态以及到一个天平的Merkle路径。节点具有22 KB的空间,可以验证完整的区块链,查询余额并创建交易。但是要生成块,节点需要更多:它需要先前状态的完整余额Merkle树。默克尔树的大小取决于钱包的数量。如果Coda拥有与以太坊一样多的钱包,那么Coda区块生产者仍将只需要约1 GB。截至2019年12月,以太坊上最小的完整节点为230 GB。巨大的区别。

这样,网络具有更多的活动节点,增加了分散性,并为程序提供了许多与区块链交互的新可能性,而无需像Infura或Metamask这样的解决方案。考虑到99%的新用户在安装Metamask之前就退出了,这可能会产生巨大的影响。

感谢您的校对:Daniel Lubarov(先生),Shane Vitarana,Stan van de Burgt,Taariq Lewis和Dmitriy Berenzon。

本文来源:陀螺科技 文章作者:区块新视野
收藏
举报
区块新视野
累计发布内容169篇 累计总热度10万+

陀螺科技现已开放专栏入驻,详情请见入驻指南: https://www.tuoluo.cn/article/detail-27547.html

区块新视野专栏: https://www.tuoluo.cn/columns/author366714/

本文网址: https://www.tuoluo.cn/article/detail-5594341.html

免责声明:
1、本文版权归原作者所有,仅代表作者本人观点,不代表陀螺科技观点或立场。
2、如发现文章、图片等侵权行为,侵权责任将由作者本人承担。

相关文章