diff --git a/nano/lib/CMakeLists.txt b/nano/lib/CMakeLists.txt index 271091dce..9612fdf80 100644 --- a/nano/lib/CMakeLists.txt +++ b/nano/lib/CMakeLists.txt @@ -21,6 +21,10 @@ add_library( ${platform_sources} asio.hpp asio.cpp + block_sideband.hpp + block_sideband.cpp + block_type.hpp + block_type.cpp blockbuilders.hpp blockbuilders.cpp blocks.hpp diff --git a/nano/lib/block_sideband.cpp b/nano/lib/block_sideband.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/nano/lib/block_sideband.hpp b/nano/lib/block_sideband.hpp new file mode 100644 index 000000000..dc7e8a428 --- /dev/null +++ b/nano/lib/block_sideband.hpp @@ -0,0 +1,68 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include + +namespace nano +{ +class object_stream; +} + +namespace nano +{ +class block_details +{ + static_assert (std::is_same::type, uint8_t> (), "Epoch enum is not the proper type"); + static_assert (static_cast (nano::epoch::max) < (1 << 5), "Epoch max is too large for the sideband"); + +public: + block_details () = default; + block_details (nano::epoch const epoch_a, bool const is_send_a, bool const is_receive_a, bool const is_epoch_a); + static constexpr size_t size () + { + return 1; + } + bool operator== (block_details const & other_a) const; + void serialize (nano::stream &) const; + bool deserialize (nano::stream &); + nano::epoch epoch{ nano::epoch::epoch_0 }; + bool is_send{ false }; + bool is_receive{ false }; + bool is_epoch{ false }; + +private: + uint8_t packed () const; + void unpack (uint8_t); + +public: // Logging + void operator() (nano::object_stream &) const; +}; + +std::string state_subtype (nano::block_details const); + +class block_sideband final +{ +public: + block_sideband () = default; + block_sideband (nano::account const &, nano::block_hash const &, nano::amount const &, uint64_t const, nano::seconds_t const local_timestamp, nano::block_details const &, nano::epoch const source_epoch_a); + block_sideband (nano::account const &, nano::block_hash const &, nano::amount const &, uint64_t const, nano::seconds_t const local_timestamp, nano::epoch const epoch_a, bool const is_send, bool const is_receive, bool const is_epoch, nano::epoch const source_epoch_a); + void serialize (nano::stream &, nano::block_type) const; + bool deserialize (nano::stream &, nano::block_type); + static size_t size (nano::block_type); + nano::block_hash successor{ 0 }; + nano::account account{}; + nano::amount balance{ 0 }; + uint64_t height{ 0 }; + uint64_t timestamp{ 0 }; + nano::block_details details; + nano::epoch source_epoch{ nano::epoch::epoch_0 }; + +public: // Logging + void operator() (nano::object_stream &) const; +}; +} // namespace nano diff --git a/nano/lib/block_type.cpp b/nano/lib/block_type.cpp new file mode 100644 index 000000000..4afb9b0fd --- /dev/null +++ b/nano/lib/block_type.cpp @@ -0,0 +1,13 @@ +#include + +#include + +std::string_view nano::to_string (nano::block_type type) +{ + return magic_enum::enum_name (type); +} + +void nano::serialize_block_type (nano::stream & stream, const nano::block_type & type) +{ + nano::write (stream, type); +} diff --git a/nano/lib/block_type.hpp b/nano/lib/block_type.hpp new file mode 100644 index 000000000..020722e31 --- /dev/null +++ b/nano/lib/block_type.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include + +#include +#include + +namespace nano +{ +enum class block_type : uint8_t +{ + invalid = 0, + not_a_block = 1, + send = 2, + receive = 3, + open = 4, + change = 5, + state = 6 +}; + +std::string_view to_string (block_type); +/** + * Serialize block type as an 8-bit value + */ +void serialize_block_type (nano::stream &, nano::block_type const &); +} // namespace nano diff --git a/nano/lib/blocks.cpp b/nano/lib/blocks.cpp index 3a13bb386..0ad893339 100644 --- a/nano/lib/blocks.cpp +++ b/nano/lib/blocks.cpp @@ -1443,11 +1443,6 @@ std::shared_ptr nano::deserialize_block_json (boost::property_tree: return result; } -void nano::serialize_block_type (nano::stream & stream, const nano::block_type & type) -{ - nano::write (stream, type); -} - void nano::serialize_block (nano::stream & stream_a, nano::block const & block_a) { nano::serialize_block_type (stream_a, block_a.type ()); @@ -1986,8 +1981,3 @@ void nano::block_sideband::operator() (nano::object_stream & obs) const obs.write ("source_epoch", source_epoch); obs.write ("details", details); } - -std::string_view nano::to_string (nano::block_type type) -{ - return magic_enum::enum_name (type); -} diff --git a/nano/lib/blocks.hpp b/nano/lib/blocks.hpp index 19c31d95e..0fb5aee4a 100644 --- a/nano/lib/blocks.hpp +++ b/nano/lib/blocks.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -21,70 +22,6 @@ namespace nano class block_visitor; class mutable_block_visitor; -enum class block_type : uint8_t -{ - invalid = 0, - not_a_block = 1, - send = 2, - receive = 3, - open = 4, - change = 5, - state = 6 -}; - -std::string_view to_string (block_type); - -class block_details -{ - static_assert (std::is_same::type, uint8_t> (), "Epoch enum is not the proper type"); - static_assert (static_cast (nano::epoch::max) < (1 << 5), "Epoch max is too large for the sideband"); - -public: - block_details () = default; - block_details (nano::epoch const epoch_a, bool const is_send_a, bool const is_receive_a, bool const is_epoch_a); - static constexpr size_t size () - { - return 1; - } - bool operator== (block_details const & other_a) const; - void serialize (nano::stream &) const; - bool deserialize (nano::stream &); - nano::epoch epoch{ nano::epoch::epoch_0 }; - bool is_send{ false }; - bool is_receive{ false }; - bool is_epoch{ false }; - -private: - uint8_t packed () const; - void unpack (uint8_t); - -public: // Logging - void operator() (nano::object_stream &) const; -}; - -std::string state_subtype (nano::block_details const); - -class block_sideband final -{ -public: - block_sideband () = default; - block_sideband (nano::account const &, nano::block_hash const &, nano::amount const &, uint64_t const, nano::seconds_t const local_timestamp, nano::block_details const &, nano::epoch const source_epoch_a); - block_sideband (nano::account const &, nano::block_hash const &, nano::amount const &, uint64_t const, nano::seconds_t const local_timestamp, nano::epoch const epoch_a, bool const is_send, bool const is_receive, bool const is_epoch, nano::epoch const source_epoch_a); - void serialize (nano::stream &, nano::block_type) const; - bool deserialize (nano::stream &, nano::block_type); - static size_t size (nano::block_type); - nano::block_hash successor{ 0 }; - nano::account account{}; - nano::amount balance{ 0 }; - uint64_t height{ 0 }; - uint64_t timestamp{ 0 }; - nano::block_details details; - nano::epoch source_epoch{ nano::epoch::epoch_0 }; - -public: // Logging - void operator() (nano::object_stream &) const; -}; - class block { public: @@ -446,10 +383,6 @@ using block_uniquer = nano::uniquer; std::shared_ptr deserialize_block (nano::stream &); std::shared_ptr deserialize_block (nano::stream &, nano::block_type, nano::block_uniquer * = nullptr); std::shared_ptr deserialize_block_json (boost::property_tree::ptree const &, nano::block_uniquer * = nullptr); -/** - * Serialize block type as an 8-bit value - */ -void serialize_block_type (nano::stream &, nano::block_type const &); /** * Serialize a block prefixed with an 8-bit typecode */ diff --git a/nano/store/block.hpp b/nano/store/block.hpp index 826aafc41..c0d252a65 100644 --- a/nano/store/block.hpp +++ b/nano/store/block.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include