git / moonbite-core / src/libmw/include/mw/models/block/Block.h · raw
#pragma once#include <mw/common/Macros.h>#include <mw/common/Traits.h>#include <mw/models/tx/TxBody.h>#include <mw/models/block/Header.h>#include <mw/models/tx/Kernel.h>#include <mw/models/tx/PegInCoin.h>#include <mw/models/tx/PegOutCoin.h>#include <serialize.h>#include <algorithm>MW_NAMESPACEclass Block final : public Traits::IPrintable, public Traits::ISerializable, public Traits::IHashable{public: using Ptr = std::shared_ptr<Block>; using CPtr = std::shared_ptr<const Block>; // // Constructors // Block(const mw::Header::CPtr& pHeader, TxBody body) : m_pHeader(pHeader), m_body(std::move(body)) { } Block(const Block& other) = default; Block(Block&& other) noexcept = default; Block() = default; // // Operators // Block& operator=(const Block& other) = default; Block& operator=(Block&& other) noexcept = default; // // Getters // const mw::Header::CPtr& GetHeader() const noexcept { return m_pHeader; } const TxBody& GetTxBody() const noexcept { return m_body; } const std::vector<Input>& GetInputs() const noexcept { return m_body.GetInputs(); } const std::vector<Output>& GetOutputs() const noexcept { return m_body.GetOutputs(); } const std::vector<Kernel>& GetKernels() const noexcept { return m_body.GetKernels(); } int32_t GetHeight() const noexcept { return m_pHeader->GetHeight(); } const BlindingFactor& GetKernelOffset() const noexcept { return m_pHeader->GetKernelOffset(); } const BlindingFactor& GetStealthOffset() const noexcept { return m_pHeader->GetStealthOffset(); } boost::optional<CAmount> GetTotalFee() const noexcept { return m_body.GetTotalFee(); } std::vector<PegInCoin> GetPegIns() const noexcept { return m_body.GetPegIns(); } boost::optional<CAmount> GetPegInAmount() const noexcept { return m_body.GetPegInAmount(); } std::vector<PegOutCoin> GetPegOuts() const noexcept { return m_body.GetPegOuts(); } boost::optional<CAmount> GetSupplyChange() const noexcept { return m_body.GetSupplyChange(); } // // Serialization/Deserialization // IMPL_SERIALIZABLE(Block, obj) { READWRITE(obj.m_pHeader, obj.m_body); } // // Traits // const mw::Hash& GetHash() const noexcept final { return m_pHeader->GetHash(); } std::string Format() const final { return "Block(" + GetHash().ToHex() + ")"; } // // Context-free validation of the block. // void Validate() const;private: mw::Header::CPtr m_pHeader; TxBody m_body;};class MutBlock{public: // // Constructors // MutBlock() = default; MutBlock(const Block::CPtr& pBlock) : m_header(pBlock->GetHeader()), m_inputs(pBlock->GetInputs()), m_outputs(pBlock->GetOutputs()), m_kernels(pBlock->GetKernels()) {} MutBlock& SetInputs(std::vector<Input> inputs) noexcept { m_inputs = std::move(inputs); return *this; } MutBlock& SetOutputs(std::vector<Output> outputs) noexcept { m_outputs = std::move(outputs); return *this; } MutBlock& SetKernels(std::vector<Kernel> kernels) noexcept { m_kernels = std::move(kernels); return *this; } mw::Block::CPtr Build() const { return std::make_shared<mw::Block>( m_header.Build(), TxBody(m_inputs, m_outputs, m_kernels) ); }private: MutHeader m_header; std::vector<Input> m_inputs; std::vector<Output> m_outputs; std::vector<Kernel> m_kernels;};END_NAMESPACE