本日の考察(その5)は、UnserializeTransactionとSerializeTransactionを観察です。

bitcoin-SignatureHash

本日は、その3で考察したCTransactionSignatureSerializerとCTransactionが関連する、CTransactionのシリアライズ(UnserializeTransactionとSerializeTransaction)を観察しましょう。

ビットコインは、複数の機能を単一の関数にまとめる傾向があります。この傾向は、UnserializeTransactionやSerializeTransactionにおいても見られ、これらの関数には複数の機能が組み込まれています。そのため、これらのコードを理解するには、以前の古いコアに実装されていたSignatureHashのコードが頭にないと読めません。

そこで、CTransactionSignatureSerializerが作用する機能だけに絞ってUnserializeTransactionやSerializeTransactionを整理すると以下のようになります。

あれっ、という感じですよね。ずいぶんとすっきりしました。CTransactionSignatureSerializerが作用する機能だけなら、これだけでもビットコインは問題なく動作します。もちろん、マルチシグでさえ動作します。

ここで注目すべきは、ストリーム演算子(<<および>>)の使用方法です。>>演算子はデータをストリームsから取り出す役割を果たします。具体的には、UnserializeTransaction関数は、コード中にある4つの要素を順番にsから取り出します。反対に、<<演算子はデータをストリームsに送り出す役割を持ちます。つまり、SerializeTransaction関数は、コード中の4つの要素を順番にsへ書き込む処理を行います。

次に、これら4つの要素のうち、取引情報を保持するのはvinとvoutです。これらは可変長配列(std::vector)として定義されています。vinは入力(所有する残高をまとめる部分)であり、voutは出力(受け取り先および余剰分をまとめる部分)を表します。コインを送る際に複数の送付先を指定できる理由は、このvoutに複数の送付先を設定できるからです。具体的には、vinにはトランザクションの入力情報が、voutにはトランザクションの出力情報が格納され、各々がそれぞれの目的に応じて使用されます。

これらを念頭に置き、CTxIn(vin)とCTxOut(vout)をみていきましょう。

タイトルとURLをコピーしました