Develop with pleasure!

福岡でCloudとかBlockchainとか。

マルチシグ検証の際のmalleabilityを解消するNULLDUMMYルール(BIP-147)

Segwitと一緒にデプロイされるBIP-147を見てみる。

bips/bip-0147.mediawiki at master · bitcoin/bips · GitHub

このBIPでは、OP_CHECKMULTISIGOP_CHECKMULTISIGVERIFYで使われる余計なスタック要素を使ったmalleabilityを解消するため、Bitcoinトランザクションの検証ルールの変更を提案している。

動機

署名を使ったmalleabilityは、作られた署名のベースとなる秘密鍵へアクセスすることなく、ネットワーク上の任意の中継ノードがトランザクションの署名の改変をする能力によるものである。Segwitによる署名が分離されていないトランザクションでは、このmalleabilityを利用してtxidを変更し、任意の未承認の子トランザクションが無効にすることができる。BIP-141のSegregated Witnessにより第三者によるtxidの変更はできなくなるが、分離された署名を含むwtxidを変更することで、BIP-152のCompact Blockを使った中継の効率を低下させることができる。

OP_CHECKMULTISIGOP_CHECKMULTISIGVERIFYにおける設計上の欠陥は、署名検証の後に余分なスタック要素("ダミー要素")を使用することにある。このダミー要素は特に検証されないので任意の値に置き換えることができる。このドキュメントではこの署名のmalleabilityを解消するための新しいルールを提案する。

仕様

ダミー要素を利用したmalleabilityを解消するため、新しいコンセンサスルールNULLDUMMYを追加する。このルールはダミー要素は必ず空のバイト配列でないといけないというもの。空のバイト配列以外の場合、スクリプトはすぐにfalseと判定する。NULLDUMMYのルールは、BIP-141で説明されているpre-segregatedスクリプトとpay-to-witness-script-hashのスクリプト内のOP_CHECKMULTISIGOP_CHECKMULTISIGVERIFYに適用される。

デプロイメント

このBIPはBIP-9のversion bitを使ってデプロイされる。その際使われるデプロイのパラメータはBIP-141、BIP-143と同じ"segwit"で、使用するbitは1。

mainnetでは、starttimeは2016年11月15日の深夜(Epociタイムは1479168000)でtimeoutは1年後。

testnetでは、starttimeは2016年05月01日の深夜(Epociタイムは1462060800)でtimeoutは1年後。

互換性

参照クライアントは最初から互換性のある署名を生成しており、NULLDUMMYルールは v0.10.0以降の参照クライアントの中継ポリシーとして施行された。そのため2015年8月以降、要件に違反するトランザクションはチェーンに追加されていない。

実際に使われている全てのscriptPubkeyタイプについて、非準拠の署名もちょっとした変換で準拠したものになるため、この要件によって機能が失われることは無い。特殊なスクリプトを設計する際は、ユーザはこの新しいルールに注意をはらう必要がある。

実装

参照クライアントの実装は以下のプルリクを参照。

github.com

謝辞

Peter ToddがNULLDUMMYの原作者で、この文書はPieter WuilleによってBIP-62から抽出された。

参考

techmedia-think.hatenablog.com

techmedia-think.hatenablog.com

Bitcoin Core自体は以前から対応してたみたいなので、特に新要素という感じでは無いかなー。