用語集 / 開発者向けリファレンス
Pubkey script
別名はscriptPubKey、Locking scriptです。
- Pubkey scriptとは?
- Pubkey scriptは、ビットコインの各トランザクション出力に付随する短いビットコインScriptの断片で、その出力のコインが再び移動できるようになる前に満たさなければならない条件を記述します。
ビットコインはアドレスに保管されているのではなく、出力の中にあり、各出力はPubkey scriptによって保護されています。Bitcoin CoreではこのフィールドをscriptPubKeyと呼び、通常の現代的な出力では22バイトまたは34バイトの長さです。誰かにアドレスを渡すとき、あなたはその人のウォレットが書き込むPubkey scriptのレシピを渡しているのです。
仕組み
シリアライズされたトランザクションの各出力は、3つのものが順に並んだものです。サトシ単位の8バイトの値、長さのプレフィックス、そしてPubkey scriptそのものです。出力の中には受取人を名指すものは何もありません。スクリプトが受取人であり、アドレスはその中にあるわずかなバイト列をチェックサム付きでエンコードしたものにすぎません。
現在のチェーンのほぼすべては5つのテンプレートで説明できます。レガシーのpay-to-public-key-hashのロックは25バイトで、20バイトのハッシュを囲む4つのオペコードを名指します。pay-to-script-hashのロックは23バイトで、OP_EQUALで終わります。ネイティブSegWitはそれと比べて意図的に単純です。バージョンバイトの後に単一のプッシュが続き、単一の鍵なら22バイト、スクリプトハッシュなら34バイトで、出力には論理が一切ありません。Taprootも34バイトで、バージョンバイトと32バイトの鍵です。
リレーポリシーはこの短いリストを認識し、それ以外は中継しません。そのため、独自の出力形式を発明してウォレットがそれに支払うことを期待することはできません。ここではコンセンサスはポリシーよりも緩やかですが、実際の効果として5つのテンプレートがメニューのすべてです。
この名前は化石のようなものです。最も初期のトランザクションでは、スクリプトには実際に公開鍵が含まれていました。ジェネシスブロックのコインベース出力は67バイトで、非圧縮の65バイトの鍵の後にOP_CHECKSIGが続いており、Bitcoin Core自体のソースで読むことができます。鍵ではなくハッシュに支払うことが2011年に標準となり、今日ではほとんどのPubkey scriptに公開鍵は一切含まれず、鍵へのコミットメントだけが含まれています。
どこで目にするか
どのノードでも生のトランザクションをデコードさせると、各出力には4つのフィールドを持つscriptPubKeyオブジェクトが付きます。人間が読めるアセンブリ、生の16進数、タイプ文字列、そしてそのタイプに対応するアドレスです。ブロックエクスプローラーも同じものを表示し、通常はlocking scriptまたはoutput scriptという名前で示されます。
ここはウォレットのウォッチオンリー設定がある場所でもあります。アドレスをインポートすることは、ソフトウェアにチェーン上でどのPubkey scriptをスキャンするかを伝えることであり、そのため本格的なツールではアドレスごとのインポートに代わって、鍵が生成しうるスクリプトの一族全体を生成する定義であるディスクリプターが使われるようになりました。
実用的な読み取りスキルは短いものです。スクリプトが0で始まり20バイトを含むなら、誰かが1つの署名と安価なインプットでそれを消費します。32バイトを含むなら、その背後にはあなたが見ることのできないコントラクトがあります。1で始まり32バイトを含むなら、それはTaprootであり、同じ顔をした単一の鍵かもしれませんし、条件の木全体かもしれません。
Pubkey script vs Signature script
Pubkey scriptが問いを設定し、Signature scriptがそれに答えようとし、両者は異なる人によって異なる時点で書かれます。あなたにお金を送る人が、あなたが渡したアドレスからPubkey scriptを書き、そのバイト分を支払います。あなたは後で消費するときにSignature scriptを書き、そのバイト分を自分で支払います。そのためTaprootアドレスへの送金はレガシーのアドレスへの送金より送り手にとってわずかに高くつく一方、最終的にコインを移動するときにあなたの負担をかなり減らします。また2つのスクリプトは1つに結合されたプログラムとしてではなく別々に実行されます。これは元の結合実行が悪用可能であることが判明した後に2010年に行われた変更です。