次期ソフトフォークTaproot
ビットコインの次期ソフトフォークの名前となっているTaprootについての備忘録です。Taprootソフトフォークでは以下のBIPが取り込まれる予定で、その中には今回のアップデートの目玉であるシュノア署名も含まれています。
上記のとおりTaprootソフトフォークでは複数の仕様が含まれているので、いくつかに分割しておさらいをしたいと思います。
Schnorr署名
シュノア署名は以前の記事で解説しているので詳細は割愛しますが、現在使われている楕円曲線DSA署名に替わり、このシュノア署名が導入されます。シュノア署名は署名の集約やバッチ検証、その他さまざまな恩恵を受けることができます。
MAST
MAST(Merklized Abstract Syntax Trees)は、マークル木を活用してコインの使用条件をハッシュ化し秘匿する技術です。ビットコインを送金するにはUTXOにロックされている使用条件を解除する必要があり、その解除方法が「署名」となります。通常のビットコイン送金であれば、この使用条件は「公開鍵に対応する署名」のみですが、例えば、1-of-2マルチシグアドレスのコインを送金をする場合、使用条件は「2つの公開鍵Aと公開鍵Bに対応するどちらかの署名」となります。もしこのマルチシグアドレスからコインを送金すると、ブロックチェーン上にはその使用条件が書き込まれます。例えば署名Aを使いコインを送金した場合でも、公開鍵Aと公開鍵Bの情報がブロックチェーン上に書き込まれます。これがプライバシーを損なうといわれている理由です。ここで、MASTという仕組みを使うと、公開鍵Bの情報を秘匿することが可能になります。さらに、実行されなかった使用条件は書き込まれないので(厳密にはハッシュ・集約化されている)、ブロックスペースを節約することが期待されています。今回のソフトフォークにこのMASTが含まれますが、この仕組みが単独で使われるわけではなく、次のTaprootと呼ばれる機能を構成する1つの要素として実装されます。
Taproot
今回のソフトフォークの名前ともなっているTaprootですが、Taproot自体にも歴とした機能があります。もともとビットコインのアドレスには、キー型(pay-to-pubkey)とスクリプト型(pay-to-scripthash)と呼ばれる2種類があります。上記のMASTでみた「公開鍵に対応する署名」がキー型でビットコインアドレスは1から始まります。一方、マルチシグアドレスはスクリプト型に属し、ビットコインアドレスは3から始まります。Segwitの場合は、両者ともbc1から始まり、キー型はbc1+39バイト文字列、スクリプト型はbc1+59バイト文字列となっています。
この2種類のアドレスタイプを1つに統合する仕組みがTaprootになります。それを数式で表したのが以下です。
Q=P+H(P,m)∗G
Pは公開鍵、mはMASTのルートハッシュです。この公開鍵Qが支払い先のビットコインアドレスとなり、これまで2種類あったアドレスタイプが1種類へ集約することができます。この公開鍵Qへ支払われたコインを使用するには、(1)公開鍵Qに対する署名を提供するか、(2)Pとmを公開してそのルートハッシュmに対するマークル証明を提供します。ビットコインアドレスは1種類となりますが、そのアドレスからコインを出金する時はキー型・スクリプト型のどちらのタイプで送金したかは分かってしまいます。
Tapscript
Taprootソフトフォークに含まれるBIP342では、Taprootのスクリプトを検証するルールについて定義されています。具体的には以下のようなルール変更です。
- OP_CHECKSIGとOP_CHECKSIGVERIFYの署名検証がECDSA署名からシュノア署名へ変更
- OP_CHECKMULTISIGとOP_CHECKMULTISIGVERIFYの無効
- OP_CHECKSIGADDの追加
- MINIMALIFの強制
- OP_SUCCESS系opcodeの追加
- タグ付きハッシュ
アクティベーション方法
Taprootソフトフォークのアクティベーション方法はまだ議論中です。
ソフトフォークは下位互換なので、Taprootソフトフォークがアクティベートされても、古いノードでの送受信は可能です。ただし古いノードはSegWit V1のトランザクションは正常に認識できず、「anyone-can-spend scripts」として認識します。
今回のソフトフォークが完了すると、レイヤー2のライトニングネットワークにも恩恵があります。現状のLNではHTLCと呼ばれるスマートコントラクトが活用されていますが、これにはいくつかの脆弱性があります。しかし、Taprootが導入されれば、シュノア署名を使ったペイメントポイント(PTLC)と呼ばれるコントラクトへ移行できるようになり、HTLCの脆弱性を回避できます。またこのPTLCを使うとスタックレスペイメントやエスクローペイメントなど様々なペイメントができると期待されています。