git / moonbite-core / src/libmw/include/mw/models/tx/TxBody.h · raw
#pragma once// Copyright (c) 2018-2019 David Burkett// Distributed under the MIT software license, see the accompanying// file LICENSE or http://www.opensource.org/licenses/mit-license.php.#include <mw/common/Logger.h>#include <mw/common/Traits.h>#include <mw/models/tx/Input.h>#include <mw/models/tx/Output.h>#include <mw/models/tx/Kernel.h>#include <mw/models/tx/PegInCoin.h>#include <mw/models/tx/PegOutCoin.h>#include <mw/crypto/Bulletproofs.h>#include <mw/crypto/Schnorr.h>#include <memory>#include <vector>////////////////////////////////////////// TRANSACTION BODY - Container for all inputs, outputs, and kernels in a transaction or block.////////////////////////////////////////class TxBody : public Traits::ISerializable{public: using CPtr = std::shared_ptr<const TxBody>; // // Constructors // TxBody(std::vector<Input> inputs, std::vector<Output> outputs, std::vector<Kernel> kernels) : m_inputs(std::move(inputs)), m_outputs(std::move(outputs)), m_kernels(std::move(kernels)) { } TxBody(const TxBody& other) = default; TxBody(TxBody&& other) noexcept = default; TxBody() = default; // // Destructor // virtual ~TxBody() = default; // // Operators // TxBody& operator=(const TxBody& other) = default; TxBody& operator=(TxBody&& other) noexcept = default; bool operator==(const TxBody& rhs) const noexcept { return m_inputs == rhs.m_inputs && m_outputs == rhs.m_outputs && m_kernels == rhs.m_kernels; } // // Getters // const std::vector<Input>& GetInputs() const noexcept { return m_inputs; } const std::vector<Output>& GetOutputs() const noexcept { return m_outputs; } const std::vector<Kernel>& GetKernels() const noexcept { return m_kernels; } std::vector<Commitment> GetKernelCommits() const noexcept { return Commitments::From(m_kernels); } std::vector<Commitment> GetInputCommits() const noexcept { return Commitments::From(m_inputs); } std::vector<Commitment> GetOutputCommits() const noexcept { return Commitments::From(m_outputs); } std::vector<mw::Hash> GetKernelIDs() const noexcept { return Hashes::From(m_kernels); } std::vector<mw::Hash> GetSpentIDs() const noexcept { std::vector<mw::Hash> output_ids; std::transform( m_inputs.cbegin(), m_inputs.cend(), std::back_inserter(output_ids), [](const Input& input) { return input.GetOutputID(); }); return output_ids; } std::vector<mw::Hash> GetOutputIDs() const noexcept { return Hashes::From(m_outputs); } std::vector<PublicKey> GetStealthExcesses() const noexcept { std::vector<PublicKey> stealth_excesses; for (const Kernel& kernel : m_kernels) { if (kernel.HasStealthExcess()) { stealth_excesses.push_back(kernel.GetStealthExcess()); } } return stealth_excesses; } std::vector<PegInCoin> GetPegIns() const noexcept; boost::optional<CAmount> GetPegInAmount() const noexcept; std::vector<PegOutCoin> GetPegOuts() const noexcept; boost::optional<CAmount> GetTotalFee() const noexcept; boost::optional<CAmount> GetSupplyChange() const noexcept; int32_t GetLockHeight() const noexcept; // // Serialization/Deserialization // IMPL_SERIALIZABLE(TxBody, obj) { READWRITE(obj.m_inputs, obj.m_outputs, obj.m_kernels); } void Validate() const;private: // List of inputs spent by the transaction. std::vector<Input> m_inputs; // List of outputs the transaction produces. std::vector<Output> m_outputs; // List of kernels that make up this transaction. std::vector<Kernel> m_kernels;};