diff --git a/libraries/chain/include/eosio/chain/transaction.hpp b/libraries/chain/include/eosio/chain/transaction.hpp index eccafc36cdc..662d5264d61 100644 --- a/libraries/chain/include/eosio/chain/transaction.hpp +++ b/libraries/chain/include/eosio/chain/transaction.hpp @@ -157,12 +157,6 @@ namespace eosio { namespace chain { packed_transaction_v0( bytes&& packed_txn, vector&& sigs, vector&& cfd, compression_type _compression ); packed_transaction_v0( transaction&& t, vector&& sigs, bytes&& packed_cfd, compression_type _compression ); - friend bool operator==(const packed_transaction& lhs, const packed_transaction& rhs) { - return std::tie(lhs.signatures, lhs.compression, lhs.packed_context_free_data, lhs.packed_trx) == - std::tie(rhs.signatures, rhs.compression, rhs.packed_context_free_data, rhs.packed_trx); - } - friend bool operator!=(const packed_transaction& lhs, const packed_transaction& rhs) { return !(lhs == rhs); } - uint32_t get_unprunable_size()const; uint32_t get_prunable_size()const; @@ -217,7 +211,13 @@ namespace eosio { namespace chain { struct none { digest_type digest; + digest_type prunable_digest() const; + + friend bool operator==(const none& lhs, const none& rhs) { + return lhs.digest == rhs.digest; + } + friend bool operator!=(const none& lhs, const none& rhs) { return !(lhs == rhs); } }; using segment_type = std::variant; @@ -225,20 +225,41 @@ namespace eosio { namespace chain { struct partial { std::vector signatures; std::vector context_free_segments; + digest_type prunable_digest() const; + + friend bool operator==(const partial& lhs, const partial& rhs) { + return std::tie( lhs.signatures, lhs.context_free_segments ) == + std::tie( rhs.signatures, rhs.context_free_segments ); + } + friend bool operator!=(const partial& lhs, const partial& rhs) { return !(lhs == rhs); } }; struct full { std::vector signatures; std::vector context_free_segments; + digest_type prunable_digest() const; + + friend bool operator==(const full& lhs, const full& rhs) { + return std::tie( lhs.signatures, lhs.context_free_segments ) == + std::tie( rhs.signatures, rhs.context_free_segments ); + } + friend bool operator!=(const full& lhs, const full& rhs) { return !(lhs == rhs); } }; struct full_legacy { std::vector signatures; bytes packed_context_free_data; vector context_free_segments; + digest_type prunable_digest() const; + + friend bool operator==(const full_legacy& lhs, const full_legacy& rhs) { + return std::tie( lhs.signatures, lhs.packed_context_free_data, lhs.context_free_segments ) == + std::tie( rhs.signatures, rhs.packed_context_free_data, rhs.context_free_segments ); + } + friend bool operator!=(const full_legacy& lhs, const full_legacy& rhs) { return !(lhs == rhs); } }; using prunable_data_t = std::variant< full_legacy, @@ -246,6 +267,11 @@ namespace eosio { namespace chain { partial, full >; + friend bool operator==(const prunable_data_type& lhs, const prunable_data_type& rhs) { + return lhs.prunable_data == rhs.prunable_data; + } + friend bool operator!=(const prunable_data_type& lhs, const prunable_data_type& rhs) { return !(lhs == rhs); } + prunable_data_type prune_all() const; digest_type digest() const; @@ -271,6 +297,12 @@ namespace eosio { namespace chain { packed_transaction_v0_ptr to_packed_transaction_v0() const; + friend bool operator==(const packed_transaction& lhs, const packed_transaction& rhs) { + return std::tie(lhs.compression, lhs.prunable_data, lhs.packed_trx) == + std::tie(rhs.compression, rhs.prunable_data, rhs.packed_trx); + } + friend bool operator!=(const packed_transaction& lhs, const packed_transaction& rhs) { return !(lhs == rhs); } + uint32_t get_unprunable_size()const; uint32_t get_prunable_size()const; uint32_t get_estimated_size()const { return estimated_size; }