git / moonbite-core / src/libmw/include/mw/models/crypto/RangeProof.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 <util/strencodings.h>#include <cassert>class RangeProof :    public Traits::IPrintable,    public Traits::ISerializable,    public Traits::IHashable{public:    using CPtr = std::shared_ptr<const RangeProof>;    enum { SIZE = 675 };    //    // Constructors    //    RangeProof() noexcept : m_bytes(SIZE) {}    RangeProof(std::vector<uint8_t>&& bytes) : m_bytes(std::move(bytes))    {        assert(m_bytes.size() == SIZE);        m_hash = Hashed(*this);    }    RangeProof(const RangeProof& other) = default;    RangeProof(RangeProof&& other) noexcept = default;    //    // Destructor    //    virtual ~RangeProof() = default;    //    // Operators    //    RangeProof& operator=(const RangeProof& other) = default;    RangeProof& operator=(RangeProof&& other) noexcept = default;    bool operator==(const RangeProof& other) const noexcept { return m_bytes == other.m_bytes; }    //    // Getters    //    const std::vector<uint8_t>& vec() const { return m_bytes; }    const uint8_t* data() const { return m_bytes.data(); }    size_t size() const { return m_bytes.size(); }    //    // Serialization/Deserialization    //    IMPL_SERIALIZED(RangeProof);    template <typename Stream>    void Serialize(Stream& s) const    {        s.write((const char*)m_bytes.data(), SIZE);    }    template <typename Stream>    void Unserialize(Stream& s)    {        s.read((char*)m_bytes.data(), SIZE);        m_hash = Hashed(*this);    }    //    // Traits    //    std::string Format() const final { return HexStr(m_bytes); }    const mw::Hash& GetHash() const noexcept final { return m_hash; }private:    // The proof itself, at most 675 bytes long.    std::vector<uint8_t> m_bytes;    mw::Hash m_hash;};