用語集 / トランザクションと手数料
アウトプットインデックス
別名はvoutです。
- アウトプットインデックスとは?
- アウトプットインデックスとは、トランザクション内での1つのアウトプットの位置をゼロから数えたものであり、コインがtxid:1と表記されている場合のコロンの後に続く数字です。
トランザクションは一度に数十の受取人へ支払うことができるため、識別子だけではどの支払いが自分のものかは決して分かりません。インデックスは4バイトの数値として保存され、4,294,967,295までの値を取ることができ、これはどのブロックにも収めきれないほど多くのアウトプットです。トランザクションIDと組み合わせることでアウトポイントが形成され、これは台帳内におけるコインの恒久的な住所となります。
仕組み
アウトプットには順序があり、その順序はトランザクションの作成者がシリアライズしたとおりのものです。最初のアウトプットはインデックス0、2番目はインデックス1であり、番号は抜けなくリストの最後まで続きます。インデックスはアウトプットの金額、受取人、目的のいずれも示しません。単なる位置にすぎないのです。
すべてのトランザクションのすべてのインプットには、この番号のいずれかが付いています。インプットは36バイトの参照から始まります。すなわち32バイトのトランザクションIDに続く4バイトのリトルエンディアンのインデックスです。これにより支出はどのコインを使っているのかを示し、ノードはチェーン全体を検索することなく支出を検証できるのです。
各ブロックのコインベーストランザクションは、意図的にこのパターンを破ります。使うべきコインがないため、その唯一のインプットは32バイトのゼロからなるトランザクションIDを指し、インデックスは0xffffffff、つまりこのフィールドが取り得る最大値に設定されています。このアウトポイントを参照するものは、送金ではなく新規発行された資金として認識されます。
位置は情報も漏らすため、ウォレットはこれをプライバシー設定として扱います。もしお釣りが常にインデックス1に来るなら、あらゆる観察者がすべてのトランザクションのお釣りアウトプットを即座に特定できてしまいます。Bitcoin Coreはお釣りアウトプットの位置をランダム化し、BIP69は逆のアプローチとして、インプットとアウトプットを決定的な辞書順に並べ、順序から何も推測できないようにすることを提案しました。
目にする場所
多くの人がその名を知らないままこの数値に出会うのが、コイン管理画面です。Sparrow、Electrum、Bitcoin Coreはいずれも保有コインをトランザクションIDとインデックスの組として表示します。同じトランザクションの2つのアウトプットがどちらも自分に属することがあり、それを区別できるのはインデックスだけだからです。
取引所のバッチ処理はこの数値を目に見える形にします。KrakenやBinanceが100件の出金を1つのトランザクションで支払う場合、自分のコインはバッチ処理ソフトウェアが割り当てた位置に置かれるため、120個のアウトプットのうちインデックス87に自分の資金があるのはごく普通のことであり、何か問題が起きた証拠ではありません。
開発者向けツールはこれを直接求めます。gettxoutコマンドはトランザクションIDとインデックスを別々の引数として受け取り、PSBTファイルはインプットをアウトポイントで参照し、ハードウェアウォレットは支出を承認する間に画面に「output 2 of 3」と表示します。「txidとvoutを教えてください」と尋ねるサポート窓口は、同じ2つの値を求めているのです。
アウトプットインデックスvsアウトポイント
アウトプットインデックス単独では意味をなしません。インデックス0はこれまで作られたすべてのトランザクションに存在するからです。アウトポイントはトランザクションIDとインデックスを合わせた組であり、これまで存在したすべてのコインの中からただ1つのコインを特定します。この区別は、コイン管理の入力欄やサポートチケットに何かを貼り付けた瞬間に重要になります。参照の半分は参照ではないのです。