本文へスキップ
buybitcoinsmart

用語集 / トランザクションと手数料

シリアライズされたトランザクション

別名は生のトランザクションです。

シリアライズされたトランザクションとは?
シリアライズされたトランザクションとは、ウォレットがネットワークに渡すそのままのバイト列のことであり、すべてのノードが1バイトも変えずに解析し、ハッシュを計算し、中継する16進数表記の形式です。

BIP-144で規定されています。

トランザクションの分かりやすい部分、つまりアドレス、自国の通貨での金額、ラベルは、ウォレットが付け加える装飾にすぎません。実際に送られるのはコンパクトなバイナリの塊で、簡単な支払いでは通常200~250バイトであり、完全に自己完結しています。オフラインのコンピューターからこの16進数を任意のオンラインのコンピューターにコピーすれば、そこから支払いをブロードキャストできます。

仕組み

シリアライズはフィールド名のない固定の順序であるため、パーサーは位置と長さの接頭辞だけに全面的に依存します。

塊は4バイトのバージョンで始まります。次にSegregated Witnessのトランザクションでは2つのフラグバイト、0x00と0x01が挿入されます。古いパーサーはこれを入力がゼロのトランザクションとして読み取り、そのため拒否します。これは新しい形式を古い形式と共存させるための意図的な仕掛けです。続いて入力数がcompactSize整数として置かれ、その後に各入力が続きます。つまり、使用するコインを指定する36バイト、長さの接頭辞が付いたアンロックスクリプト、4バイトのシーケンス番号です。その後に出力数が続き、各出力はサトシ単位の8バイトの金額と、長さの接頭辞が付いたロックスクリプトとして置かれます。ウィットネスのデータは存在する場合、末尾近くに置かれ、最後の4バイトは常にlocktimeです。

数値はリトルエンディアンで、最小のバイトが先に保存されます。そのため100,000サトシの金額は16進数ではa0 86 01 00 00 00 00 00と表示されます。ハッシュは内部のバイト順で保存され、これはブロックエクスプローラーが表示する順序の逆であるため、生の塊の中のトランザクションIDは逆さまに見えます。

この1つの構造から2つのハッシュが得られます。トランザクションIDは、マーカー、フラグ、ウィットネスを取り除いたシリアライズに対する二重SHA-256であり、これにより署名は後から改変されないようになります。BIP141で定義されているウィットネストランザクションIDは、ウィットネスを含む全体をハッシュ化し、ノードは中継の管理にこれを使用します。入力1つ、出力2つのネイティブSegWitの支払いは、約222の生バイトにシリアライズされ、ウィットネスの部分が割引されるため、およそ141仮想バイトとして数えられます。

どこで目にするか

生の形式は、単一のアプリの外に出た瞬間に現れます。ほとんどの人にとってそれは、オフラインでの署名や支払いの救済を意味します。

ハードウェアウォレットやエアギャップの設定では、完成したトランザクションを16進数として、または同じバイトを含むQRコードとしてエクスポートし、それをブロックエクスプローラーのブロードキャスト用フォームに貼り付けて送信します。Bitcoin Coreのコマンドラインでは両方向でこれを使用します。createrawtransactionとsignrawtransactionwithwalletは16進数を生成し、decoderawtransactionは16進数を読み取り可能なJSONに戻し、sendrawtransactionはそれをネットワークに送ります。サポートの問い合わせでは、トランザクションIDではなく生の16進数を求められることがよくあります。16進数はトランザクションの名前を示すだけでなく、その内容を証明するからです。

安全上の注意が1つあります。署名済みの生のトランザクションは持参人情報です。16進数を持っている人は誰でもそれをブロードキャストでき、その内容に機密性はありません。支払いが実行されても構わない場合を除き、助けを求める際に公開フォーラムに貼り付けないでください。

シリアライズされたトランザクションvsトランザクションID

シリアライズされたトランザクションは文書であり、トランザクションIDはそのファイル名です。一方は数百バイトの16進数で、画面では500文字に達することがあり、もう一方は常に正確に64文字の16進数です。

どちらも長い16進数の文字列に見えるため、人は混同します。見分ける基準は長さと、その文字列で何ができるかです。64文字の文字列はエクスプローラーで検索できるだけで、それ以外は何もできません。より長い文字列はフィールドにデコードでき、完全に署名されていれば、それを持っている人なら誰でも、あなたが送った見知らぬ人を含めてブロードキャストできます。

混同しやすい用語

よくある質問

署名済みの生のトランザクションを共有した相手は、誰でもそれをブロードキャストできるのでしょうか?

はい。完全に署名されたシリアライズされたトランザクションは完成しており、送信に許可は必要ないため、16進数表記の文字列を署名済みの小切手と同じように扱ってください。公開スレッドで共有すると、最初にコピーした人に支払いが渡ります。

生の16進数表記の文字列の中では、トランザクションIDが逆さまに見えるのはなぜですか?

ハッシュが内部のバイト順で保存されており、それはエクスプローラーが表示する順序とは逆だからです。どちらも同じ32バイトを表しており、すべてのデコーダーはIDを表示する際に自動的に逆順にします。

関連用語

トランザクションと手数料のその他の用語

このページを英語で読む