用語集 / トランザクションと手数料
トランザクション展性
別名はトランザクションの展性です。
- トランザクション展性とは?
- トランザクション展性とは、第三者がトランザクションに含まれる署名データを再エンコードすることで、送金先を変えずにそのトランザクションのIDを変更できた欠陥のことです。
BIP-66で規定されています。
支払いは依然として機能し、変わったのはその名前だけでした。ビットコインは2015年から2017年にかけて段階的にこの穴を塞ぎ、署名をウィットネスに保持するインプットについてはSegWitが仕上げを行いました。レガシーインプットは依然として展性を残しており、これはbc1アドレスでコインを保有すべきもう1つの理由です。
仕組み
トランザクションIDはトランザクションのバイト列のハッシュであるため、どのバイトを変更しても異なるIDが生成されます。そしてレガシーインプットでは、署名もそのバイト列の一部です。
何も壊さずに改変を可能にする、3種類の余裕がありました。
1つ目は算術です。ECDSA署名はrとsという2つの数値の組であり、有効なsには必ず、曲線の位数からsを引いた、同じく有効な第2の値が存在します。ネットワークを監視している者なら誰でもこれを反転でき、検証は依然として成功します。
2つ目はエンコードです。署名はDERで包まれていましたが、ビットコインが依存していたライブラリは、余分な先頭のゼロバイト、非正規の長さマーカー、注意深いエンコーダなら決して出力しないパディングといった、ずさんな変種を受け入れていました。それぞれの変種は異なるIDへとハッシュ化されました。
3つ目は署名を囲むアンロックスクリプトです。無害な余分な項目をスタックにプッシュしても、スクリプトの結果は同一のまま、シリアライズされたバイト列は異なるものになりました。
修正は一度に1つの層ずつ行われました。BIP66は2015年7月4日のブロック高363,725で厳格なDERエンコードをコンセンサスルールとしました。このアクティベーションは、複数の大手プールが検証していないヘッダーの上でブロックを構築し、その日の午後に6ブロックのフォークを生じたことで主に記憶されています。2015年10月にリリースされたBitcoin Core 0.11.1は、低いs値をリレーポリシーのルールとし、後にBIP146として文書化されました。残るすべての発生源を列挙して禁止しようとしたBIP62は、実行不可能として放棄され、今日に至るまでWithdrawnのステータスのままです。この問題を決着させたのはSegWitで、2017年8月24日のブロック高481,824で有効になりました。署名はウィットネスへ移され、IDはウィットネスなしで計算され、segwitインプットには改変できるものが何も残りません。
影響が現れる場面
展性が盗難を引き起こしたことはなく、引き起こしたのは会計上の失敗であり、それは今もリスクの形として変わりません。
ブロードキャストしたIDで出金を追跡していたカストディアンは、異なるIDを持つ確認済みのトランザクションを見せられ、自身の支払いが失敗したと判断してコインを再送する可能性がありました。このパターンは2014年に取引所で実際の損失を引き起こし、信頼できる運営者がIDだけでなく出力アドレスと金額で照合する理由となっています。
連鎖したトランザクションもまた犠牲になりました。未確認の親を消費する子は親をIDで指定するため、親が改変されると子は永久に使用できなくなります。資金提供のトランザクションがブロードキャストされる前に返金に署名するプロトコル、まさにライトニングチャネルの開設がそうですが、これはIDが安定するまで安全に構築できませんでした。
購入して保有する人にとっては、1つの習慣でそのすべてをカバーできます。未確認のIDは事実ではありません。レガシーインプットでは展性によって依然として変化し得ますし、今では無関係な理由で日常的に変化します。それはBitcoin Coreがデフォルトで完全なreplace-by-feeをリレーするためであり、手数料を引き上げた送信者は新しいIDを公開します。確認を待ってから、尋ねる人にはそのIDを伝えてください。
トランザクション展性vs二重支払い
展性はラベルを動かし、二重支払いは資金を動かします。改変されたトランザクションでは、同じコインが同じ金額で同じアドレスに届き、古いIDを記憶していたソフトウェアだけが何かが起きたことに気づきます。二重支払いでは、競合するトランザクションがそのコインを別の場所へ送り、一方のバージョンは無価値になります。この2つを混同すると、人々は確認済みの支払いを信用しなくなることを学んでしまい、それは誤った教訓です。確認済みのIDが展性を持ったことは決してありません。展性はトランザクションが未確認の状態にある間だけ当てはまったからです。