用語集 / トランザクションと手数料
SIGHASH_NONE
- SIGHASH_NONEとは?
- SIGHASH_NONEは、トランザクションのインプットに署名しつつ、そのアウトプットのいずれにもコミットしないフラグであり、これにより資金の行き先は、それを扱う誰にとっても開かれたままになります。
白紙の小切手のようなものだと考えてください。SIGHASH_NONEのインプットは支払いを承認しながら、誰が支払いを受けるかについては何も述べません。そのため、マイナーや中継するノードは、トランザクションが承認される前にすべてのアウトプットを書き換えることができます。その値は2であり、一般消費者向けのウォレットはこれを提供しておらず、もし自分のトランザクションでこれを見かけたら、何かがうまくいっていないということです。
仕組み
このダイジェストを構築するということは、ハッシュを計算する前にアウトプットのリストを完全に取り除くことを意味します。
残るものは依然としてかなりの量です。トランザクションのバージョン、署名するインプットのアウトポイント、そのインプット自身のシーケンス番号、そのインプットが使用するスクリプト、そしてロックタイムです。他のすべてのインプットのシーケンス番号はゼロにされます。これは2つ目の自由度であり、この署名がすでに存在する状態で、共同署名者が自身の相対ロックタイムを調整できるようになるからです。
残らないものこそが要点そのものです。アウトプットにまったくコミットしないため、この署名は、このコインがこのバージョンのトランザクションにおいて、この時刻以降に使用されてよいということだけを述べています。作りかけのトランザクションを手にした者は、価値がどこへ向かうかを選べます。これには、ネットワーク上でそれを見る誰もが含まれます。なぜなら、未承認のトランザクションはブロードキャストされた瞬間から公開されるからです。
ANYONECANPAY修飾子を加えると、このバイトは0x82になり、ビットコインが生成できる最も弱い署名となります。これは1つのインプットを対象とし、それ以外の何も対象としません。
このフラグは2009年1月の最初のリリースから存在しており、これまで削除されたことはありません。削除すれば、誰もその結果を考えないうちにロックされたコインが使えなくなるからです。BIP143とBIP341はどちらも、segwitとTaprootのためにこれをひそかに捨てるのではなく、忠実に再実装しました。
どこで見かけるか
SIGHASH_NONEはほとんどどこにも現れません。これはまさに予想されるとおりです。
理論上の用途は、一方の当事者が資金を拠出し、相手方が行き先を選ぶというプロトコルであり、その相手方は署名の外にある何かによって拘束されます。広く使われているビットコインのアプリケーションで、そのように動作するものはありません。柔軟なインプットを必要とする構築は代わりにANYONECANPAYを用い、柔軟なアウトプットを必要とする構築は、可能な行き先が事前に固定された事前署名済みの代替手段を用います。
したがって、実際に流通しているSIGHASH_NONEの署名は、バグか、進行中の窃盗です。mempoolは、使用可能な異常を探すbotによって継続的に監視されており、これを含むトランザクションが長く気づかれずに留まることはありません。署名コードを書く者は、このフラグを決して渡さない整数として扱うべきであり、カストディシステムを監査する者は、このフラグが呼び出し元が指定するパラメーターではなく定数であることを確認すべきです。
ビットコインを購入して保有する人にとっての要点は短いものです。これに遭遇することはなく、ウォレットがこれを提供することもなく、これで署名するよう求めてくるソフトウェアは、離れるべきソフトウェアです。
SIGHASH_NONE vs SIGHASH_SINGLE
SIGHASH_NONEはゼロ個のアウトプットにコミットします。SIGHASH_SINGLEはちょうど1個、すなわち署名するインプットと同じインデックスにあるアウトプットにコミットします。このコミットされる1個のアウトプットが、署名の性格を完全に変えます。SIGHASH_SINGLEでは、署名者は自身の受け取りを保証しつつ、トランザクションの残りを開いたままにでき、これはスワップやマーケットプレイスに使える構成要素となります。SIGHASH_NONEは署名者に何も保証しません。だからこそ、一方には実際の用途があり、他方は主にインシデント報告の中に現れるのです。