ゼロ知識証明によるビットコインの条件付き支払い
ゼロ知識証明は昨今のブロックチェーンのバズワードとなっており、興味を持つ方も多いと思います。イーサリアムではZK-SNARKなどゼロ知識証明を使ったアプリケーションの開発が進んでいます。ビットコインでもゼロ知識証明を活用したアプリケーションの提案も少しずつ出てきています(OP_ZKPやValidity rollups)。イーサリアムにはゼロ知識証明の検証をするためのプレコンパイルされたコントラクトが導入されています(EIP196, EIP197)が、ビットコインにはこのようなOPコードは存在しないので、ソフトフォークによる導入が必要になってきます。しかし、ビットコインでもゼロ知識証明をブロックチェーン外で行うことで、任意のプログラムを実行させて、その結果に対して支払をすることができます。今回紹介するのはゼロ知識証明による条件付き支払い(Zero-Knowledge Contingent Payment, ZKCP)で、これはGMaxwellによって2011年に提案され2016年に実際にビットコイン上で証明されました。なんと10年以上前からビットコイン上でのゼロ知識証明の活用が提案されていたのです。このZKCPの引用元は以下になります。https://en.bitcoin.it/wiki/Zero_Knowledge_Contingent_Payment
以下の図は数読パズルの正解をBuyerがSellerから購入するというシナリオになっています。本例ではトラストセットアップのZKSNARKを使っていますが、Buyerがゼロ知識証明の検証をするため、自身でそのセットアップをすることに問題はありません。
- Buyerは数読パズルの正解が正しいかを判定する数読チェッカーを作成し、トラストセットアップをします。
- Sellerは数読パズルの正解Xを見つけ、ランダムな値Kを選び、KでXを暗号化してExを得ます。そして下図のProgram(K, Ex, H())をプルーフへ変換してBuyerへ送付します。
- Buyerはプルーフを検証して問題なければ、下図のP2SHアドレスへ支払いをします。このアドレスは、Sellerが数読パズルの正解Xを公開することでSellerは支払いを回収できると同時にBuyerは正解Xを復号するためのKを得ることができる、ようなアトミックスワップに使われるスクリプトと同類のものです。
- SellerはKを公開することで支払を回収し、BuyerはKからXを復号し数読パズルの正解を得ることができます。
以上、ゼロ知識証明によるビットコインの条件付き支払いについてでした。