Skip to content

zk-SNARK用のプリコンパイル済みコントラクト

Ethereumではzk-SNARK用にペアリングのプリコンパイル済みコントラクトが存在します。

2つの素数 \(p,q\) を次に定めます。

\[ p= 21888242871839275222246405745257275088696311157297823662689037894645226208583 \]
\[ q= 21888242871839275222246405745257275088548364400416034343698204186575808495617 \]

有限体 \(\mathbb{F}_p\) において、集合 \(C_1\) を、

\[ C_1=\lbrace(X,Y)\in \mathbb{F}_p\times \mathbb{F}_p \mid Y^2 = X^3 + 3 \rbrace \cup \lbrace(0,0)\rbrace \]

と定義します。

\((C_1,+)\) は群であり、スカラー倍算を定義できます。

\[ n\cdot P \equiv (0,0)+ \underbrace{P+\cdots+P}_n \]

ここで、 \(n\) は自然数であり、点 \(P\)\(C_1\) の元です。

\(C_1\) 上の点 \((1,2)\)\(P_1\) と定義します。 \(P_1\) が生成する \((C_1,+)\) の部分群を \(G_1\) とすると、 \(G_1\) は次数 \(q\) の巡回群になることが知られています。 \(G_1\) の点 \(P\) に対して \(n\cdot P_1 = P\) となるような最小の自然数 \(n\)\(\log_{P_1}(P)\) と定義します。 \(\log_{P_1}(P)\) は最大で \(q-1\) です。

\(\mathbb{F_p^2}\)\(\mathbb{F_p}[i]/(i^2+1)\) として、集合 \(C_2\)

\[ C_2=\lbrace(X,Y)\in \mathbb{F}_p^2\times \mathbb{F}_p^2 \mid Y^2 = X^3 + 3(i+9)^{-1} \rbrace \cup \lbrace(0,0)\rbrace \]

と定義します。

\((C_2,+)\)\((C_1,+)\) と同様に群であり、スカラー倍算を定義できます。

\(C_2\) 上の点 \(P_2\) を次に定義します。

\[ \begin{align} P_2 \equiv & (11559732032986387107991004021392285783925812861821192530917403151452391805634 \times i \\ & +10857046999023057135944570762232829481370756359578518086990519993285655852781, \\ & 4082367875863433681332203403145435568316851327593401208105741076214120093531 \times i \\ & +8495653923123431417604973247489272438418190587263600148770280649306958101930) \end{align} \]

\(P_2\) が生成する \((C2, +)\) の部分群を \(G_2\) とすると、 \(G_2\)\(C_2\) 上で唯一の次数 \(q\) の巡回群であることが知られています。 \(G_2\) の点 \(P\) に対して \(n\cdot P_2 = P\) となるような最小の自然数 \(n\)\(\log_{P_2}(P)\) と定義します。 \(\log_{P_2}(P)\) は最大で \(q-1\) です。