MSTR Cat

ブロックチェーン/レベル IV · プロトコルを深く知る/4.1 Script/レッスン 2

標準スクリプト:P2PKHとP2SH

コインを鍵に、さらに任意のスクリプトのハッシュにロックする

用意するものブロックエクスプローラーのインターフェース(例:Blockstream.infoやmempool.space)SHA-256およびRIPEMD-160ハッシュツール16進数参照表生のトランザクションの16進データを表示できるブロックエクスプローラー

問い

  1. なぜビットコインは鍵自体ではなくハッシュにコインをロックするのでしょうか?
  2. 4行のスクリプトは、1回の実行でどのように所有権と承認の両方を確認するのでしょうか?
  3. なぜP2PKHが、このネットワークの歴史において8年以上もデフォルトのアドレス形式であり続けたのでしょうか?

探究

    パート Iペイ・トゥ・パブリックキー・ハッシュ(P2PKH)

  1. ジェネシスブロックには、Pay-to-Public-Key(P2PK)アウトプットしか含まれていませんでした。これらのスクリプトは、完全な公開鍵(2009年当時は65バイトの非圧縮鍵)をアウトプットに直接置くため、支出前から公開鍵が見えており、アウトプットのサイズも大きくなっていました。P2PKHも2009年の最初のソフトウェアから存在し、通常のアドレス宛ての支払いに使われていましたが、こちらは代わりに20バイトのハッシュを格納し、コインが使われるまで鍵を隠します。
  2. ロッキングスクリプトは`OP_DUP OP_HASH160 <hash> OP_EQUALVERIFY OP_CHECKSIG`です。実行は、支出者のデータがスタックに置かれた状態から始まります。下に署名、その上に公開鍵です。エンジンは鍵を複製し、RIPEMD-160(SHA256(key))でハッシュ化して、その結果を保存されているハッシュと比較します。一致すれば`OP_EQUALVERIFY`を通過し、一致しなければ実行は即座に停止します。
  3. ハッシュのチェックに成功すると、`OP_CHECKSIG`が、公開された公開鍵とトランザクションデータに対してECDSA署名を検証します。この二重の仕組みにより、対応する秘密鍵の保有者だけが資金のロックを解除できます。アウトプットスクリプトは合計25バイトで、このコンパクトな構造が「1」で始まるレガシーアドレスの基礎となりました。
  4. ビットコインの歴史の大半において、P2PKHは通常の支払いで最も一般的なアウトプットタイプでした。2017年8月にブロック481,824でSegWitが有効化された後も、ネイティブSegWitの普及が緩やかだったため、何年もその状態が続きました。その成功の理由はシンプルさと互換性にあり、元のプロトコルルール以外にコンセンサスのアップグレードを一切必要としませんでした。どのノードも複雑な状態管理なしにこれらのスクリプトを独立して検証できたため、ビットコイン初期の成長期において、汎用的な送金に最も堅牢なアウトプットタイプとなりました。
  5. このアドレス形式はBase58Checkエンコーディングを使用しており、タイプミスを検出するための4バイトのチェックサムが含まれています。1文字でも打ち間違えればほぼ確実にチェックサムが一致せず、ウォレットはそのアドレスを拒否します。この冗長性により、P2PKHは技術的には複雑でありながら使いやすいものとなり、暗号学的な安全性と人間にとっての使いやすさの橋渡しをしました。
  6. ブロックエクスプローラーを開き、「1」で始まるアドレスを参照する入力を持つトランザクションを探してください。`scriptSig`フィールドを確認すると、署名に続いて公開鍵の16進文字列が含まれています。この公開鍵を、参照先アウトプットの`scriptPubKey`にある20バイトのハッシュと比較してください。その鍵にSHA-256、続いてRIPEMD-160を適用すると、保存されているハッシュが再現され、両者のつながりが確認できます。
  7. パート IIペイ・トゥ・スクリプト・ハッシュ(P2SH)

  8. 2012年以前は、5-of-5のマルチシグのような複雑なスクリプトを使うには、ロッキングコード全体をアウトプットに直接置く必要がありました。そのためアウトプットが大きくなり、その分の手数料は送信者が支払っていました。また、すべての参加者の公開鍵と具体的な署名要件が、チェーンを監視している誰にでも見えていました。送信者は送金前に送金先の正確な構造を知っておく必要があり、柔軟なセキュリティ設定を必要とする企業の財務部門や取引所にとって障害となっていました。
  9. これを解決するため、ギャビン・アンドリーセンは2012年の初めにBIP16を提案しました。これにより、アウトプットにはスクリプトそのものではなく、そのスクリプトのHASH160ダイジェストだけを含めればよくなりました。アウトプットスクリプトは23バイトに縮小し、P2PKHの25バイトよりわずかに小さくなりました。送信者はもはや支出条件を知る必要がなく、単にハッシュ宛てに支払うだけでよくなったのです。複雑さはすべて、コインを支出する側へと移りました。
  10. 2012年4月のBIP16の有効化は論争を呼びました。ルーク・ダッシュジュニアは、異なるオペコードとエンコーディング方式を用いた代替案BIP17を提案しました。どちらの提案を採用するかをめぐって、開発者コミュニティ内の議論は大きく白熱しました。BIP16はマイナーが支持をシグナルしたことを受けて2012年4月に有効化され、複雑なスクリプトをラップする標準的な方法となりました。
  11. ペイ・トゥ・スクリプト・ハッシュのアウトプットを使用するには、2段階のプロセスを経ます。まず、支出者が完全なリディームスクリプトをスタックにプッシュします。ノードは、そのスクリプトのHASH160がアウトプット内のハッシュと一致するかをチェックします。一致しなければ、実行は即座に失敗します。一致すれば、ノードは公開されたリディームスクリプトをスタック上の残りのデータとともに実行し、実際の支出条件を検証します。
  12. この設計には危うい落とし穴があります。オンチェーンにあるのはハッシュだけなので、支払い前にリディームスクリプトを確認することは誰にもできません。受取人のソフトウェアが誤ったスクリプトを作成した場合や、スクリプトを紛失した場合、そのアドレスに支払われたコインは永久に使用できなくなる可能性があります。
  13. 2017年8月にSegWitが有効化された際、P2SHは互換性のための橋渡し役を果たしました。ユーザーは新しいウィットネススクリプトをP2SHという封筒の中にラップし、「3」で始まる「ネスト」アドレスを作ることができました。新しいbech32アドレスに対応していない古いウォレットでもSegWitユーザーに送金でき、SegWit対応の受取人は支出時に手数料の割引を受けられました。現在では効率面からネイティブSegWitが好まれていますが、P2SHは複雑なコントラクトやレガシー互換性のための重要な仕組みであり続けています。

重要な事実

  • P2PKH出力では、公開鍵全体の代わりにその公開鍵の20バイトのHASH160が格納されます。
  • ロッキングスクリプト`OP_DUP OP_HASH160 <hash> OP_EQUALVERIFY OP_CHECKSIG`の長さはちょうど25バイトです。
  • 支出するには、有効なECDSA署名と、保存されているハッシュに一致する公開鍵の両方を公開する必要があります。
  • レガシーP2PKHアドレスは「1」で始まり、チェックサムを含むBase58Checkエンコーディングが使用されます。
  • SegWitの前後を問わず、長年にわたり通常の支払いにおいて最も一般的な出力タイプはP2PKHでした。
  • `OP_EQUALVERIFY`がハッシュ化された鍵と保存されているハッシュの不一致を検出すると、実行は即座に失敗します。
  • BIP16はギャビン・アンドリーセンによって提案され、2012年4月に有効化されました。
  • P2SHのアウトプットスクリプトにはリディームスクリプトのHASH160だけが格納されており、長さは23バイトです。
  • 2012年1月から3月にかけての激しい議論の中で、ルーク・ダッシュジュニアのBIP17はBIP16と競合しました。
  • リディームスクリプトは、コンセンサスルールにより、1回でプッシュできる要素の最大サイズである520バイトに制限されています。
  • P2SHアドレスはBase58Checkエンコーディングを使用し、常に数字の「3」で始まります。
  • ネストされたSegWit(通常はP2SH-P2WPKH)により、2017年以降、古いウォレットからもSegWitユーザーに支払えるようになりました。

演習 九・六・三・一

9集めるビットコインのブロックチェーン上で、P2PKHアドレスから支出している実際のトランザクション入力を9件特定してください。それぞれのブロック高、scriptSigで公開されている公開鍵、アウトプット内の対応するハッシュを記録してください。
6まとめる9つを時代別に6つのグループに分けてください:2009-2011、2012-2013、2014-2015、2016-2017、2018-2021、2022以降。圧縮鍵か非圧縮鍵かも記録してください。
3絞り込むこれらのグループを、2017年以降により効率的なアウトプットタイプが利用可能になったにもかかわらず、P2PKHが主流であり続けた3つの明確な理由に絞り込んでください。
1結晶化する署名検証が行われる前に、`OP_EQUALVERIFY`が公開鍵をどのように拘束力のあるコミットメントに変えるのかを、1文で説明してください。

事実確認

日付、数字、主張は、下記に記載された公表資料と照合して確認しました。

インタラクティブ版で開く →

EN PT ES ZH KO RU DE FR MS