区块链研究实验室 | 以太坊中的ZK-SNARK预编译合同

ZK-SNARKs的神奇之处在于基于椭圆曲线配对的一些重型密码术。当您仔细观察时,智能合约可以在以太坊交易的gas成本限制内执行必要的数学计算,这是相当令人印象深刻的。那么,秘诀是什么?

以太坊预编合同

 ZK-SNARKs是相当硬核的加密技术,并且正如你所期望的那样计算量非常大。让我们来看看镜头下的相关方法:

区块链研究实验室 | 以太坊中的ZK-SNARK预编译合同_第1张图片

区块链研究实验室 | 以太坊中的ZK-SNARK预编译合同_第2张图片

仔细观察后,这种方法并没有做任何特别的事情。 它接收两个相同长度的数组,表示两条椭圆曲线中的点。 每对点可以在6个256位字的空间中表示,因此该函数将它们存储在所需大小的数组中。 它还为方法的返回分配一个数组,这是一个单个数组。 然后我们到达突出显示的部分,一些用于调用函数的汇编代码。 你能看出它的作用吗?

call(g, a, v, in, insize, out, outsize)

 

在地址a处调用合同,输入mem [in ..(in + insize))提供g gas和v wei以及输出区域mem [out ..(out + outsize))错误时返回0(例如,gas用完)和1成功。

这会调用地址8,而不发送任何以太网。减少gas限制以考虑调用本身和一些其他工作的花费,并且两个阵列作为输入数据和输出缓冲器传入。

如果您熟悉以太坊地址,您会发现这些通常是随机的160位字符串,因此8绝对不是普通地址。更重要的是,这个模式重复了两次,地址为6和7。

地址1到8确实是保留的,并且对应于以太坊黄纸中指定的预编译合同的概念。最初仅为4,其数量已由以太坊改进提案198,196和197增加,专门用于支持某些加密操作。

什么是预编译合同?

这八个所谓的“预编译”合同,意味着可能在以后成为原生扩展的初步架构。地址1到8中的八个契约执行椭圆曲线公钥恢复功能,SHA2 256位哈希方案,RIPEMD 160位哈希方案,标识函数,任意精度模幂运算,椭圆曲线加法,椭圆曲线标量乘法和椭圆曲线配对检查。

除了身份功能之外,所有其他合同都执行加密操作,这些操作本质上很难使用EVM字节码来实现。请记住,EVM是最终每个合同都运行的环境:合同的代码被简化为类似于汇编的操作码,这是非常基本的分钟操作,比如将数据从堆栈移动到内存,或者对256位字进行一些算术运算。计算中的每个操作码都会增加gas成本,因此像这样的硬计算会变得非常昂贵。因此,预编译合同不会在EVM中执行。

相反,它们由以太坊客户端执行,因此以更高级别的语言实现客户端,如Rust或Javascript。这些甚至可以调用低级优化库。优点是执行速度更快,气体成本低于在EVM中运行相同算法。

据我所知,上面的前四个合同从一开始就是以太坊的一部分。它们启用了构建区块链本身所需的基本功能:散列和签名验证。

其他4份合同于2017年10月16日作为Byzantium分支的一部分发布。地址5的合同EXPMOD旨在实现EVM内部的高效RSA验证,但该特定操作在密码学中广泛普及。其他3份合同是故意包括在内以支持SNARK。这些是:

  • BN_ADD:在椭圆曲线ALT_BN_128上添加两个点。

  • BN_MUL:将同一椭圆曲线上的一个点乘以标量。

  • SNARKV:用于验证Snark。这会将一系列配对相乘并检查结果是否为1,即它们是否取消。

例如,目前,Geth实现看起来像这样。调度员:

区块链研究实验室 | 以太坊中的ZK-SNARK预编译合同_第3张图片

配对检查

区块链研究实验室 | 以太坊中的ZK-SNARK预编译合同_第4张图片

当我看到上面的情况时,感觉就像看着隐藏在雾中的景观。我能够感知到它的作用,但我必须凭信心去做。即使作为密码学家,我也将椭圆曲线作为黑盒子给我提供了一些功能,但我从来没有深入研究如何计算它们的操作细节(特别是配对)。大多数用户不需要深入细致地理解这些代码,但是在你做的情况下,至少现在你知道在哪里搜索它。

无论如何,这是执行摘要:外部函数仅将输入打包在两个列表中,表示配对的两个源组上的点。内部函数有效地计算批量中所有配对的乘积。

结论

这篇文章的目的是解释预编译合同是什么,它们在何处实现以及它们如何用于支持以太坊中的SNARK。我没有报道这篇文章中的任何数学,因为这对于未来的一个或多个帖子来说足够了。我希望上面的内容帮助您理解预编译合同的概念,以及如果您需要在智能合约中使用加密技术,如何使用这些功能。

你可能感兴趣的:(区块链,智能合约,以太坊,区块链技术,Hyperledger)