Multi-scalar multiplication: state of the art & new ideas

1. 引言

Consensys团队 Gus Gutoski 2020年在zkStudyClub上分享:Multi-scalar multiplication: state of the art & new ideas

Multi-scalar multiplication(MSM)又名Multi-exponentiation或multi-exp。
针对的场景为:

  • 参数:某cyclic group G \mathbb{G} G,其order ∣ G ∣ |\mathbb{G}| G的bit length为 b b b。(如BLS或BN椭圆曲线,有 ∣ G ∣ ≈ 2 256 |\mathbb{G}|\approx 2^{256} G2256,即 b = 256 b=256 b=256
  • 输入:
    • G \mathbb{G} G内的群元素 G 1 , ⋯   , G n G_1,\cdots,G_n G1,,Gn,称为inputs。
    • 整数 a 1 , ⋯   , a n a_1,\cdots,a_n a1,,an的取值范围为 0 0 0 ∣ G ∣ |\mathbb{G}| G,称为scalars。
  • 输出:群元素 a 1 G 1 + ⋯ + a n G n a_1G_1+\cdots+a_nG_n a1G1++anGn称为output。

目标是:

  • 减少所需的群运算(+)的次数——为关于 n n n的函数。

直接的解决方案为:

  • 使用double-and-add来计算每个 a i G i a_iG_i aiGi,然后将它们相加求和,所需group ops期望值为: 1.5 b n ≈ 1.5 ∗ 256 n ≈ 384 n 1.5bn\approx1.5*256n\approx 384n 1.5bn1.5256n384n

有更优的解决方案么?

1.1 MSM的背景需求

零知识证明ZKP中,Prover向Verifier证明其知道某些 x ⃗ = { a 1 , ⋯   , a n } \vec{x}=\{a_1,\cdots,a_n\} x ={ a1,,an} secret inputs,使得 P ( x ⃗ ) = y P(\vec{x})=y P(x )=y成立。

在证明过程中,Prover需要使用proving key G 1 , ⋯   , G n G_1,\cdots,G_n G1,,Gn 计算:
G = a 1 G 1 + ⋯ + a n G n G=a_1G_1+\cdots +a_nG_n G=a1G1++anGn

即Prover需要做MSM运算。

  • 对于ZCash的NU5升级之前的spend program: n ≈ 4 × 1 0 4 n\approx 4\times 10^4 n4×104
  • 对于Rollup扩容方案: n n n越大越好

目标是:

  • 针对 n = 1 0 7 , 1 0 8 n=10^7,10^8 n=107,108甚至更大的 n n n值。

MSM占据了约 80 % 80\% 80%的Prover工作量。
Justin Drake在2020的Zero-Knowledge podcast Episode 120: ZKPs in Ethereum with Vitalik Buterin & Justin Drake中指出:

  • Focus on multi-exponentiation, forget about FFTs(Remove the need for FFTs)
  • Sparseness
  • Recursion
  • Custom gates
  • Hardware

MSM占据了Prover的主要开销,Prover开销占据ZKP主要开销。改进MSM即意味着提升ZKP效率。

扫描二维码关注公众号,回复: 14449307 查看本文章

2. bucket method

由Consensys团队开发的:

中采用了bucket算法,针对BLS或BN曲线( b ≈ 256 b\approx 256 b256),所需group ops运算次数为:
16 n + ( constant ) 16n+(\text{constant}) 16n+(constant)

相比于直接方案的 384 n 384n 384n,性能提升了 24 24 24倍+。

bucket算法详细见2012年论文《Faster batch forgery identification》第4章的“Overlap in the Pippenger approach”,核心策略会:

  • 1)将一个 b b b-bit MSM reduce为多个 c c c-bit MSM,其中 c ≤ b c\leq b cb
  • 2)使用一些聪明的技巧来计算 c c c-bit MSM。(有趣的部分)
  • 3)将多个 c c c-bit MSM合并为最终的 b b b-bit MSM。

3.1 第一步:将一个 b b b-bit MSM reduce为多个 c c c-bit MSM

选择 c ≤ b c\leq b cb,将每个scalar a 1 , ⋯   , a n a_1,\cdots,a_n a1,,an以二进制表示,将二进制scalar切分为 c c c-bit parts。

如:给定 b = 12 , c = 3 b=12,c=3 b=12,c=3,将每个 12 12 12-bit scalar a a a切分为 3 3 3-bit parts。
若scalar a = 1368 a=1368 a=1368,则将 a a a表示为 a = ( 2 , 3 , 5 , 0 ) a=(2,3,5,0) a=(2,3,5,0)
在这里插入图片描述
从已切分的scalars推导出 b / c b/c b/c c c c-bit MSM instances。
( b , c , b / c ) = ( 12 , 3 , 4 ) (b,c,b/c)=(12,3,4) (b,c,b/c)=(12,3,4),将每个scalar切分表示为 a i = ( a i , 1 , a i , 2 , a i , 3 , a i , 4 ) a_i=(a_{i,1}, a_{i,2}, a_{i,3},a_{i,4}) ai=(ai,1,ai,2,ai,3,ai,4),从而可获得4个 c c c-bit MSM instances T 1 , ⋯   , T 4 T_1,\cdots,T_4 T1,,T4
T 1 = a 1 , 1 G 1 + ⋯ + a n , 1 G n T_1=a_{1,1}G_1+\cdots +a_{n,1}G_n T1=a1,1G1++an,1Gn
⋮ \vdots
T 4 = a 1 , 4 G 1 + ⋯ + a n , 4 G n T_4=a_{1,4}G_1+\cdots +a_{n,4}G_n T4=a1,4G1++an,4Gn

3.2 第三步:将多个 c c c-bit MSM合并为最终的 b b b-bit MSM

常规方法为:double c c c次,然后求和。
仍然以 ( b , c , b / c ) = ( 12 , 3 , 4 ) (b,c,b/c)=(12,3,4) (b,c,b/c)=(12,3,4)为例,合并 T 1 , ⋯   , T 4 T_1,\cdots,T_4 T1,,T4获得最终答案 T T T

  • 1)令T=T_1。
  • 2)对于 j = 2 , ⋯   , 4 j=2,\cdots,4 j=2,,4
    • 2.1)令 T = 2 c T T=2^cT T=2cT(double c c c次)
    • 2.2)令 T = T + T j T=T+T_j T=T+Tj

最终结果即为 T = a 1 G 1 + ⋯ + a n G n T=a_1G_1+\cdots +a_nG_n T=a1G1++anGn
第三步中包含的加法运算开销为:
( b / c − 1 ) × ( c + 1 ) = b − c + b c − 1 (b/c-1)\times(c+1)=b-c+\frac{b}{c}-1 (b/c1)×(c+1)=bc+cb1

3.3 第二步:使用一些聪明的技巧来计算 c c c-bit MSM

参考资料

[1] Consensys团队 Gus Gutoski 2020年在zkStudyClub上分享:Multi-scalar multiplication: state of the art & new ideas

猜你喜欢

转载自blog.csdn.net/mutourend/article/details/126207923