From 60f6c76ad60bb4b02537bc4cf5c06a46193b7d25 Mon Sep 17 00:00:00 2001 From: cryptozoidberg Date: Wed, 18 May 2022 16:34:19 +0200 Subject: [PATCH] fixes over signatures structure --- src/currency_core/currency_basic.h | 34 ++++++++++-- .../currency_basic_backward_comp.inl | 52 +++++++++++++++++-- .../currency_format_utils_transactions.cpp | 9 ++++ 3 files changed, 87 insertions(+), 8 deletions(-) diff --git a/src/currency_core/currency_basic.h b/src/currency_core/currency_basic.h index 8ff69bff..8c24ac27 100644 --- a/src/currency_core/currency_basic.h +++ b/src/currency_core/currency_basic.h @@ -541,8 +541,7 @@ namespace currency extra_alias_entry(const extra_alias_entry_old& old) : extra_alias_entry_base(old) , m_alias(old.m_alias) - { - } + {} std::string m_alias; @@ -656,6 +655,26 @@ namespace currency END_BOOST_SERIALIZATION() }; + //classic CryptoNote signature by Nicolas Van Saberhagen + struct NLSAG_sig + { + std::vector > s; + }; + + struct zarcanum_sig + { + //TODO: + }; + + struct void_sig + { + //TODO: + }; + + typedef boost::variant signature_v; + + + //include backward compatibility defintions #include "currency_basic_backward_comp.inl" @@ -668,7 +687,7 @@ namespace currency //extra std::vector extra; std::vector vin; - std::vector vout;//std::vector vout; + std::vector vout; BEGIN_SERIALIZE() VARINT_FIELD(version) @@ -697,14 +716,16 @@ namespace currency class transaction: public transaction_prefix { public: - std::vector > signatures; //count signatures always the same as inputs count + signature_v signature; std::vector attachment; transaction(); BEGIN_SERIALIZE_OBJECT() FIELDS(*static_cast(this)) - FIELD(signatures) + CHAIN_TRANSITION_VER(TRANSACTION_VERSION_INITAL, transaction_v1) + CHAIN_TRANSITION_VER(TRANSACTION_VERSION_PRE_HF4, transaction_v1) + FIELD(signature) FIELD(attachment) END_SERIALIZE() }; @@ -913,6 +934,9 @@ SET_VARIANT_TAGS(currency::tx_out_zarcanum, 38, "tx_out_zarcanum"); SET_VARIANT_TAGS(currency::zarcanum_tx_data_v1, 39, "zarcanum_tx_data_v1"); SET_VARIANT_TAGS(crypto::bpp_signature_serialized, 40, "bpp_signature_serialized"); SET_VARIANT_TAGS(crypto::bppe_signature_serialized, 41, "bppe_signature_serialized"); +SET_VARIANT_TAGS(currency::NLSAG_sig, 42, "NLSAG_sig"); +SET_VARIANT_TAGS(currency::zarcanum_sig, 43, "zarcanum_sig"); +SET_VARIANT_TAGS(currency::void_sig, 43, "void_sig"); diff --git a/src/currency_core/currency_basic_backward_comp.inl b/src/currency_core/currency_basic_backward_comp.inl index 4a8ff1fe..fbd47181 100644 --- a/src/currency_core/currency_basic_backward_comp.inl +++ b/src/currency_core/currency_basic_backward_comp.inl @@ -49,7 +49,16 @@ bool transition_convert(const transaction_prefix_current_t& from, transaction_pr to.version = from.version; to.extra = from.extra; to.vin = from.vin; - to.vout = from.vout; + for (const auto& v : from.vout) + { + if (v.type() == typeid(tx_out_bare)) + { + to.vout.push_back(boost::get(v)); + } + else { + throw std::runtime_error("Unexpected type in tx_out_v"); + } + } return true; } template @@ -58,8 +67,45 @@ bool transition_convert(const transaction_prefix_v1& from, transaction_prefix_cu to.version = from.version; to.extra = from.extra; to.vin = from.vin; - to.vout = from.vout; + for (const auto& v : from.vout) + { + to.vout.push_back(v); + } return true; } - \ No newline at end of file + +class transaction_v1: +{ +public: + std::vector > signatures; //count signatures always the same as inputs count + std::vector attachment; + + BEGIN_SERIALIZE_OBJECT() + FIELD(signatures) + FIELD(attachment) + END_SERIALIZE() +}; + +template +bool transition_convert(const transaction_current_t& from, transaction_v1& to) +{ + to.attachment = from.attachment; + if (from.signature.type() == typeid(NLSAG_sig)) + { + to.signatures = boost::get(from.signature).s; + } + else + { + throw std::runtime_error("Unexpected type in signature_v"); + } + return true; +} +template +bool transition_convert(const transaction_v1& from, transaction_current_t& to) +{ + to.attachment = from.attachment; + to.signature = NLSAG_sig(); + boost::get(to.signature).s = from.signatures; + return true; +} \ No newline at end of file diff --git a/src/currency_core/currency_format_utils_transactions.cpp b/src/currency_core/currency_format_utils_transactions.cpp index 264f604e..14e25e68 100644 --- a/src/currency_core/currency_format_utils_transactions.cpp +++ b/src/currency_core/currency_format_utils_transactions.cpp @@ -32,6 +32,15 @@ namespace currency return expiration_time <= expiration_ts_median + TX_EXPIRATION_MEDIAN_SHIFT; } //--------------------------------------------------------------- + + +#define VARIANT_SWITCH_BEGIN(v_type_obj) {decltype(v_type_obj)& local_reference_eokcmeokmeokcm = v_type_obj; if(false) {; +#define VARIANT_CASE(v_type) } else if(local_reference_eokcmeokmeokcm.type() == typeid(v_type)) { v_type& v_type_obj##_typed = boost::get(local_reference_eokcmeokmeokcm); +#define VARIANT_CASE_OTHER(v_type) } else { +#define VARIANT_SWITCH_END() } } + + + uint64_t get_burned_amount(const transaction& tx) { uint64_t res = 0;