git / moonbite-core / src/libmw/include/mw/models/tx/Input.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/Traits.h>#include <mw/crypto/Hasher.h>#include <mw/models/crypto/Commitment.h>#include <mw/models/crypto/PublicKey.h>#include <mw/models/crypto/Signature.h>#include <mw/models/crypto/SignedMessage.h>////////////////////////////////////////// INPUT////////////////////////////////////////class Input : public Traits::ICommitted, public Traits::IHashable, public Traits::IPrintable, public Traits::ISerializable{ enum FeatureBit { STEALTH_KEY_FEATURE_BIT = 0x01, EXTRA_DATA_FEATURE_BIT = 0x02 };public: // // Constructors // Input(uint8_t features, mw::Hash output_id, Commitment commitment, PublicKey input_pubkey, PublicKey output_pubkey, Signature signature) : m_features(features), m_outputID(std::move(output_id)), m_commitment(std::move(commitment)), m_inputPubKey(std::move(input_pubkey)), m_outputPubKey(std::move(output_pubkey)), m_signature(std::move(signature)) { m_hash = Hashed(*this); } Input(const Input& input) = default; Input(Input&& input) noexcept = default; Input() = default; // // Factories // static Input Create(const mw::Hash& output_id, const Commitment& commitment, const SecretKey& input_key, const SecretKey& output_key); // // Destructor // virtual ~Input() = default; // // Operators // Input& operator=(const Input& input) = default; Input& operator=(Input&& input) noexcept = default; bool operator<(const Input& input) const noexcept { return m_hash < input.m_hash; } bool operator==(const Input& input) const noexcept { return m_hash == input.m_hash; } // // Getters // bool IsStandard() const noexcept { return m_features < FeatureBit::EXTRA_DATA_FEATURE_BIT; } const mw::Hash& GetOutputID() const noexcept { return m_outputID; } const Commitment& GetCommitment() const noexcept final { return m_commitment; } const PublicKey& GetOutputPubKey() const noexcept { return m_outputPubKey; } const boost::optional<PublicKey>& GetInputPubKey() const noexcept { return m_inputPubKey; } const std::vector<uint8_t>& GetExtraData() const noexcept { return m_extraData; } const Signature& GetSignature() const noexcept { return m_signature; } SignedMessage BuildSignedMsg() const; // // Serialization/Deserialization // IMPL_SERIALIZABLE(Input, obj) { READWRITE(obj.m_features); READWRITE(obj.m_outputID); READWRITE(obj.m_commitment); READWRITE(obj.m_outputPubKey); if (obj.m_features & STEALTH_KEY_FEATURE_BIT) { PublicKey input_pubkey; SER_WRITE(obj, input_pubkey = *obj.m_inputPubKey); READWRITE(input_pubkey); SER_READ(obj, obj.m_inputPubKey = boost::make_optional<PublicKey>(std::move(input_pubkey))); } if (obj.m_features & EXTRA_DATA_FEATURE_BIT) { READWRITE(obj.m_extraData); } READWRITE(obj.m_signature); SER_READ(obj, obj.m_hash = Hashed(obj)); } // // Traits // std::string Format() const final { return "Input(ID=" + GetOutputID().Format() + ")"; } const mw::Hash& GetHash() const noexcept final { return m_hash; }private: uint8_t m_features; // The ID of the output being spent. mw::Hash m_outputID; // The commit referencing the output being spent. Commitment m_commitment; // The input pubkey. boost::optional<PublicKey> m_inputPubKey; // The public key of the output being spent. PublicKey m_outputPubKey; std::vector<uint8_t> m_extraData; Signature m_signature; mw::Hash m_hash;};// Sorts by output ID (hash)static const struct{ bool operator()(const Input& a, const Input& b) const { return a.GetOutputID() < b.GetOutputID(); }} InputSort;