用語集 / 開発者向けリファレンス
ウィットネススクリプト
- ウィットネススクリプトとは?
- ウィットネススクリプトはP2WSHアウトプットの実際の支払い条件を保持し、ウィットネス内を移動します。そこではそのバイトが通常の4分の1のコストで計量されます。
BIP-141で規定されています。
SegWitはスクリプトにトランザクション内の専用の領域を与え、bc1qのヴォールトが使用される際にそこに置かれるのがウィットネススクリプトです。ウィットネス内のすべてのバイトは4ではなく1の重量単位として数えられ、2017年8月のブロック481,824で導入された75%の割引です。この割引が、マルチシグのカストディが高額でなくなる理由です。
仕組み
ウィットネススクリプトは、アウトプット内に置かれた単純なSHA-256ハッシュによってコミットされ、誰かが使用する日まで秘密のままです。使用する人は、条件が要求する引数でウィットネススタックを埋め、最後の項目としてシリアライズされたスクリプトを追加します。ノードはその項目をハッシュ化し、32バイトをコミットメントと照合し、検証したばかりの内容を実行します。
コンセンサスは、レガシーの使用と同じスクリプトの上限を適用します。スクリプト10,000バイト、実行命令201個です。リレーポリシーはさらに低く、3,600バイト、スタック上の項目は100個以下に抑えられるため、それより大きいものは通常のブロードキャストではなく、マイナーとの直接の取り決めが必要です。
この算術が動作を変えました。2-of-2スクリプトは71バイトです。33バイトの公開鍵の2つのプッシュ、2つのカウント用オペコード、検証用オペコードから成ります。ウィットネス内では、その71バイトは71重量単位、18仮想バイト未満のコストです。同じ71バイトを従来の方法で署名スクリプト内に持つと、284重量単位、すなわち71仮想バイトのコストになります。セキュリティは何も変わりません。変わったのは使用するための価格だけです。
使われる場面
ライトニングネットワークはウィットネススクリプト上で動作します。すべてのチャネルは2-of-2アウトプットに入金され、チャネル内のコミットメントトランザクションは、BOLT 3で規定された取消とハッシュロック支払い用の小さなスクリプトのライブラリから構築されます。つまり、そのほとんどはチェーンに到達することなく作成され、破棄されます。
署名ハードウェアはこれらを名前付きのフィールドとして扱います。PSBT形式はインプットとアウトプットの両方にウィットネススクリプトのスロットを定義しているため、コーディネーターは満たされる正確な条件を共同署名者に渡すことができ、デバイスはハッシュではなく、同意している内容をユーザーに表示できます。
ラップされた形でも見られます。出金画面を更新しなかった取引所で一般的な、ネストされたP2SH-P2WSHアドレスは、ウィットネスプログラムを指すことだけを役割とする34バイトのリディームスクリプトを保持し、実際の処理はその下のウィットネススクリプトが行います。
バックアップには鍵だけでなくスクリプトのバイトが必要です。シードのバックアップごとにアウトプット記述子を保存してください。誰も書き留めなかったウィットネススクリプトは、全署名済みのクォーラムを、誰も動かせないコインに変えてしまいます。
ウィットネススクリプトvs Tapscript
ウィットネススクリプトは全体が公開される単一のスクリプトです。tapscriptのリーフはツリーの1つのブランチであり、使用するブランチだけが公開されます。BIP-341では、アウトプットは多数のリーフに対するマークルルートにコミットするため、5つの別々のリカバリーパスを持つヴォールトは、使用時にそのうち1つだけを表示し、他の4つを永久に非公開に保ちます。tapscriptはまた、10,000バイトの上限を撤廃し、OP_CHECKMULTISIGを無効化してバッチ処理に適したOP_CHECKSIGADDを採用し、固定の命令数ではなく署名検証に対する重量予算を適用します。ウォレットがbc1qを書くなら、ウィットネススクリプトを使用しています。bc1pは代わりにTaprootの設計を意味します。