用語集 / トランザクションと手数料
PSBT
別名はPartially Signed Bitcoin Transaction、BIP174です。
- PSBTとは?
- PSBTとは、まだ完成していないトランザクションのファイルです。インプット、アウトプット、および署名者がそれらを検証するために必要なすべての情報を含み、ネットワーク上ではなくデバイス間で受け渡されます。
BIP-174で規定されています。
かつてビットコインの署名とは、トランザクションを構築した任意のプログラムに秘密鍵を渡すことを意味していました。BIP174が2018年にそれを分離し、Bitcoin Coreがバージョン0.17.0で対応を出荷したため、鍵を保持するデバイスはインターネットに接続されたデバイスと別のものであってかまいません。現在ではすべてのハードウェアウォレットとマルチシグのコーディネーターがこれに対応しています。
仕組み
PSBTはキーと値のマップのコンテナです。組み立て中のトランザクションを記述するグローバルマップが1つ、次に各インプットに1つずつ、各アウトプットに1つずつ並びます。
ファイルは5つのマジックバイト70 73 62 74 ffで始まり、これは「psbt」に区切り文字を加えたものです。Base64が持ち運びの通常の方法であるため、テキストボックスに貼り付けられたPSBTは必ずcHNidP8という文字で始まります。それ以外の始まり方をする文字列は、送った人がどう言おうとPSBTではありません。
各インプットのマップには、オフラインの署名者が自分では調べられない情報が入ります。
- 使用されるアウトプット。これによりデバイスは、自身が承認している正確な金額とロックスクリプトを把握できます
- コインが単一の鍵ではなくポリシーの下にある場合の、リディームスクリプトまたはウィットネススクリプト
- 署名が必要なすべての鍵の導出パスとマスター鍵のフィンガープリント。これにより、正しいシードを持つデバイスが正しい子鍵を見つけられます
- これまでに集まった部分署名。署名者ごとに1つずつ
アウトプットのマップも導出情報を持ち、これによって署名者はおつりのアウトプットが本当に保護対象のウォレットに属することを確認できます。
BIP174は作業をプログラムではなく役割に分けます。作成者が骨組みを作り、更新者がインプットの詳細を埋め、署名者が部分署名を加え、結合者が個別に署名されたファイルを統合し、確定者が部分署名を有効なスクリプトまたはウィットネスに変換し、抽出者がブロードキャスト可能な生のトランザクションを生成します。1つのソフトウェアが複数の役割を同時に担うこともよくありますが、この分離こそが異なるベンダーのファイルが相互運用できる理由です。
この形式は無知を許容するように作られました。すべてのフィールドには型バイトが付き、理解できないフィールドに出会った署名者はそれを破棄せずそのまま通さなければなりません。これにより2018年に書かれたウォレットでも、Taproot向けに書かれたウォレットへファイルを渡せます。BIP371はTaprootのフィールドを追加しました。BIP370はバージョン2を定義し、そこでは作成後にもインプットとアウトプットを追加でき、これは協調型トランザクションに必要な性質です。
ビットコインを購入するときにこれが重要な理由
取引所からビットコインを自分のハードウェアウォレットに移した瞬間、どの画面にもそう表示されなくても、PSBT形式を使っています。
**鍵をコンピューターの外に保ちます。**ノートパソコンが支払いを組み立ててPSBTを生成し、TrezorやLedgerがそれを読み取り、内容を表示し、署名して返します。秘密のものはケーブルを一切通りません。これが、侵入されても耐えられるノートパソコンと、侵入されたら耐えられないシードフレーズとの違いです。
**おつりアドレスのすり替えを防ぎます。**コンピューターを制御するマルウェアは、正直な支払い画面を表示しながら、おつりを自身が所有するアドレスへ静かに送り、おつりは通常、支払い額より大きな金額です。ファイルがすべてのアウトプットの導出パスを示すため、署名デバイスはおつりが自分のシードから派生したものかを確認でき、そうでない場合に警告できます。デバイスの画面を読んでください。ブラウザのタブは決して読まないでください。
**エンジニアでない人にもマルチシグを使えるようにします。**2つのハードウェアウォレットと別の建物にあるバックアップに分散した2 of 3は、未署名のトランザクションが何も漏らさずにSDカード、QRコード、またはメールで移動できる場合にのみ機能します。PSBTには秘密鍵が含まれないため、輸送中に1つ失っても費用はまったくかかりません。
**相続人が必要とする部分です。**シードワードの封筒は、単一鍵のウォレットより複雑なもののリカバリー計画にはなりません。シードに、ウォレットのアウトプット記述子と、PSBTを読むソフトウェアを名指ししたメモを添えておけば、その計画はあなたの死後も生き残ります。当サイトのセキュリティガイドでは、その設定の残りを扱っています。
2 of 3の出金に署名する手順
取引所で0.4BTCを購入し、3つの鍵で制御され、そのうち任意の2つで使用できる保管庫に引き出したとします。
数か月後、その一部を移動したくなります。ノートパソコン上のウォッチオンリーウォレットに保管庫の記述子を読み込み、鍵は一切持たない状態で、トランザクションを組み立てます。インプット1つ、支払いのアウトプット1つ、おつりのアウトプット1つです。2 of 3のネイティブSegWitインプットは約105仮想バイト、2つのアウトプットはさらに約62仮想バイトを要するため、オーバーヘッドを含めると全体は177仮想バイト近くになり、8sat/vBでは手数料はおよそ1,400サトシになります。
ノートパソコンがPSBTを書き出します。最初のハードウェアウォレットを接続すると、ファイルを読み取り、受取人、金額、手数料を表示し、インプットのマップに1つの署名を書き込みます。次にファイルをmicroSDカードで、ネットワークに一切触れたことのない2台目のデバイスへ運ぶと、2つ目の署名が加わります。
ノートパソコンに戻ると、結合者が2つのファイルを統合し、確定者がスクリプトが期待する順序で署名をウィットネスに組み立て、抽出者が生のトランザクションを生成します。ネットワークに何かが届くのはその時だけです。その瞬間まで、鍵はどのデバイスからも出ておらず、あなたが行ったことは誰にも見えていませんでした。
PSBT vsシリアライズ済みトランザクション
シリアライズ済みトランザクションは完成品であり、PSBTは作業スペースです。PSBTをブロードキャストするとすべてのノードが拒否します。これはピアツーピアプロトコルが運ぶ形式ではないからです。違いは逆方向にもあります。PSBTは、使用される各インプットの金額やどの鍵が各アドレスを導出したかなど、完成したトランザクションが捨ててしまう文脈を保持しており、これはまさにハードウェアウォレットが必要とし、ブロックが必要としない情報です。
PSBT vsアウトプット記述子
アウトプット記述子はウォレットを記述し、PSBTは1回の支払いを記述します。記述子はスクリプト種別、鍵、導出パスを名指しする1行で、年が変わっても変わりません。PSBTは使い捨てで、トランザクションごとに1つです。単一鍵のウォレットではシードフレーズだけですべてを復元できますが、マルチシグでは両方が必要です。どのアドレスが自分のものかを割り出す記述子と、そこから何かを動かすためのPSBTです。