git / moonbite-core / src/libmw/include/mw/models/crypto/PublicKey.h · raw
#pragma once#include <mw/common/Traits.h>#include <mw/models/crypto/BigInteger.h>#include <mw/models/crypto/SecretKey.h>#include <pubkey.h>#include <boost/functional/hash.hpp>class PublicKey : public Traits::IPrintable, public Traits::ISerializable{public: // // Constructors // PublicKey() = default; PublicKey(BigInt<33>&& compressed) : m_compressed(std::move(compressed)) {} PublicKey(const BigInt<33>& compressed) : m_compressed(compressed) {} PublicKey(const uint8_t* compressed) : m_compressed(compressed) {} PublicKey(const PublicKey&) = default; PublicKey(PublicKey&&) noexcept = default; // // Destructor // virtual ~PublicKey() = default; // // Operators // PublicKey& operator=(const PublicKey& rhs) = default; PublicKey& operator=(PublicKey&& other) noexcept = default; bool operator==(const PublicKey& rhs) const { return m_compressed == rhs.m_compressed; } bool operator!=(const PublicKey& rhs) const { return m_compressed != rhs.m_compressed; } bool operator<=(const PublicKey& rhs) const { return m_compressed <= rhs.m_compressed; } bool operator<(const PublicKey& rhs) const { return m_compressed < rhs.m_compressed; } bool operator>=(const PublicKey& rhs) const { return m_compressed >= rhs.m_compressed; } bool operator>(const PublicKey& rhs) const { return m_compressed > rhs.m_compressed; } // // Factory // static PublicKey From(const SecretKey& key); static PublicKey From(const Commitment& commitment); static PublicKey Random(); const BigInt<33>& GetBigInt() const { return m_compressed; } CKeyID GetID() const { return CPubKey(vec()).GetID(); } std::array<uint8_t, 33> array() const { return m_compressed.ToArray(); } const std::vector<uint8_t>& vec() const { return m_compressed.vec(); } const uint8_t& operator[](const size_t x) const { return m_compressed[x]; } const uint8_t* data() const { return m_compressed.data(); } uint8_t* data() { return m_compressed.data(); } size_t size() const { return m_compressed.size(); } // // Point Arithmetic // PublicKey Mul(const SecretKey& mul) const; PublicKey Div(const SecretKey& div) const; PublicKey Add(const SecretKey& add) const; PublicKey Add(const PublicKey& add) const; PublicKey Sub(const SecretKey& sub) const; PublicKey Sub(const PublicKey& sub) const; // // Serialization/Deserialization // IMPL_SERIALIZABLE(PublicKey, obj) { READWRITE(obj.m_compressed); } std::string ToHex() const { return m_compressed.ToHex(); } std::string Format() const final { return m_compressed.ToHex(); }private: BigInt<33> m_compressed;};namespace std{ template<> struct hash<PublicKey> { size_t operator()(const PublicKey& pubkey) const { return boost::hash_value(pubkey.vec()); } };}