コインチェーン

仮想通貨・Web3ニュース・投資・教育情報

カイバーネットワーク Kyber Networkとは? | 徹底解説

  • ホーム
  • カイバーネットワーク Kyber Networkとは? | 徹底解説
カイバーネットワーク Kyber Networkとは? | 徹底解説

Kate-Zaverucha-Groth(KZG)多項式コミットメントスキームは、ゼロ知識(zk)プロトコルでは不可欠です。KZGは、証明者が多項式にコミットし、後で多項式を明かさずに値の正しさを証明できるようにすることで、zkロールアップやその他のプライバシー保護テクノロジにおいて重要な役割を果たします。この記事では、わかりやすくするためにPythonコード例を使用して、KZGのコミットメントを段階的に説明します。

多項式コミットメントスキームとは何ですか?

多項式コミットメントスキームを使用すると、多項式にコミットし、特定の点での多項式の評価を効率的に証明できます。メンバーシップを証明するために兄弟パスを必要とするマークルツリーとは異なり、多項式コミットメントでは多項式ルートが使用されます。証明者は、メンバーシップを証明するために、コミットされた多項式で点がゼロに評価されることを示さなければなりません。

KZGコミットメントの4つの段階

1.信頼できるセットアップ
2.コミット
3.オープン/プルーフ
4.確認する
詳細な説明とコード例で各フェーズを見てみましょう。

フェーズ1:信頼できるセットアップ

信頼できるセットアップでは、コミットメントに使用される共通参照文字列(CRS)が生成されます。これには、ランダム性を確保するマルチパーティ計算(MPC)が含まれます。KZGの場合、CRSはグループ要素\(G1.および\(G2.に秘密の\(i\)乗を乗じたもので構成されます。
「」パイソン
deftrust_setup(length=default_length):
s=rand_int(n)
s_powers=[si%n for i inrange(length)]
return[j*G1for j ins_powers],s*G2
「」
実際には、CRSはイーサリアムKZG-Ceremonyリポジトリを使用し、複数の参加者からの貢献を組み合わせて取得できます。

フェーズ2:コミット

このフェーズでは、データはラグランジュ補間を使用して多項式にエンコードされます。コミットメントは、多項式係数とCRS要素を乗算することによって作成されます。
「」パイソン
defencode_as_polynomial(データ、長さ=デフォルトの長さ):
チャンクサイズ=31
data=__format_data(データ,長さ*チャンクサイズ)
ポイント=[(i,int(hexlify(data[i*chunk_size:(i+1)*chunk_size]).decode(),16))for i inrange(length)]
多項式=lagrange_polynomial(点)
戻り点、多項式
defcommit(多項式、setup_g1):
assertlen(多項式)==len(setup_g1),“多項式が大きすぎます”
returnsum([coef*coefのg1、zipのg1(多項式、setup_g1)])
「」
コミットメントは単一の楕円曲線グループ要素であるため、コンパクトかつ効率的になります。

フェーズ3:オープン/プルーフ

証明者は、特定の点\(z\)が値\(f(z)\)に評価されるという証明を生成します。これには、商多項式\(h(x)\)の計算が含まれます。
「」パイソン
def証明(多項式、点、setup_g1):
assertlen(多項式)-1<=len(setup_g1)、「多項式が大きすぎます」
px_minus_y=[((n-1)*点[1]+多項式[0])%n]+多項式[1:]
qx,剰余=多項式除算(px_minus_y,(n-1)*point[0])
剰余==0をアサート、「多項式上にない点」
returnsum([coef*coefのg1、zipのg1(qx,setup_g1[:len(qx)])])
「」

フェーズ4:検証

検証者は双線形ペアリングを使用して証明をチェックし、コミットメントが評価点と一致することを確認します。
「」パイソン
defverify(コミットメント、証明、ポイント、s_g2):
s_minus_x=(n-点[0])*G2+s_g2
結果=ate_pairing(証明,s_minus_x)
c_minus_y=(n-ポイント[1])*G1+コミットメント
戻り結果==ate_pairing(c_minus_y,G2)
「」

実装のテスト

PythonでKZGコミットメントスキームをテストする完全な例を次に示します。
「」パイソン
kzgをインポートする
多項式インポートから、evaluate_polynomial
name==’main‘の場合:
print(”信頼できるセットアップ!!“)
setup_g1、s_g2=kzg.trusted_setup()
print(”Setup_g1==>“,setup_g1)
print(”データコミットメント!!“)
data=b’\xff’*460#ランダムデータ!!
ポイント、ポリ=kzg.encode_as_polynomial(data)
C=kzg.commit(poly,setup_g1)
print(”コミットメント==>“,C)
print(”オープン/プルーフ”)
point=(1,評価多項式(ポリ,1))
ポイント[1][0]==ポイント[0]をアサート、「xsは等しい必要があります」
ポイント[1][1]==ポイント[1]をアサート、「ysは等しい必要があります」
pi=kzg.proof(ポリ,ポイント,setup_g1)
print(”点(Z)==>“,点)
print(”証明==>“,pi)
print(”検証”)
assert kzg.verify(C,pi,point,s_g2),“テスト失敗:有効な証明が拒否されました”
間違った点=(点[1],点[0])
assert notkzg.verify(C,pi,worst_point,s_g2),“テスト失敗:無効な証拠をキャッチできませんでした”
print(”成功!“)
「」

期待される出力

「」
信頼できるセットアップ!!
Setup_g1==>[JacobianPoint(x=Fq(0x17f1d..2c6bb),y=Fq(0x8b3f4..5e7e1),z=Fq(0x1),i=False),…]
データコミットメント!!
コミットメント==>JacobianPoint(x=Fq(0xc8203..6dbf7),y=Fq(0x9930a..4fa66),z=Fq(0xf59d6..fc838),i=False)
オープン/プルーフ
点(Z)==>(1、452312848583266388373324160190187140051835877600158453279131187530910662655)
証明==>JacobianPoint(x=Fq(0x604d9..4017f),y=Fq(0x522d1..f2a98),z=Fq(0x169ac..b6036),i=False)
確認する
成功!
「」
KZGコミットメントに関するこの包括的なガイドは、多項式コミットメントの確かな理解と実践的な実装を提供することを目的としています。さらに詳しく知りたい場合は、関連するzk-Rollup記事をチェックし、DankShardingとProto Dank Shardingについて詳しく調べてください。

  • KZGコミットメント:多項式をコミットし、多項式を明かさずに値を証明する暗号化手法。
  • フェーズ:信頼できるセットアップ、コミット、オープン/プルーフ、検証。
  • Pythonコード:実際の例を使用して各フェーズを示します。