diff --git a/src/coins.h b/src/coins.h --- a/src/coins.h +++ b/src/coins.h @@ -56,12 +56,12 @@ template void Serialize(Stream &s) const { assert(!IsSpent()); ::Serialize(s, VARINT(nHeightAndIsCoinBase)); - ::Serialize(s, CTxOutCompressor(REF(out))); + ::Serialize(s, Using(out)); } template void Unserialize(Stream &s) { ::Unserialize(s, VARINT(nHeightAndIsCoinBase)); - ::Unserialize(s, CTxOutCompressor(out)); + ::Unserialize(s, Using(out)); } size_t DynamicMemoryUsage() const { diff --git a/src/compressor.h b/src/compressor.h --- a/src/compressor.h +++ b/src/compressor.h @@ -11,10 +11,6 @@ #include #include -class CKeyID; -class CPubKey; -class CScriptID; - bool CompressScript(const CScript &script, std::vector &out); unsigned int GetSpecialScriptSize(unsigned int nSize); bool DecompressScript(CScript &script, unsigned int nSize, @@ -35,8 +31,7 @@ * Other scripts up to 121 bytes require 1 byte + script length. Above that, * scripts up to 16505 bytes require 2 bytes + script length. */ -class CScriptCompressor { -private: +struct ScriptCompression { /** * make this static for now (there are only 6 special scripts defined) this * can potentially be extended together with a new nVersion for @@ -45,12 +40,8 @@ */ static const unsigned int nSpecialScripts = 6; - CScript &script; - -public: - explicit CScriptCompressor(CScript &scriptIn) : script(scriptIn) {} - - template void Serialize(Stream &s) const { + template + void Ser(Stream &s, const CScript &script) const { std::vector compr; if (CompressScript(script, compr)) { s << MakeSpan(compr); @@ -61,7 +52,7 @@ s << MakeSpan(script); } - template void Unserialize(Stream &s) { + template void Unser(Stream &s, CScript &script) { unsigned int nSize = 0; s >> VARINT(nSize); if (nSize < nSpecialScripts) { @@ -82,28 +73,24 @@ } }; -/** wrapper for CTxOut that provides a more compact serialization */ -class CTxOutCompressor { -private: - CTxOut &txout; - -public: - explicit CTxOutCompressor(CTxOut &txoutIn) : txout(txoutIn) {} - - ADD_SERIALIZE_METHODS; +struct AmountCompression { + template void Ser(Stream &s, I val) { + s << VARINT(CompressAmount(val)); + } + template void Unser(Stream &s, I &val) { + uint64_t v; + s >> VARINT(v); + val = DecompressAmount(v); + } +}; - template - inline void SerializationOp(Stream &s, Operation ser_action) { - if (!ser_action.ForRead()) { - uint64_t nVal = CompressAmount(txout.nValue); - READWRITE(VARINT(nVal)); - } else { - uint64_t nVal = 0; - READWRITE(VARINT(nVal)); - txout.nValue = DecompressAmount(nVal); - } - CScriptCompressor cscript(REF(txout.scriptPubKey)); - READWRITE(cscript); +/** + * wrapper for CTxOut that provides a more compact serialization + */ +struct TxOutCompression { + FORMATTER_METHODS(CTxOut, obj) { + READWRITE(Using(obj.nValue), + Using(obj.scriptPubKey)); } }; diff --git a/src/test/fuzz/deserialize.cpp b/src/test/fuzz/deserialize.cpp --- a/src/test/fuzz/deserialize.cpp +++ b/src/test/fuzz/deserialize.cpp @@ -197,7 +197,7 @@ DeserializeFromFuzzingInput(buffer, dbi); #elif TXOUTCOMPRESSOR_DESERIALIZE CTxOut to; - CTxOutCompressor toc(to); + auto toc = Using(to); DeserializeFromFuzzingInput(buffer, toc); #elif BLOCKTRANSACTIONS_DESERIALIZE BlockTransactions bt; diff --git a/src/txdb.cpp b/src/txdb.cpp --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -372,7 +372,7 @@ vout.assign(vAvail.size(), CTxOut()); for (size_t i = 0; i < vAvail.size(); i++) { if (vAvail[i]) { - ::Unserialize(s, CTxOutCompressor(vout[i])); + ::Unserialize(s, Using(vout[i])); } } // coinbase height diff --git a/src/undo.h b/src/undo.h --- a/src/undo.h +++ b/src/undo.h @@ -40,7 +40,7 @@ // Required to maintain compatibility with older undo format. ::Serialize(s, uint8_t(0)); } - ::Serialize(s, CTxOutCompressor(REF(pcoin->GetTxOut()))); + ::Serialize(s, Using(REF(pcoin->GetTxOut()))); } }; @@ -64,7 +64,7 @@ } CTxOut txout; - ::Unserialize(s, CTxOutCompressor(REF(txout))); + ::Unserialize(s, Using(REF(txout))); *pcoin = Coin(std::move(txout), nHeight, fCoinBase); }