Alert Source Discuss
🚧 Stagnant Standards Track: Core

EIP-1962: 运行时定义的 EC 算术和配对

Authors Alex Vlasov (@shamatar)
Created 2019-04-22
Discussion Link https://ethereum-magicians.org/t/generalised-precompile-for-elliptic-curve-arithmetics-and-pairings-working-group/3208/2
Requires EIP-1109

简要概述

此提案是 EIP-1829 的扩展和形式化,并包含配对。EIP-1109 是必需的,因为与 STATICCALL 操作码相比,某些操作的成本较低(更多信息请参见下面的相应部分)。

摘要

此 EIP 提出了一种新的预编译,以带来隐私和扩展解决方案所需的加密功能。此类预编译的功能将需要以下内容:

  • 实现 Weierstrass 形式的椭圆曲线上的以下运算,曲线参数(例如基域,A,B 系数)在运行时定义:
    • 点加法
    • 单个点在标量上的乘法
    • 多重指数运算
  • 实现来自以下“族”的椭圆曲线上的配对操作,参数(例如基域,扩展塔结构,系数)在运行时定义:
    • BLS12
    • BN
    • MNT4/6 (Ate 配对)

预编译的完整功能在下面的 Specification 部分中描述。

动机

  • 有一个待定的提案要实现基本的椭圆曲线算术,该提案由 EIP-1829 涵盖,并将允许以合理的每个操作 gas 成本来实现各种保护隐私的协议。
  • 配对是基本算术的重要扩展,因此提出了此新的预编译,具有以下优点:
    • 扩展的曲线集将可供使用,以允许以太坊用户选择其安全参数和所需的功能。
    • 此预编译的通用方法将允许以太坊用户尝试他们选择的最新发现的曲线和新的构造,而无需等待新的分叉。
    • EC 算术确实在此预编译中重新实现,但这是严格要求的。大多数基于配对的协议仍然需要执行标准的 EC 乘法或加法,因此此类操作必须在通用曲线上可用。
  • Gas 成本 - 此 EIP 旨在在调用期间尽早估计所执行操作的 gas 成本,并仅基于指定的参数和操作类型。这是任何预编译的一项严格要求,以允许以太坊节点尽早有效地拒绝交易和操作。

此新提议的预编译的功能与 EIP-1829 在以下方面有所不同:

  • 对曲线的基域和标量域的任意长度模数(直到某个上限)进行运算
  • 引入了配对操作
  • 由于可变参数长度而导致的不同 ABI

规范

如果 block.number >= XXXXX,则定义一组 10 个新的预编译,地址为 [0x.., 0x.., ...],并具有以下功能。

  • 在基域上定义的曲线上添加点
  • 在基域上定义的曲线上乘一个点
  • 对于在基域上定义的曲线,对 N(scalar, point) 执行多重指数运算
  • 在基域的二次或三次扩展上定义的曲线上添加点
  • 在基域的二次或三次扩展上定义的曲线乘一个点
  • 对于在基域的二次或三次扩展上定义的曲线,对 N(scalar, point) 执行多重指数运算
  • BLS12 系列的曲线上进行配对运算
  • BN 系列的曲线上进行配对运算
  • MNT4 系列的曲线上进行配对运算
  • MNT6 系列的曲线上进行配对运算

由于预编译的实际开发以及正在进行的许多更改,因此存在一个单一的 真理来源。它涵盖了二进制接口,gas 计划,现有实现的集成指南。

可能的简化

由于所提出的操作在实现,调试和评估 gas 成本因素方面具有很高的复杂性,因此可能适合于在接受时限制曲线的集合,然后再对其进行扩展。另一种方法(如果技术上可行)是拥有可以无需共识更改(无需分叉)就可以更新的“白名单”合约。

如果曲线集受到限制,则建议将以下集合作为最低要求:

  • 以太坊当前版本的 BN254 曲线
  • 来自 DIZK 的具有 2^32 个单位根的 BN 曲线
  • BLS12-381
  • 来自 ZEXE 的具有大量单位根的 BLS12-377
  • 来自原始 论文 的 MNT4/6 循环。它不太安全,但可能会为实验提供一些自由。
  • 如果性能允许,则使用来自 Coda 的 MNT4/6 循环
  • 一组 CP 生成的曲线,这些曲线可以嵌入 BLS12-377,并且对于基域和标量场模数都具有较大的二的幂除数的 BN 曲线(可以在 ZEXE 中找到 BLS12-377 的 CP 曲线的示例)。

理由

仅涵盖最大的设计决策:

  • 虽然没有曲线的标量场(即主群的大小)上的算术运算,但出于 gas 估算的目的,这是必需的。
  • 由于节省了大量成本,因此多重指数运算是一项单独的操作
  • 由于无法获得平方根运算的通用 gas 估算,因此没有点解压缩。对于有限数量的“好”情况,价格相差太大,因此指定“最坏情况”既昂贵又效率低下,而将另一层复杂性引入到已经复杂的 gas 成本公式中是不值得的。

此预编译和 EIP 1109

虽然 EIP 1109 对于功能没有严格的要求,但这是一个期望它的示例:

  • BLS12-381 曲线,381 位模数,255 位标量域,EVM 中没有用于此的本机算术
  • 点加法将花费 5000ns(相当高估)
  • 点乘法将花费大约 150000ns
  • ECRecover 预编译的粗略 gas 计划为 15 Mgas/秒
  • 点加法将花费 75 gas,STATICCALL 增加 700
  • 点乘法将花费 2250 gas
  • 还应加上内存分配的成本,至少为 1 + 1 + 48 + 48 + 48 + 1 + 32 + 2*48 + 2*48 = 371 byte,大约为 12 个本机以太坊“字”,并且需要额外的 36 gas(内存扩展的价格可以忽略不计)

基于这些非常粗略的估算,可以看到 STATICCALL 价格将在总成本中占主导地位(在加法的情况下),或者在调用此预编译的情况下带来显着的开销(在乘法运算的情况下)。

向后兼容性

此更改不向后兼容,需要硬分叉才能激活。

新的预编译本身的功能不会影响以太坊或 EVM 的任何现有功能。

此预编译可以完全替代当前的 ECADDECMUL 和配对检查预编译集(0x060x070x08

测试用例

测试用例是实现的组成部分,链接如下。

实现

这里 正在进行实现工作。现在:

  • 非配对操作已实现并经过测试。
  • BLS12 系列已完成,并针对 BLS12-381 和 BLS12-377 曲线进行了测试。
  • BN 系列已完成,并已使用 BN254 曲线进行了测试。
  • 已经针对 ZEXE 中的 k=6 曲线测试了 Cocks-Pinch 方法曲线。

初步基准测试

基准测试中的 cp6 是一种嵌入 BLS12-377 的 Cocks-Pinch 方法曲线。机器:Core i7,2.9 GHz。

多重指数运算基准测试采用 100 对 (generator, random scalar) 作为输入。由于相同的“基础”,可能不是太有代表性的基准测试,并且会进行更新。

test pairings::bls12::tests::bench_bls12_381_pairing    ... bench:   2,348,317 ns/iter (+/- 605,340)
test pairings::cp::tests::bench_cp6_pairing             ... bench:  86,328,825 ns/iter (+/- 11,802,073)
test tests::bench_addition_bn254                        ... bench:         388 ns/iter (+/- 73)
test tests::bench_doubling_bn254                        ... bench:         187 ns/iter (+/- 4)
test tests::bench_field_inverse                         ... bench:       2,478 ns/iter (+/- 167)
test tests::bench_field_mont_inverse                    ... bench:       2,356 ns/iter (+/- 51)
test tests::bench_multiplication_bn254                  ... bench:      81,744 ns/iter (+/- 6,984)
test tests::bench_multiplication_bn254_into_affine      ... bench:      81,925 ns/iter (+/- 3,323)
test tests::bench_multiplication_bn254_into_affine_wnaf ... bench:      74,716 ns/iter (+/- 4,076)
test tests::bench_naive_multiexp_bn254                  ... bench:  10,659,911 ns/iter (+/- 559,790)
test tests::bench_peppinger_bn254                       ... bench:   2,678,743 ns/iter (+/- 148,914)
test tests::bench_wnaf_multiexp_bn254                   ... bench:   9,161,281 ns/iter (+/- 456,137)

版权

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

Citation

Please cite this document as:

Alex Vlasov (@shamatar), "EIP-1962: 运行时定义的 EC 算术和配对 [DRAFT]," Ethereum Improvement Proposals, no. 1962, April 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1962.