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\) です。