From cbc52f07347dcd93e9ec3f64f4e712650a954d92 Mon Sep 17 00:00:00 2001 From: "James C. Owens" Date: Mon, 25 Dec 2023 20:24:43 -0500 Subject: [PATCH] Change CTxDestination into a class to support serialization (WIP) --- src/script.h | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/src/script.h b/src/script.h index 5cf9feafe3..aa768cde40 100644 --- a/src/script.h +++ b/src/script.h @@ -17,6 +17,7 @@ #include "keystore.h" #include "prevector.h" #include +#include "serialize.h" #include "wallet/ismine.h" typedef std::vector valtype; @@ -30,7 +31,14 @@ class CScriptID : public BaseHash CScriptID() : BaseHash() {} explicit CScriptID(const CScript& in); explicit CScriptID(const uint160& in) : BaseHash(in) {} -// explicit CScriptID(const ScriptHash& in); + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action) + { + READWRITE(m_hash); + } }; static const unsigned int MAX_SCRIPT_ELEMENT_SIZE = 520; // bytes @@ -93,7 +101,79 @@ class CNoDestination { * * CScriptID: TX_SCRIPTHASH destination * A CTxDestination is the internal data type encoded in a CBitcoinAddress */ -typedef std::variant CTxDestination; +typedef std::variant CTxDestinationVariant; + +class CTxDestination : public CTxDestinationVariant +{ +public: + CTxDestination() : CTxDestinationVariant() + { + m_variant_idx = 0; + } + + CTxDestination(CTxDestination& dest) : CTxDestinationVariant(dest) + { + m_variant_idx = this->index(); + } + + CTxDestination(const CTxDestination& dest) : CTxDestinationVariant(dest) + { + m_variant_idx = this->index(); + } + + CTxDestination(CNoDestination dest) : CTxDestinationVariant(dest) + { + m_variant_idx = this->index(); + } + + CTxDestination(CKeyID dest) : CTxDestinationVariant(dest) + { + m_variant_idx = this->index(); + } + + CTxDestination(CScriptID dest) : CTxDestinationVariant(dest) + { + m_variant_idx = this->index(); + } + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action) + { + READWRITE(m_variant_idx); + + // There is no serialization necessary for CNoDestination. + // The indexes are in order of the typedef variant types specified above in CTxDestinationVariant. + // If new destination types are added to CTxDestinationVariant, then the below will need to be + // extended. + + if (m_variant_idx == 1) { + CKeyID dest = std::get<1>(*this); + + READWRITE(dest); + + CTxDestinationVariant dest_var(dest); + + this->swap(dest_var); + + } + + if (m_variant_idx == 2) { + CScriptID dest = std::get<2>(*this); + + READWRITE(dest); + + CTxDestinationVariant dest_var(dest); + + this->swap(dest_var); + } + } + +private: + size_t m_variant_idx; +}; + const char* GetTxnOutputType(txnouttype t);