Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-1895: 支持椭圆曲线循环

Authors Alexandre Belling <alexandrebelling8@gmail.com>
Created 2018-03-31
Discussion Link https://ethresear.ch/t/reducing-the-verification-cost-of-a-snark-through-hierarchical-aggregation/5128

简单总结

由于预编译 ecaddecmul 以及 ecpairing,EVM 当前支持曲线 alt-bn128 的椭圆曲线运算。MNT4 和 6 类包含曲线循环。这些循环使得可以在另一个曲线上的 SNARK 中对一个曲线进行运算(反之亦然)。这个 EIP 建议增加对这些曲线的支持。

摘要

通过预编译添加对以下操作的支持:

  • MNT4 上的 ecadd
  • MNT4 上的 ecmul
  • MNT4 上的 ecpairing

动机

椭圆曲线是递归 SNARKs 的基本构建块(即:在一个 SNARK 内部验证一个 SNARK),这解决了可扩展零知识的问题。更普遍地说,这部分解决了可扩展性问题,因为 SNARKs 验证在被验证电路的大小上是恒定时间的。

更具体地说,今天如果 EVM 必须处理 1000 多个 SNARK 验证,则需要大约 15 亿 gas,这对于以太坊来说是不切实际的。例如,递归 SNARK 使得可以将多个证明聚合到单个证明中,该证明可以像任何其他 SNARK 一样进行验证。这导致验证成本的大幅降低。

然而,使用 alt-bn128 这是不可能的,据我所知,已知产生循环的唯一配对友好曲线族是 MNT4 和 MNT6。在 配对友好椭圆曲线的循环 中提出了这两个家族之间存在的循环的完整特征。

规范

曲线

所提出的循环已在 通过椭圆曲线循环实现可扩展的零知识 中介绍。

MNT4 定义

G_1G_2 是素数阶的循环群:

q = 475922286169261325753349249653048451545124878552823515553267735739164647307408490559963137

G_1 定义在素数阶的域 F_p 上:

p = 475922286169261325753349249653048451545124879242694725395555128576210262817955800483758081

带有生成器 P:

P = (
    60760244141852568949126569781626075788424196370144486719385562369396875346601926534016838,
    363732850702582978263902770815145784459747722357071843971107674179038674942891694705904306
)

p 和 q 都可以用 298 位表示。

群 G_1 定义在由方程 Y² = X³ + aX + b 定义的曲线上,其中:

    a = 2
    b = 423894536526684178289416011533888240029318103673896002803341544124054745019340795360841685

扭曲群 G_2 定义在域 F_p^2 = F_p / <<待完成>>

扭曲群 G_2 定义在由方程 Y² = X² + aX + b 定义的曲线上,其中:

    a = 34 + i * 0
    b = 0 + i * 67372828414711144619833451280373307321534573815811166723479321465776723059456513877937430

G_2 生成器由以下生成:

    P2 = (
        438374926219350099854919100077809681842783509163790991847867546339851681564223481322252708 +
        i * 37620953615500480110935514360923278605464476459712393277679280819942849043649216370485641,
        37437409008528968268352521034936931842973546441370663118543015118291998305624025037512482 +
        i * 424621479598893882672393190337420680597584695892317197646113820787463109735345923009077489
    )

操作和 gas 成本

将实现以下操作及其 gas 成本

MNT_X_ADD = <<待评估>>
MNT_X_MUL = <<待评估>>
MNT_X_PAIRING = <<待评估>>

其中 X 为 4。

编码

F_p 上的曲线点 P(X, Y) 以其压缩形式 C(X, Y) 表示:

    C = X | s

其中 s 如下表示 Y

    |  `s'`  | `Y`                      |
    |--------|--------------------------|
    | `0x00` | 无穷远点                |
    | `0x02` | `y` 为偶数的解           |
    | `0x03` | `y` 为奇数的解          |

从仿射坐标的压缩操作是微不足道的:

    s = 0x02 | (s & 0x01)

在 EVM 中,压缩形式允许我们用 2 个 uint256 而不是 3 个来表示曲线点。

边缘情况

  • 无穷远点的几种可接受的表示形式

理由

该曲线具有 80 位的安全性(而 MNT6 具有 120 位),这可能被认为对于关键安全级别(例如转移数十亿)来说不够,但对于其他级别来说足够。如果事实证明对于采用来说安全性不够,则还有另一种选择:Coda 正在使用另一个循环,但它定义在 753 位大小的字段上,这也可能高得令人望而却步(未找到 Coda 出版物中对该曲线的引用)。

独立于选择的循环,组和字段元素都用大于 256 位的整数表示(即使对于 80 位的安全性),因此可能还需要添加对更大字段大小操作的支持。

我们目前不知道更有效的配对友好循环,也不知道是否存在。但是,通过放宽循环的所有曲线必须都是配对友好的曲线的约束,有可能规避这个问题。如果我们有一个只有一条配对友好曲线的循环,我们仍然可以通过在 SNARK 和任何其他通用零知识密码系统之间交替来组合证明。

假设我们找到了一个方便的循环,我们不需要实现对其包含的所有曲线的支持,只需一个即可。最好的选择是最快的,因为递归 snark 的整体安全性不取决于进行验证的曲线。

将进行适当的基准测试,以便做出此选择并以 gas 定价操作。

测试用例

参考文献

  • Eli-Ben-Sasson, Alessandro Chiesa, Eran Tromer, Madars Virza, [BCTV14], April 28, 2015, 通过椭圆曲线循环实现可扩展的零知识: https://eprint.iacr.org/2014/595.pdf
  • Alessandro Chiesa, Lynn Chua, Matthew Weidner, [CCW18], November 5, 2018, 关于配对友好椭圆曲线的循环: https://arxiv.org/pdf/1803.02067.pdf

实现

  • go-boojum:递归 SNARKs 应用程序的 PoC 演示
  • libff:用于有限域和椭圆曲线的 C++ 库
  • coda:一种新的加密货币协议,具有轻量级的、恒定大小的区块链。

版权

版权及相关权利通过 CC0 放弃。

Citation

Please cite this document as:

Alexandre Belling <alexandrebelling8@gmail.com>, "EIP-1895: 支持椭圆曲线循环 [DRAFT]," Ethereum Improvement Proposals, no. 1895, March 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1895.