diff --git a/src/currency_core/currency_format_utils.h b/src/currency_core/currency_format_utils.h index 4910a72c..29966d44 100644 --- a/src/currency_core/currency_format_utils.h +++ b/src/currency_core/currency_format_utils.h @@ -743,11 +743,12 @@ namespace currency } //--------------------------------------------------------------- + /* inline size_t get_input_expected_signatures_count(const txin_v& tx_in) { struct txin_signature_size_visitor : public boost::static_visitor { - size_t operator()(const txin_gen& /*txin*/) const { return 0; } + size_t operator()(const txin_gen& txin) const { return 0; } size_t operator()(const txin_to_key& txin) const { return txin.key_offsets.size(); } size_t operator()(const txin_multisig& txin) const { return txin.sigs_count; } size_t operator()(const txin_htlc& txin) const { return 1; } @@ -755,6 +756,22 @@ namespace currency }; return boost::apply_visitor(txin_signature_size_visitor(), tx_in); + }*/ + //--------------------------------------------------------------- + inline size_t get_input_expected_signature_size(const txin_v& tx_in, bool last_input_in_separately_signed_tx) + { + struct txin_signature_size_visitor : public boost::static_visitor + { + txin_signature_size_visitor(size_t add) : a(add) {} + size_t a; + size_t operator()(const txin_gen& /*txin*/) const { return 0; } + size_t operator()(const txin_to_key& txin) const { return tools::get_varint_packed_size(txin.key_offsets.size() + a) + sizeof(crypto::signature) * (txin.key_offsets.size() + a); } + size_t operator()(const txin_multisig& txin) const { return tools::get_varint_packed_size(txin.sigs_count + a) + sizeof(crypto::signature) * (txin.sigs_count + a); } + size_t operator()(const txin_htlc& txin) const { return tools::get_varint_packed_size(1 + a) + sizeof(crypto::signature) * (1 + a); } + size_t operator()(const txin_zc_input& txin) const { return 97 + tools::get_varint_packed_size(txin.key_offsets.size()) + txin.key_offsets.size() * 32; } + }; + + return boost::apply_visitor(txin_signature_size_visitor(last_input_in_separately_signed_tx ? 1 : 0), tx_in); } //--------------------------------------------------------------- template diff --git a/src/currency_core/currency_format_utils_transactions.cpp b/src/currency_core/currency_format_utils_transactions.cpp index 3f8d6873..5792295e 100644 --- a/src/currency_core/currency_format_utils_transactions.cpp +++ b/src/currency_core/currency_format_utils_transactions.cpp @@ -232,12 +232,8 @@ namespace currency for (size_t i = 0; i != t.vin.size(); i++) { - size_t sig_count = get_input_expected_signatures_count(t.vin[i]); - if (separately_signed_tx && i == t.vin.size() - 1) - ++sig_count; // count in one more signature for the last input in a complete separately signed tx - tx_blob_size += tools::get_varint_packed_size(sig_count); // size of transaction::signatures[i] - tx_blob_size += sizeof(crypto::signature) * sig_count; // size of signatures' data itself - //tx_blob_size += sizeof(binary_archive::variant_tag_type); //tools::get_varint_packed_size(variant_serialization_traits, currency::NLSAG_sig>::get_tag()); // sizeof variant tag + size_t sig_size = get_input_expected_signature_size(t.vin[i], separately_signed_tx && i == t.vin.size() - 1); + tx_blob_size += sig_size; } // 2. attachments (try to find extra_attachment_info in tx prefix and count it in if succeed) @@ -273,7 +269,7 @@ namespace currency bool read_keyimages_from_tx(const transaction& tx, std::list& kil) { std::unordered_set ki; - BOOST_FOREACH(const auto& in, tx.vin) + for(const auto& in : tx.vin) { if (in.type() == typeid(txin_to_key) || in.type() == typeid(txin_htlc) || in.type() == typeid(txin_zc_input)) {