@StopAndDecrypt:
有没有比特币爱好者来解释下 zkrollup?
我不指望以太坊的开发者会诚实地讲清楚其中的权衡,也不指望以太坊的粉丝真的明白它是怎么工作的。
(这是个严肃的问题哦)
@SomsenRuben:
用比特币的术语来说,就是一个大区块方案 —— 每个人都要下载额外的数据。在交易进入区块之前,一个中间人先使用一个 SNARK 证据来 聚合/压缩 所有的见证数据(witness,比如签名)(当前的 SNARK 需要使用受信任的启动设置),并发布新状态的 UTXO 集合承诺(也是用上述的 SNARK 证据来证明的)。
每个人都验证这个 SNARK,证明区块的有效性和 UTXO 集合承诺的正确性。没人必须生成 UTXO 集合,因为 SNARK 已经证明过了,只要你想,你就能生成出来。如果那个中间人失踪了,你只需使用 UTXO 集合承诺证明自己的状态即可动用资金。
简而言之,好处是你可以节约见证数据和计算量(都外包给了 SNARK 证据)。zkrollup 只是应用了我们一直知道的 SNARK 能做的事,可能差别只在于它用在了单独的一个 UTXO 集合上。
亦见我写的 SNARK 文章:SNARK 与区块链的未来。(译者注:下文有附。非常清楚地说明了 SNARK 能做的事,以及为什么 zkrollup 要把不含见证数据的交易数据发布出来。)
第二则(很长,请耐心):
(略去两人对二层网络兴起会不会降低对一层区块空间需求的讨论)
@AdrianoFeria:
侧链不能提供与 L1 同样的安全性。Statechain 不是完全免信任的。我还没研究 Chaumian banks。
@bergealex4:
(侧链)当然不能,它从来也没说自己能。
你没法跨层复制 L1 的安全性。
@AdrianoFeria:
“你没法跨层复制 L1 的安全性。”
这就是 ZK-Rollup 能做到的事。
@bergealex4:
好吧,即使我们接受这个前提,光凭这一点也不能让 ETH 优于 BTC。
@AdrianoFeria:
就凭这一点,以太坊就有了一种扩容机制,可以保留 L1 的安全性,同时无需付出 开启/关闭 通道的开销,也不必承担闪电网络内在的数据可得性风险。
我们没法靠推特来讨论哪个系统在整体上更优。
无论如何,zk-rollup 是一个大进步,并且提供了比支付通道更大的好处。
@SomsenRuben:
ZK-rollup 和支付通道是不同维度的(orthogonal)。zk-rollup 就像扩大的区块(extention block) —— 非见证数据放到链上,并由每一个人(通过 SNARK,便宜地)验证。我可以理解为什么你们管它叫 “L2”,但从技术上来说,它其实不是。它只是做了非交互的见证数据聚合(NIWA)。看我的文章 《SNARK 与区块链的未来》。
@AdrianoFeria:
它是个 L2,因为 SNARK 的计算是委托给另一个网络的。L1 只用来存储证明,结果是它提高了 L1 的吞吐量大约 100 倍。据我了解,它就相当于无损压缩。
@SomsenRuben:
“L2” 只是个标签。关键是我们同意这个过程里面 SNARK 做了什么 —— 非交互的见证数据聚合,这个也可以用在主链上(就是完全用在 L1 上,由矿工来做 NIWA),或者用在链中链上(就像 zk-rollup 一样,但它就是 “扩大的区块”)。
在比特币网络中,见证数据只占区块的 50%(跟以太坊不同),所以你最多只能获得 2 倍的效率提升(从区块空间的角度来看),而且这是假设了完美的 SNARK 技术;这个扩容效果很一般。即使运用了它,支付通道仍显然是有好处的。
@AdrianoFeria:
在 rollup 基础上再运行支付通道就不可能吗?
@SomsenRuben:
当然可以,这就是为什么我说他们不是同一个维度的。
(略)
@AdrianoFeria:
是不是可以断言,它(zk-rollup)提高了 L1 的吞吐量,代价是增加了额外的计算量(在以太坊的情形下,由于当前的规范要求,验证者没法这么做)?而且,即使证据的提供者崩溃了,资金也仍然可以取回。
@SomsenRuben:
我那篇文章提出的 NIWA 概念解释了这种直觉。任何人都可以收集所有的见证数据(包括签名在内、证明交易合法性的数据)并 压缩/聚合 成一个 SNARK 证据。只需某人付出多一点,结果有益所有人。
资金总是可以取回的,证据的提供者也总是可以替换的。
@AdrianoFeria:
我理解这些,但理想情况下,SNARK 的计算应该作为一项服务,由一个去中心化的网络来提供。这就是以太坊生态里面正在发生的事,而且我看不出为什么类似的东西对比特币来说就不可取。
@SomsenRuben:
它总有可取之处,但你过高地估计了它的好处(扩容效果最多只有 2 倍),也低估了它的代价(其数学原理未经考验、不使用受信任的启动设置就很低效,以及矿工的中心化)。
我确实相信有一天 SNARK 会成熟,会变得很有意义,但现在还没到时候。
@AdrianoFeria:
普遍共识是,zkrollup 在以太坊上的扩容效果是 100 倍(这个信息在多个信息源中是一致的)。
为什么它对比特币就没有这样的效果呢?
@SomsenRuben:
我能想到的两个原因:
相比比特币,以太坊中的 witness 数据大得多,验证起来也更昂贵 —— 所以 SNARK 能更好地缓解以太坊的低效率。
地址重用进一步减少了非见证数据 —— 对比特币来说,这种隐私上的牺牲也是不太可能被接受的。
我的主张是很容易推理的:
SNARK 只能减少见证数据
比特币的见证数据大约占区块的 50%
只要你理解这些,你就不需要 “相信我是个专家”,但 100 倍的说法,实在是很难推理出来。
@AdrianoFeria:
我没有在任何地方看到有人挑战这个 100 倍的说法。我假设 zkrollup 的技术设计可能稍微不同于你用比特币来举的例子,以及/或者 跟 UTXO 或比特币脚本的限制有关。
@SomsenRuben:
我不会那么快就开始假设。“别信任,自己验证”。
总的来说,我也建议你不要为某种主张辩护,除非你有非常强的信心。谦虚一些,http://www.paulgraham.com/identity.html
@AdrianoFeria:
所以我也欢迎对这个说法的技术上的挑战呀。基于一个事实:它已经被许多著名的开发者引用,也广为流传,也没有被挑战,偏向这个陈述是合理的。Rollup 已经快集成好了,证据就在眼前。
你需要务实地遵守这个 “别信任,自己验证” 的信条。相信某些东西,而不是自己验证每一件事,是有理由的。比如:
相信 SHA-256 运作良好
相信公钥密码学
为客户端创建二进制未见得编译器是有效的
@SomsenRuben:
我只不过给了一种你(应该)可以验证的,比特币无法靠 SNARK 实现两倍以上扩容,的证明。
从这个角度看,说以太坊可以实现 100 倍扩容的主张至少可以开始怀疑。
如果这还不叫 “验证”,那我也不知道什么是。
@AdrianoFeria:
我一直没法完全消化这一点,但这篇文章看起来与你用比特币来描述的情形完全不同。你有什么评论吗?https://medium.com/interdax/ethereum-l2-optimistic-and-zk-rollups-dffa58870c93
@SomsenRuben:
文章里列举了许多扩容方案,但就我所知,除了 zk-rollup,其它方案都已经被以太坊社区抛弃了。
但相比之下,我更了解比特币。如果你对我的文章有什么疑问,我很乐于帮你解答。这也会间接帮你了解以太坊。
@AdrianoFeria:
Vitalik 刚刚发布了这篇文章,我还没来得及看,但它似乎讲解了许多技术设计上的细节,以及各种类型的交易能压缩多少数据的细节。《Rollup 不完全指南》
@SomsenRuben:
好文章。所以我的两个理由都是对的,但现在我更理解这个 100 倍是怎么来的了。在以太坊中,空间和计算量都要消耗 gas,但前者的 gas 成本更低。因为 SNARK 将计算量降到了接近 0,所以所有的 gas 都可以用来发布数据。缺点是什么?区块变得更大。
@AdrianoFeria:
区块是变得更大了,但这是我知道的对存储空间最有效率的用法。
另外,这篇文章也证明了,一笔普通的交易可因此节约 10 倍空间。所以,这说明 rollup 比你用比特币来描述的情形有 5 倍的效率优势。这可不小了。
@SomsenRuben:
你忘了第二个代价,地址重用,这是个很严重的隐私降级。你也可以为比特币引入这样的反向升级来节约区块空间,以前也有人提议过,但大家以很好的理由拒绝了。
@AdrianoFeria:
我看不出地址重用怎么就是专属于 rollup 的问题,而且这个问题也可以通过专门设计的提高隐私性的智能合约来缓解。而且,钱包就不能每次收银都使用一个新地址、模拟 UTXO 的隐私性吗?
@SomsenRuben:
关键在于地址重用就是他们缩小交易体积的办法呀。如果你为每一笔交易都使用一个新地址(以及找零地址),那 zk-rollup 的交易体积会大得多。
(这场讨论中还有其它旁生的讨论,在此不附)
(译者注:不知道读者还记不记得 zk-rollup 的扩容效果是怎么论证出来的。简单来说,它是假设一笔普通交易在主链上发生要消耗 X 单位 gas,而在 zk-rollup 上发生只需消耗 Y 单位 gas,所以扩容效果是 X/Y。换言之,所有的论证都基于不同操作在以太坊上的 gas 定价,但是,gas 并不是一种真实的资源,它只是一种虚拟的单位并假设了不同的资源的代价可以化约到一个指标。假如你现在把 calldata 的 gas 定价下调一倍,zk-rollup 的扩容效果就可以提高一倍(EIP-4488 和 4490正有这样的意思)。这不是有点儿戏吗?相反,Somsen 对 SNARK 扩容效果的论证更接近于技术本来的面目,它就是节约见证数据(以及理想情况下,节约验证计算量)而已。
另外,zk-rollup 也确实有地址重用的问题(见这篇文章)。Adriano 所谓的模拟 UTXO,每次都使用一个新地址的办法,不是不行,但在以太坊的世界里不是一个良好实践,因为所有的历史地址都会留在状态中,变成节点的负担,这就是所谓的状态爆炸问题。
下面,是 Somsen 的文章)
SNARK 与区块链的未来
作者:Ruben Somsen
来源:https://medium.com/@RubenSomsen/snarks-and-the-future-of-blockchains-55b82012452b
SNARK(succinct non-interactive argument of knowledge,简洁的非交互式知识证明)常被认为是 “解决” 扩容问题的灵丹妙药。虽然 SNARK 可以提供难以想象的好处,但我们也要知道 —— SNARK 无法解决区块链当前面临的带宽约束问题。
本文希望能通过(相对)简要地介绍 SNRAK 能为区块链做什么和不能做什么,来揭开 SNARK 的神秘面纱。我们会先谈谈,为什么它与区块链有关的功能可以被简洁地归纳为 “非交互式见证数据压缩(NIWA)”。只要你知道比特币是怎么运行的,你就能理解这篇文章。
应当指出的是,SNARK 在很大程度上仍然处于活跃的研究阶段。许多 SNARK 的变种,要么效率不足以至于无法证明复杂的语句(statement),要么证明的体积非常大,大到不切实际,要么需要一个受信任的启动设置(trused setup)。也就是说,虽然这几年我们看到了许多进展,预计未来数十年我们还将看到更多。本文的写作对这些进展有预期,即使它们今天看来可能不实用。
什么是 SNARK ?
SNARK 是一种技术,让你可以在给定一个规则集和一个起始状态时,高效地验证一个结果。导致这个结果的输入是不公开的(“零知识性”)。听起来一头雾水?我们拿象棋举一个简单的例子的好了。
象棋案例
- 规则:象棋规则
- 起始状态:棋盘的起始局面 A
- 结果:棋盘的新局面 B
证明棋局从局面 A 到局面 B 是有效转换的传统方法是公开每一个步骤并检查每一步是不是都有效。SNARK 也同样能用来检查状态转换的有效性,但效果更好:
- 步骤不必公开(隐私性、节约数据)
- 验证在计算上更高效
但有一个问题 —— 创建 SNARK 的计算成本很高。不过,在一个许多人都想验证同一个结果的系统(比如区块链)中,使用这种技术可能仍是值得的。只需要一个人花力气来创建 SNARK,就能提高所有人的验证效率。
区块链案例
- 规则:全节点软件
- 起始状态:时间点 A 的区块头和 UXTO 集合哈希值
- 结果:时间点 B 的区块头和 UTXO 集合
类似于我们上面提到的象棋,验证状态转换有效性的常规方法是:从时间点 A 的 UTXO 集合(所有未花费的交易)开始,接收截至 B 点所有的区块并更新 UTXO 集合。有了 SNARK,那就不需要这些数据来证明有效性了。实际上,如果时间点 A 被设为创世区块(空的 UTXO 集合),而时间点 B 被设成现在,那么无需接收任何历史数据就能验证整条链。
重要的是,你需要 B 点的整个 UTXO 集合,而关于 A 点你只需要知道 UTXO 集合的哈希值。虽然这个数据不是证明有效性严格必需的,但我们也关心 可得性。如果你总是只能拿到 UTXO 集合的哈希值,那即使你知道一个有效的状态存在,你也不能知道那个状态究竟是什么。也就是说你没法花费任何资金,因为你没有数据来证明某个 UTXO 属于当前的集合。如果以象棋为类比,那就是你知道了一个新局面的哈希值,但你并不知道那个局面到底是怎么样的,所以也没法继续玩这个游戏。
记住,无论是谁来创建 SNARK(假设是矿工)都要具备这个数据(结果 UTXO 集合)(因为这是创建 SNARK 必需的),但他们可能会选择扣住数据,不发给你。
SNARK 区块链
为了保证每个人都会花费自己的钱,更新 UTXO 集合所需的所有数据都必须与每个区块一起传播。你还是要知道哪些 UTXO 被花费了(即输入)、哪些 UTXO 新产生了(输出)。这就是所谓的 “非见证数据”。
状态转换的有效性可以靠一个 SNARK 来验证,因此 SNARK 可以取代所有的见证数据(脚本、签名),而且几乎不占用带宽。输入和输出之间的关联将被抹消 —— 一个区块看起来就像一笔很大的 coinjoin 交易一样。大部分数据都是非见证数据。
所以,与大众的想象相反,SNARK 无法解决轻客户端或者非联盟侧链背后的根本问题,因为你必须下载非见证数据。如果非见证数据丢失,全节点有能力拒绝一个有效的 SNARK;但如果一个轻客户端疏忽于下载非见证数据,它可能会错误地认为一个数据丢失的链是有效的。即使非见证数据的一小块被矿工扣住了,其他人也就没法在有效的 SNARK 上创建新区块 —— 最终它会变成一个许可型系统。
SNARK 消耗见证数据
用于区块链的 SNARK 最好的总结可能是,它可以启用一种功能:非交互的见证聚合(NIWA)。
我在这里使用 “见证” 一词是比较随意的。在比特币中,见证数据是放在交易中、用来证明具体的 UTXO 是否能够合法创建出来的数据。但随着时间推移,这个 UTXO(非见证数据)也会变成自身的见证数据,在它被花费的时候。假设 1 btc 从 Alice 转给了 Bob 又转给了 Carol,Bob 的交易就是从 Alice 到 Carol 的转账的见证数据。同样地,创世块以来的所有支付交易,都是当前 UTXO 集合的见证数据s。
同样要指出的是,一个 SNARK 自身就是一个见证数据。如果每一笔交易都由一个 SNARK 来验证,我们也可以将这些 SNARK 都聚合(NIWA)在一起、为区块生成单个的 SNARK。而且,因为输出在花费时会变成见证数据,我们甚至可以在交易池中取出未上链确认、但已经被花费的输出,并聚合它们。Alice 转给 Bob 再转给 Carol 会变成 Alice 转给 Carol,实现非交互的交易合并(transaction cut-through)。当带有许多链外交易分支的单个 UTXO 被强制上链时(比如闪电网络通道工厂),这种功能特别有用。
简单总结
我们已经用 NIWA 概念总结了 SNARK 为区块链提供的核心功能。任何见证数据都可以被一个 SNARK 非交互式地聚合在一起。而剩下的非见证数据就是对系统状态(UTXO 集合)的直接反映。虽然 SNARK 可以实现一些神奇的功能,比如直接下载一个 UTXO 集合和一个 SNARK 就从创世状态跳跃到最新状态、非交互式地将未上链交易的序列聚合为单笔交易,但我们还是需要为每一个新区块发布所有的非见证数据,以使所有的全节点都能更新他们的 UTXO 集合。因此,SNARK 无法解决区块链面临的带宽根本约束。
感谢 Sanket Kanjalkar 富有教益的讨论和评论。
- NIWA 在行动。SNARK 消耗 witness,但自身也是一个 witness。所以 SNARK 可以吞吃 SNARK -