用語集 / アドレスと鍵
P2SHアドレス
別名はPay-to-Script-Hash、P2SH出力です。
- P2SHアドレスとは?
- P2SHアドレスは3で始まり、redeem scriptのハッシュにコミットするため、誰かがスクリプトを開示するまで支払い条件は秘密のままです。
BIP-16で規定されています。
Pay to script hashはBIP-16で導入され、2012年4月1日のブロック173,805から適用されたもので、複雑さのコストを誰が負担するかを変えました。それ以前は、送金者が契約の全体を出力に書き込む必要がありました。それ以降は、送金者が23バイトを書き込み、受取人が後でスクリプトを開示するコストを負担します。そのため3で始まるアドレスは、5つの鍵を使うボールトも、鍵を1つだけ使う通常のウォレットも隠すことができます。
仕組み
出力スクリプトは短く、どのP2SHアドレスでも同一です。OP_HASH160に続いて20バイトのハッシュ、そしてOP_EQUALで、合計23バイトです。ハッシュは、受取人だけが知るredeem scriptにコミットします。
支払いは2段階で行われます。scriptSigがredeem scriptに必要な引数を供給し、最後の要素としてシリアライズされたredeem script自体を供給します。ノードはその最後の要素をハッシュ化し、コミットされた値と照合します。一致すれば、スクリプトをデシリアライズし、スタックに残っているすべての要素に対して実行します。どちらの段階も成功しなければなりません。
2つの制限が、何が収まるかを決めます。redeem scriptは1つのスタック要素であるため、Bitcoin CoreがMAX_SCRIPT_ELEMENT_SIZEとして定義する520バイトのプッシュ上限を超えることはできません。リレーポリシーは、P2SH入力あたり15回の署名操作という第2の上限を追加します。両者を合わせると、一般にスクリプト言語が許す範囲(上限は10,000バイトのスクリプトです)を大きく下回る構成に制限されます。
アドレス自体は、バージョンバイト0x05のBase58Checkであり、先頭の3と34文字の文字列を生成します。BIP-13がこの形式を定義したもので、BIP-16のコンセンサスルールとは別です。
どこで見られるか
「native」と書かずにオプションを「SegWit」と説明する取引所の出金フォームは、通常3アドレスを意味します。2018年より前に構築されたマルチシグのボールトはこれを使います。スクリプトを必要としながら、通常のウォレットが支払えるアドレスを求めるアトミックスワップやハッシュタイムロック契約も同様です。
この設計の結果は曖昧さであり、それは完全なものです。未使用の3出力はハッシュしか明かさないため、ブロックエクスプローラーは、それがラップされた単一鍵なのか企業の定足数なのかを判断できず、送金者も判断できません。情報は支払いトランザクションでのみ現れます。
この曖昧さには実際の損失モードがあります。P2SH出力からコインを復元するには、秘密鍵だけでなくredeem scriptが必要です。シードフレーズだけでは任意のスクリプトを再構築できないため、標準的なウォレットの導出よりも複雑なP2SHの構成は、ディスクリプタとして、またはスクリプトのバイト列そのものとしてバックアップする必要があります。すべての鍵を持ちながらスクリプトを持たないためにコインを失った人々がいます。
P2SHアドレスvs P2SHマルチシグ
P2SHマルチシグはP2SHアドレスの中に入れられるものの1つであり、形式の同義語ではありません。アドレスは容器であり、その中に隠れているredeem scriptは、m-of-nマルチシグ、ネストされたSegWitの鍵ハッシュ、タイムロック付きのリカバリー条項、あるいは誰も書いたことのないスクリプトかもしれません。3アドレスを「マルチシグアドレス」と読むのはしばしば外れる推測です。ネストされたSegWitにより、2017年以降数年間、3が単一鍵の既定形式となり、数百万の通常のウォレットがそのプレフィックスの背後に残ったからです。