142 / 736SELECT

Coin Selection

取引に使う UTXO の選択

支払いの際、ウォレットは過去に受け取ったどの金額を使うかを選びます。その選択によって、手数料、お釣り、そして他人に分かる資金の情報が変わります。

Coin Selection は、ウォレットが Bitcoin の取引を組み立てるために資金を選ぶ処理です。残高は自由に一部を引き出せる一つの金額ではなく、以前の取引で作られた未使用の出力、UTXO の集まりです。ウォレットは支払いと手数料を賄えるだけの出力を選びます。通常は自動で行い、自分で選ぶ機能を Coin Control と呼びます。ネットワークは完成した取引が有効かを確認しますが、すべてのウォレットに同じ選び方を要求するわけではありません。

UTXO 統合計算機UTXO を後でまとめて使う場合と、今日統合して後で 1 入力を使う場合のモデル手数料を比較します。

アンナは 60000 sat を支払おうとしています。支払いを準備するのは、ビットコインを受け取ったり送ったりするためのアプリや機器であるウォレットです。sat は satoshi の略で、Bitcoin の取引で金額を記録する際の最小単位です。手元には 100000 sat の UTXO があります。紙幣で払うときのように、その一部だけを差し引くことはできません。新しい取引の入力が、その出力全体を使います。取引は店への 60000 sat の出力を作り、手数料が 1000 sat なら、アンナのために 39000 sat の出力も作ります。こちらがお釣り、つまり change です。店が後から返金するのではなく、自分の取引の中で作られます。入力の合計とすべての出力の合計との差が手数料です。 [1] [7]

同じ支払いでも、ウォレットは異なる UTXO の組み合わせを使えます。ただし入力が増えると通常はデータも増え、同じ手数料率でも手数料が高くなります。手数料は送金額に対する割合ではありません。取引の仮想サイズに基づき、単位は vB、つまり仮想バイトです。これは取引の各部分に異なる重みがあることを考慮した尺度です。10000 sat の UTXO を使う入力が推定 68 vB を占めるとしましょう。10 sat/vB なら入力自体の費用は 680 sat なので、支払いの残りに充てられるのは 9320 sat です。これが実効価値です。取引のほかの部分にも費用がかかります。実際の入力サイズは、スクリプトに記された支出条件と署名データによって変わります。スクリプトは、資金を使うための条件を記述した短いプログラムです。通常の支払いでは、ウォレットは秘密の数値である秘密鍵を使い、資金の使用を承認したことを検証できるデジタル署名を作ります。 [2] [3] [7]

アンナは小額の入金を何度も受け取っているかもしれません。それらを自分の大きな出力にまとめることを統合といいます。後の支払いで入力を減らせる可能性がありますが、今の時点で手数料がかかり、使った出力同士が公開の場で結び付きます。そのため、何でも自動的にまとめるのがよいとはいえません。Bitcoin Core は waste metric でも費用を比較します。これは現在の入力費用と仮定した長期手数料率での費用との差に、お釣りの作成と将来の使用にかかる費用、または手数料に回す余剰額を加味する評価値です。長期手数料率は計算上の仮定であり、予測ではありません。この値が測るのは費用で、プライバシーではありません。 [2] [6]

アンナはある入金に「給与」、別の入金に「贈り物」というラベルを付けました。一緒に使うと、ブロックチェーンの観察者に両者の関連を推測する手掛かりを与えます。ただし、すべての入力が一人のものだという証明ではありません。複数の参加者が共同で作る取引もあるからです。Coin Control では特定の UTXO を選べ、ラベルはその出所を思い出す助けになります。ラベルはウォレット内のメモであり、ブロックチェーンに書き込むメッセージではありません。BIP 329 はこうしたメモや、ウォレットが特定の出力を使用可能とみなすかどうかという情報の移行方法を定めています。これはウォレット内の設定であり、Bitcoin ネットワークのルールを変えるものではありません。この形式自体が資金を選ぶわけではありません。書き出したラベルは機微な関係を明かすことがあり、お釣りのない支払いでも匿名性は保証されません。 [4] [6]

表示された残高がすべて直ちに使えるとは限りません。ウォレットが意図的に除外した出力もあれば、承認や支出条件の成立を待つものもあります。取引のサイズや重量の制限も守る必要があります。未承認の入金を使うと、新しい支払いはその入金を作った以前の取引に依存します。この文脈では、その以前の取引を祖先取引と呼びます。依存する取引全体を承認させるには追加の手数料が必要になる場合があります。プログラムが Bitcoin Core 29.0 を操作するインターフェース RPC では、walletcreatefundedpsbt に include_unsafe という選択肢があり、リスクのある未承認入力も含められます。元の取引が置き換えられ、必要な出力がなくなれば、それに依存する支払いは承認されません。一方、元の取引がノードのメモリから一時的に削除されただけでは、取引自体の有効性は変わりません。 [3] [5]

ウォレットはどのように候補を探すのでしょうか。Branch-and-bound、略して BnB は入力の組み合わせを試し、適切な結果にならない探索の枝を打ち切ります。目指すのは、別のお釣り出力なしで支払いを賄うことです。金額の完全一致は必須ではなく、お釣りを作って後で使う費用までの余剰も許容範囲に入ります。この余剰は手数料になり、ウォレットのどこかに隠れて残るわけではありません。したがって、お釣りがないからといって最も安い支払いとは限りません。探索の試行回数は限られており、存在する解や、すべての組み合わせの中で最良の解を見つけられないこともあります。 [2]

Bitcoin Core 29.0 は BnB、Knapsack、Single Random Draw(SRD)の候補を比較します。これらは適切な入力の組み合わせを探す別々の方法です。実効手数料率が長期手数料率の三倍を超える場合は CoinGrinder も使います。この方法は、お釣りを伴う、重量の小さい組み合わせを探します。候補は前述の waste metric で比較します。利用者が受取人に渡す金額から手数料を差し引く設定を選んだ場合、BnB は使いません。これは特定のバージョンの説明であり、すべてのウォレットに共通の必須手順でも、最新バージョンについての説明でもありません。 [3]

普通の支払いでプログラムのパラメータを知る必要はありません。ただし署名前には、受取人、金額、総手数料、自分のお釣りを理解する必要があります。上級者向けには、Bitcoin Core 29.0 の walletcreatefundedpsbt で、元の取引の識別子 txid と、その出力の番号 vout により入力を指定できます。add_inputs はウォレットが入力を追加してよいかを制御します。単位の違いに注意してください。fee_rate は sat/vB、feeRate は BTC/kvB、つまり 1000 仮想バイト当たりの bitcoin を使います。結果は PSBT という、準備した取引を署名のために受け渡す形式になります。PSBT を作るだけでは何も送信されず、支払いが承認されたことにもなりません。手動選択やこの形式が、受取人の正しさや未承認入力の有効性を保証するわけではありません。 [5]

理解を深めるには、この項目とあわせて次もお読みください UTXO, Coin Control, Change Address, Fee Rate, PSBT, Bitcoin のプライバシー. 次の項目からも参照されています Watch-only Wallet, Change Address, Inventing Bitcoin.

DOC · 001Bitcoin Developer Guide — Transactions文書 DOC · 002Bitcoin Core — Coin selection implementation一次資料 DOC · 003Bitcoin Core 29.0 — Transaction creation一次資料 DOC · 004BIP 329 — Wallet Labels Export Format仕様 DOC · 005Bitcoin Core 29.0 — walletcreatefundedpsbt RPC文書 DOC · 006Bitcoin Design — Coin selection and privacy文書 DOC · 007Bitcoin Developer Guide — Wallets文書
改訂日: 一次資料を優先 · 投資助言ではありません