コードの重要な部分は:
fileout << FLATDATA(pchMessageStart) << nSize;
...
fileout << *this;pchMessageStartは4バイトのマジックバイトで、FLATDATAで書き込まれる。
CBlock自体は<< *thisで書き込まれ、main.hのIMPLEMENT_SERIALIZEで行われる:
IMPLEMENT_SERIALIZE
(
READWRITE(this->nVersion);
nVersion = this->nVersion;
READWRITE(hashPrevBlock);
READWRITE(hashMerkleRoot);
READWRITE(nTime);
READWRITE(nBits);
READWRITE(nNonce);
// ConnectBlock depends on vtx being last so it can calculate offset
if (!(nType & (SER_GETHASH|SER_BLOCKHEADERONLY)))
READWRITE(vtx);
else if (fRead)
const_cast<CBlock*>(this)->vtx.clear();
)
READWRITEマクロは適切な処理を行い、メンバーをマシン非依存の方法で読み書きする。
トランザクションとブロックをダンプできる簡略化されたPythonコードはhttp://github.com/gavinandresen/bitcointoolsを参照。