diff --git a/include/bitcoin/network/settings.hpp b/include/bitcoin/network/settings.hpp index 3d26915fc..1d51e5deb 100644 --- a/include/bitcoin/network/settings.hpp +++ b/include/bitcoin/network/settings.hpp @@ -413,6 +413,7 @@ struct BCT_API settings bool enable_alert{ false }; bool enable_reject{ false }; bool enable_not_found{ false }; + bool enable_memory_pool{ false }; bool enable_relay{ false }; bool validate_checksum{ false }; bool gossip_ipv4{ true }; diff --git a/src/messages/peer/detail/version.cpp b/src/messages/peer/detail/version.cpp index f4f2347e8..b23c9735e 100644 --- a/src/messages/peer/detail/version.cpp +++ b/src/messages/peer/detail/version.cpp @@ -76,9 +76,8 @@ version version::deserialize(uint32_t version, reader& source) NOEXCEPT // This ignores the specified version, instead respecting the peer's // version, since the specified version is not yet negotiated. A true // relay value may then be ignored when negotiated version is < bip37. - // If value >= bip37 with no relay byte, the source is invalidated. - return (value >= level::bip37) && (source.is_exhausted() || - to_bool(source.read_byte())); + return (value < level::bip37) || source.is_exhausted() || + to_bool(source.read_byte()); }; // ************************************************************************ diff --git a/test/messages/peer/detail/version.cpp b/test/messages/peer/detail/version.cpp index 726dfbd33..e36787b2c 100644 --- a/test/messages/peer/detail/version.cpp +++ b/test/messages/peer/detail/version.cpp @@ -63,6 +63,47 @@ BOOST_AUTO_TEST_CASE(version__size__default_bip37_version__expected) BOOST_REQUIRE_EQUAL(version{}.size(level::maximum_protocol), expected); } +// relay + +BOOST_AUTO_TEST_CASE(version__deserialize__pre_bip37__relay_true) +{ + version instance{}; + instance.value = level::bip35; + instance.relay = false; + data_chunk data(instance.size(level::bip35)); + BOOST_REQUIRE(instance.serialize(level::bip35, data)); + + const auto message = version::deserialize(level::bip35, data); + BOOST_REQUIRE(message); + BOOST_REQUIRE(message->relay); +} + +BOOST_AUTO_TEST_CASE(version__deserialize__bip37_relay_false__relay_false) +{ + version instance{}; + instance.value = level::bip37; + instance.relay = false; + data_chunk data(instance.size(level::bip37)); + BOOST_REQUIRE(instance.serialize(level::bip37, data)); + + const auto message = version::deserialize(level::bip37, data); + BOOST_REQUIRE(message); + BOOST_REQUIRE(!message->relay); +} + +BOOST_AUTO_TEST_CASE(version__deserialize__bip37_relay_true__relay_true) +{ + version instance{}; + instance.value = level::bip37; + instance.relay = true; + data_chunk data(instance.size(level::bip37)); + BOOST_REQUIRE(instance.serialize(level::bip37, data)); + + const auto message = version::deserialize(level::bip37, data); + BOOST_REQUIRE(message); + BOOST_REQUIRE(message->relay); +} + // wire examples // "/Satoshi:1.1.1/" (70006) no relay diff --git a/test/settings.cpp b/test/settings.cpp index 3bfcfd70e..c330510e3 100644 --- a/test/settings.cpp +++ b/test/settings.cpp @@ -45,6 +45,7 @@ BOOST_AUTO_TEST_CASE(settings__construct__default__expected) BOOST_REQUIRE_EQUAL(instance.enable_alert, false); BOOST_REQUIRE_EQUAL(instance.enable_reject, false); BOOST_REQUIRE_EQUAL(instance.enable_not_found, false); + BOOST_REQUIRE_EQUAL(instance.enable_memory_pool, false); BOOST_REQUIRE_EQUAL(instance.enable_relay, false); BOOST_REQUIRE_EQUAL(instance.validate_checksum, false); BOOST_REQUIRE_EQUAL(instance.identifier, 3652501241u);