动向|关于将 Zcash 集成在以太坊 (ZOE) 中

动向|关于将 Zcash 集成在以太坊 (ZOE) 中

我们说

以太坊灵活的智能合约接口能够实现大量种类的应用,其中大部分也许还没有被想出来。当在以太坊中添加隐私的能力时,基于智能合约的应用可能性会大大增加。想象一下,例如,在区块链中通过智能合约实施的一次选举或者拍卖过程,其结果能够被区块链的观察者验证,但是个体的投票或者竞拍不会被披露。另外一个可能的场景是,用户有选择性的披露一些事实,能够证明他们的确在某一个特定的城市,而无需披露他们准确的地理位置。在以太坊中添加这种能力的关键是简洁的非交互式零知识证明 (zero-knowledge succinct non-interactive arguments of knowledge (zk-SNARKs)) - 正是 Zcash 使用的加密引擎。

Zcash 公司的目的之一,代号为 Project Alchemy,是使以太坊与 Zcash 之间存在一个直接的去中心化交易所成为可能。连接这两个区块链以及技术,一个旨在解决可编程性,另外一个旨在解决隐私,是促进需要这两种特性的应用开发的自然方式。

作为 Zcash/以太坊技术合作的一部分,几周前,来自 Zcash 的 Ariel Gabizon 拜访了来自位于柏林的以太坊中心的 Christian Reitwiessner。这次拜访的亮点是用 Solidity 语言编写的一个 zk-SNARK 验证者实现的概念证明,基于以太坊 C++ 客户端的预编译的以太坊智能合约。这项工作补充了 Baby ZoE,在 Baby ZoE 中,实现了基于 parity (以太坊的 Rust 客户端) 的一个 zk-SNARK 预编译合约。我们做的更新包括添加极小的加密原语 (椭圆曲线乘法,加法,结对) 以及用 Solidity 实现了剩余部分,所有的这些允许一个更大的灵活性,并且使无需一个硬分叉即可使用各种各样的 zk-SNARK 构建方法。随着晚些时候它们变为可用的,更多细节将被分享。我们测试了最新代码,成功地在一个以太坊区块链的测试网络上验证了一个真实的保留隐私的 Zcash 交易。

验证过程仅花费了 42 毫秒,这表明这样的预编译合约可以被添加,并且使用它们的 gas 花费能够变得可支付起的。

『 这样一个系统能够做什么? 』

Zcash 系统可以在以太坊上复用来创建受保护的定制 token。这样的 token 已经使大量应用成为可能,比如投票 (看下面),或者简单隐蔽的拍卖(参与者在无需知晓其它人竞拍金额下出价竞拍)。

如果你想尝试编译概念性证明,你可以使用下列命令。如果你需要帮助,请看 https://gitter.im/ethereum/privacy-tech

git clone https://github.com/scipr-lab/libsnark.git

我们也讨论了集成 zk-SNARK 到以太坊区块链中各种各样的方面,现在我们就展开来讲

『 决定定义何种预编译合约 』

回忆起一个 SNARK 是某些特性的一个简短证据,对于在以太坊区块链中添加隐私特性所需要的是有能力来验证这样一个证据的客户端。

在所有近期的构思中,验证过程完全由基于椭圆曲线的操作组成。具体来说,验证者需要在一个椭圆曲线群上进行标量乘法与加法,同样需要一个费时的操作,称之为双线性配对 (bilinear pairing)。

正如这里提到的,直接在以太坊虚拟机 (EVM) 中实现这些操作代价太大。因此,我们想要实现预编译合约来执行这些操作。现在,值得讨论的问题是:这些预编译合约的目标是何种级别的普遍性。

SNARK 的安全级别对应于椭圆曲线的参数。粗略地说,曲线的秩越大 (curve order),表示曲线的多项式的度 (embedding degree) 越大,基于该曲线的 SNARK 就越安全。另一方面,这些数量越大,在相应曲线的操作自然就越费时。因此,一个使用 SNARKs 的合约设计者也许希望根据他们自己想要的效率/安全权衡来选择这些参数。这种权衡也是一个以高级别普遍性来实现相应预编译合约的原因,合约设计者可以从一大群曲线家族中选择自己想要的。我们的确以一个高级别普遍性目标开始,其中曲线的描述可以作为合约输入的一部分。在这样一种情况下,一个智能合约将能够在任意椭圆曲线群中执行加法操作。

这种方法的一个复杂之处在于对每一个操作赋予相应的 gas 花费。你必须估算,仅仅从曲线的描述中,并且不能获知一个具体的实现,在最坏情况下,在那个曲线上的群操作有多昂贵。一个有点不是那么通用的解决方案是允许来自给定家族的曲线。我们注意到,当使用 Barreto-Naehrig (BN) 家族的曲线时,给定曲线参数,可以粗略地估算结对 (pairing) 操作有多昂贵,所有这种曲线都支持一种具体类型的优化结对操作 (Ate pairing)。这有一个关于这样一个预编译合约是如何工作的以及gas 花费是如何计算的概述。

我们从这个讨论中学到了很多,但是最终,对这个概念证明决定 “保持简单” : 我们选择针对目前被 Zcash 使用的具体曲线来实现合约。我们通过使用在 libsnark 库中相应的函数的封装来做此项工作,该库同样被 Zcash 所使用。

注意,我们可以简单地使用整个验证函数 (目前被 Zcash 使用) 的封装,这在上述提到的 Baby ZoE 项目中已经完成。然而,明确定义椭圆曲线操作的优势是使使用各种各样的 SNARK 构建成为可能,所有的构建都有一个验证者工作,通过前面提到的三种椭圆曲线操作的某种结合。

针对全新匿名的 token 以及其它应用,复用 Zcash 的构建 (setup) 阶段

你也许已经听说过,使用 SNARKs 需要一个复杂的构建阶段,被称作为系统公共参数在此阶段中生成。每一次我们想要使用一个针对特定电路的 SNARK 时,公共参数需要以一种安全的方式生成,该事实显著地阻碍了 SNARKs 的可用性。简化这个构建阶段是一个我们考虑的重要的目标,但是到目前为止,还没有成功。

好消息是,想要发行一个支持隐私护交易的 token 能够简单地复用已经被 Zcash 安全生成的公共参数。它可以被复用,因为用来验证隐私保护交易的电路不是内在地绑定到一个加密货币或者区块链上的。相反,它的显示输入之一是一个包含了所有有效的加密货币 notes 的 Merkle 树的根。因此,这个输入可以根据希望使用的某种加密货币来进行改变。还有就是,如果开始一个全新匿名 token 是很容易的,你可以先完成大部分看起来不像 token 的任务。比如说,假设我们希望实施一次匿名的选举,在两个选项中选择更喜欢的一个。我们可以针对投票发行一个匿名定制 token,发送一个币到每一个投票实体。既然这没有挖矿的概念,使用任何其它方式来生成 token 是不可能的。现在每一个实体根据他们的投票发送他们的币到两个地址中的一个。拥有一个更大余额的地址就会赢得该次选举。

『 其它的应用 』

一个不基于 token 的系统,构建相对简单,允许“选择性的披露”。你可以,例如,定期地发送一个包含你物理位置的加密消息,到区块链中 (或许与其它人的签名一起来防止欺骗)。如果对于每一条消息,你使用一个不同的密钥,你可以仅仅在一个特定的时间通过公布你的密钥披露你的位置。然而,使用 zk-SNARKs,你可以另外证明你在一个特定的区域,而无需披露你在哪个具体位置。在 zk-SNARK 内部,你可以解密你的位置,并且检查它确实在该区域里面。由于零知识特性,每一个人都可以验证该检查,但是没有人能够获取到你真正的位置。

『 未来的工作 』

实现提到的功能性 - 创建匿名 tokens 并且在以太坊区块链上验证 Zcash 交易,将会需要用 Solidity 来实现 Zcash 使用的其它元素。

对于第一个功能来说,我们必须有一些任务的实现,该任务是在 Zcash 网络中的节点执行的,比如说更新 note 承诺树 (note commitment tree,在 Zcash 中,note 代表匿名币,commitment 代表匿名币的唯一标识)。

对于第二个功能来说,我们需要 equihash (由 Zcash 使用的工作量证明算法) 的一个 Solidity 实现。否则,交易能够被验证自身有效,但是我们不知道交易是否真正集成在 Zcash 的区块链中。

幸运地是,这样一种实现已经编写;然而,它的有效性需要提高以满足实际应用中需要的场景。


参考:https://blog.ethereum.org/2017/01/19/update-integrating-zcash-ethereum/

翻译:lighting-li


关于EthFans

建立最好的以太坊中文技术社区,持续推广和普及以太坊的技术,帮助以太坊释放区块链和智能合约的潜力,并为开发者提供更好的平台和机会。我们相信区块链和智能合约会在将来不断证明其巨大的潜力,并在创新、社会效率,以及新的机会方面会对世界产生巨大的影响。


分享到:


相關文章: