コインチェーン

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

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

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

KZGは、ゼロ知識プロトコルで広く使用されている著名な多項式コミットメントスキームです。主な概念には、証明者が多項式をコミットし、後で多項式自体を明らかにすることなくその値を検証者に証明することが含まれます。この記事では、理解を促進するための説明とPythonコードスニペットを含む、KZGの包括的な段階的な実装について説明します。

多項式のコミットメントを理解する

多項式コミットメントでは、証明者は多項式にコミットし、後でその係数を明かさずに多項式に関する特定の特性を証明できます。これは、メンバーシップの証明を生成するためにマークルツリーを使用するのと似ていますが、多項式コミットメントを使用すると、より効率的な証明サイズと検証時間が得られます。

KZGコミットメントスキーム

KZGコミットメントスキームは、作成者のKate、Zaverucha、およびGrothにちなんで名付けられ、TrustedSetup、Commit、Open、およびVerifyの4つの主要なフェーズで構成されます。各フェーズの詳細は次のとおりです。

PCS信頼できるセットアップ

Powers of Tau Ceremony(PCS)Trusted Setupは、KZGコミットメントスキームで使用されるパラメーターが生成される最初のフェーズです。この設定には、複数の参加者がランダムな値を生成し、マルチパーティ計算(MPC)プロトコルを通じてその貢献を組み合わせることが含まれます。これにより、シークレットのランダム性が保証され、共通参照文字列(SRS)が確立されます。
Pythonでは、信頼できるセットアップは次のように図示されます。
「」パイソン
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
「」
ここで、「G1」と「G2」は楕円曲線生成値です。実際の信頼できるセットアップは、EthereumKZG-Ceremonyリポジトリを使用して実行できます。

コミットフェーズ

コミットフェーズでは、データはラグランジュ補間を使用して多項式形式にエンコードされます。これにより、データが、特定の次数の多項式を通過するように一意に決定できる点に変換されます。
「」パイソン
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([i1*i2fori1,i2inzip(polynomial,setup_g1)])
「」
コミットメントは次のように表されます。
[f[s]=\sum(a_is^i)]
ここで、\(a_i\)はラグランジュ補間からのデータ点であり、\(s^i\)はSRSからのデータ点です。

オープンフェーズ

このフェーズでは、検証者はランダムな点\(z\)を選択し、それを証明者に送信します。証明者は\(f[z]\)と\(h(s)\)を次のように計算します。
[h(x)=\frac{f(x)-f(z)}{x-z}]
「」パイソン
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([i1*i2fori1,i2inzip(qx,setup_g1[:len(qx)])])
「」

フェーズの検証

検証者は、楕円ペアリング関数を使用して証明を確認する必要があります。
「」パイソン
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)
「」
この検証により、商\(q(s)\)と\((s-a)\)の積が\(f(s)-y\)に等しいことが確認されます。

完全なコード例

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をインポートする
多項式インポートから、evaluate_polynomial
name==’main‘の場合:
print(”信頼できるセットアップ!!“)
setup_g1、s_g2=kzg.trusted_setup()
print(”Setup_g1==>“,setup_g1)
print(”データコミットメント!!“)
data=b’\xff’*460#ランダムデータ1!!
data111=b’\xf0’*460#ランダムデータ2!!
ポイント、ポリ=kzg.encode_as_polynomial(data)
Points111、poly111=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(poly111,point,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(”成功!“)
「」
このシナリオは、KZGコミットメントスキームの堅牢性を示しており、データを変更すると証明が無効になり、それによってデータの整合性が確保されることを強調しています。

次のステップ

KZGを理解したら、次の論理的なステップは、eip4844/DankシャーディングとProto Dankシャーディングを検討することです。さらに詳しく知りたい場合は、zk-Rollupの記事を読むことをお勧めします。

参考文献

1.チャットGPT
コメントでお気軽にご質問ください。できる限りお答えいたします。

  • 多項式コミットメント:多項式自体を公開せずに、多項式にコミットしてその値を証明できるようにします。
  • KZGコミットメントスキーム:信頼できるセットアップ、コミット、オープン、検証の各フェーズが含まれます。
  • 堅牢性:証明の完全性を検証するためにさまざまなデータシナリオを試みることによって実証されます。