Re: ブロックの読み書きと FLATDATA

コードの重要な部分は:

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 を参照。