コインチェーン

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

KZGコミットメント KZG Commitmentとは? | 徹底解説

  • ホーム
  • KZGコミットメント KZG Commitmentとは? | 徹底解説
KZGコミットメント KZG Commitmentとは? | 徹底解説

KZG(Kate-Zaverucha-Groth)多項式コミットメントスキームは、ゼロ知識プロトコル、特にデータ自体を明らかにすることなくデータの完全性を証明する場合に極めて重要です。この詳細な解説では、KZGコミットメントの専門性と実装について詳しく説明し、完全な理解と実践的な例を提供します。

KZGコミットメントの概要

KZGコミットメントを使用すると、証明者は多項式にコミットし、後で特定の点で多項式の評価を証明することができ、多項式を公開することなくデータの整合性を確保できます。これは、ゼロナレッジロールアップやその他のプライバシー重視のアプリケーションでは非常に重要です。

主要な概念
  1. 多項式のコミットメント:多項式にコミットし、後でそれに関するプロパティを証明できるようにします。
  2. TrustedSetup:コミットメントに使用される共通の参照文字列を生成する重要なフェーズ。
  3. ラグランジュ補間:データを多項式形式にエンコードする方法。
  4. 楕円曲線ペアリング:証明を検証するために使用されます。

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

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

信頼できるセットアップフェーズでは、マルチパーティ計算(MPC)プロトコルを使用して共通参照文字列(CRS)が生成されます。CRSは、単一の当事者が結果に影響を与えることができないことを保証し、ランダム性を保証します。
「」パイソン
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は、複数の参加者が関与するEthereumKZG-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:オープン/プルーフ

証明を生成するために、証明者は特定の点での多項式の評価を計算し、商多項式を生成します。
「」パイソン
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)
「」

完全な実装例

KZGコミットメントスキームをテストするための完全なPythonの例を次に示します。
「」パイソン
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コミットメントはゼロ知識プロトコルの基礎であり、効率的でコンパクトな証明メカニズムを提供します。このガイドでは、KZGコミットメントを効果的に理解して実装するのに役立つ詳細なチュートリアルと実践的なコード例を提供します。さらに詳しく調べるには、zk-Rollupsや、DankShardingやProto Dank Shardingなどの今後のイノベーションについて読むことを検討してください。

  • KZGコミットメント:多項式を明らかにすることなく、多項式の評価をコミットして証明する方法。
  • フェーズ:信頼できるセットアップ、コミット、オープン/プルーフ、検証。
  • Pythonコード:各フェーズを示す実践的な例。