用語集 / プロトコルとアップグレード
SIGHASH_ANYPREVOUT
別名はAPOです。
- SIGHASH_ANYPREVOUTとは?
- SIGHASH_ANYPREVOUTは、Taprootスクリプト向けに提案されている署名モードで、1つの署名で、それが作られた単一のコインではなく、一致するスクリプトにロックされた任意のコインを使用できるようにします。
BIP-118で規定されています。
BIP-118は、通常の鍵に追加するフラグではなく、0x01で始まる33バイトの、tapscript向けの新しい公開鍵タイプを定義しています。2017年2月に割り当てられましたが、これまで一度も有効化されておらず、機能するのはスクリプトパスの使用のみで、キーパスの使用では決して機能しません。ウォレット側でこの方式の署名ができるものはないため、メインネットでのeltooチャネルを約束する製品は、将来の話をしているにすぎません。
仕組み
状態: BIP-118はDraft(草案)で、2017-02-28に割り当てられ、BIP-340、BIP-341、BIP-342を必要とし、自身のDeploymentセクションはTODOと書かれています。何も有効になっていないため、置き換えられたものはありません。
Taprootの署名は、使用するコインのoutpointにコミットします。BIP-118が変更するANYONECANPAYダイジェストでは、txidとインデックスの36バイトで、これにより署名は1つのコインに永久に固定されます。署名するメッセージからoutpointを取り除くと、署名はコインを名指しするのをやめて形を名指しするようになり、その形の任意のUTXOを後から署名に結び付けられるようになります。BIPはこれをdynamic rebinding(動的な再結合)と呼んでいます。
2つのバリアントが定義されており、その違いは、何に依然としてコミットするかという点にあります。
- SIGHASH_ANYPREVOUTは、ビット値0x40で、outpointを省きますが、入力の金額(8バイト)、そのscriptPubKey(ここでは常に35バイト)、およびtapleafハッシュは保持します。そのため署名は、同じスクリプトの下で同じ金額を持つ任意のコインに適合します。
- SIGHASH_ANYPREVOUTANYSCRIPTは、ビット値0xc0で、金額、scriptPubKey、tapleafハッシュも省きます。その鍵が満たせるスクリプトを持つ任意のコインに適合します。
この方式の選択は、署名の時点ではなくアドレスの作成時に行われます。これらの鍵はtapscriptのリーフを通じてのみ機能するため、アドレスはマークルツリーにそのようなリーフを持つ必要があり、使用されるまでは他のどのTaprootアドレスとも区別がつきません。1つの定数が両者を隔てます。key_versionは、BIP-118の鍵では0x01、通常のtapscriptの鍵では0x00であるため、1つの秘密鍵が両方の規則で有効な署名を作ることはできません。新たに6つのhash_typeバイトが有効になります。0x41、0x42、0x43、0xc1、0xc2、0xc3です。
どこで見られるか
SIGHASH_ANYPREVOUTはどのメインネットのトランザクションにも現れておらず、BIP-118は、たとえ存在するようになっても「only be rarely used in practice」(実際にはめったに使われない)と予想しています。スクリプトパスの使用はより重く、特定しやすいためです。
これが書かれたのはeltooというオフチェーンの更新スキームのためです。オフチェーンのプロトコルは、相手方が公開したどの古い状態にも応答する必要があり、通常の署名は応答する正確なトランザクションにコミットするため、現れる可能性のある状態ごとに新しい署名が必要になります。eltooは代わりにスクリプトとnLockTimeを使って署名を非対称にし、後の署名を持つトランザクションが前の署名を持つトランザクションを使用できるようにしますが、その逆はできません。これにより、1つの更新署名を、相手方が公開した任意の以前の更新の上に適用できます。
この名称はある訂正を記録しています。Joseph Poonは、元のLightningの論文がこのアイデアを提起した後、2016年2月にSIGHASH_NOINPUTとして提案し、改名は、入力が実際には無視されていないことを示しています。nSequenceは常に署名され、SIGHASH_ANYPREVOUTではスクリプトと金額も署名されます。
BIPのセキュリティのセクションはその代償を挙げています。リプレイです。ANYPREVOUT署名は、同じスクリプトと同じ金額を持つ他の任意のUTXOに対して再利用でき、ANYPREVOUTANYSCRIPT署名は、スクリプトの1つでその鍵を再利用している任意のUTXOに対して再利用できます。そのため鍵の再利用は、プライバシー上の不快な問題から、資金を失う方法へと変わります。これらのトランザクションは第三者によって変更される展性もあります。一致する入力を用意できる者なら誰でも、秘密鍵なしでtxidを変更できます。
SIGHASH_ANYPREVOUT vs SIGHASH_ANYONECANPAY
SIGHASH_ANYONECANPAYは現在ネットワーク上に存在し、署名する入力を除くすべての入力を取り除きます。SIGHASH_ANYPREVOUTは、その残った入力の一部も取り除きます。BIP-118はそのダイジェストを、outpointを除いたANYONECANPAYダイジェストと表現しており、1行の違いが大きな結果を生みます。ANYONECANPAY署名はリプレイできません。名指しするoutpointは1度しか使用できないためです。そのコミットメントを放棄すると、リプレイからの保護は、署名ではなく、その上に構築されるプロトコルから来なければなりません。