|
|
@ -18,6 +18,8 @@ const size_t SerializedPaymentAddressSize = 64; |
|
|
|
const size_t SerializedViewingKeySize = 64; |
|
|
|
const size_t SerializedSpendingKeySize = 32; |
|
|
|
|
|
|
|
typedef std::array<unsigned char, 11> diversifier_t; |
|
|
|
|
|
|
|
class SproutPaymentAddress { |
|
|
|
public: |
|
|
|
uint256 a_pk; |
|
|
@ -97,6 +99,116 @@ typedef boost::variant<InvalidEncoding, SproutPaymentAddress> PaymentAddress; |
|
|
|
typedef boost::variant<InvalidEncoding, SproutViewingKey> ViewingKey; |
|
|
|
typedef boost::variant<InvalidEncoding, SproutSpendingKey> SpendingKey; |
|
|
|
|
|
|
|
//! Sapling functions.
|
|
|
|
class SaplingPaymentAddress { |
|
|
|
public: |
|
|
|
diversifier_t d; |
|
|
|
uint256 pk_d; |
|
|
|
|
|
|
|
SaplingPaymentAddress() : d(), pk_d() { } |
|
|
|
SaplingPaymentAddress(diversifier_t d, uint256 pk_d) : d(d), pk_d(pk_d) { } |
|
|
|
|
|
|
|
ADD_SERIALIZE_METHODS; |
|
|
|
|
|
|
|
template <typename Stream, typename Operation> |
|
|
|
inline void SerializationOp(Stream& s, Operation ser_action) { |
|
|
|
READWRITE(d); |
|
|
|
READWRITE(pk_d); |
|
|
|
} |
|
|
|
|
|
|
|
friend inline bool operator==(const SaplingPaymentAddress& a, const SaplingPaymentAddress& b) { |
|
|
|
return a.d == b.d && a.pk_d == b.pk_d; |
|
|
|
} |
|
|
|
friend inline bool operator<(const SaplingPaymentAddress& a, const SaplingPaymentAddress& b) { |
|
|
|
return (a.d < b.d || |
|
|
|
(a.d == b.d && a.pk_d < b.pk_d)); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
class SaplingInViewingKey : public uint256 { |
|
|
|
public: |
|
|
|
SaplingInViewingKey() : uint256() { } |
|
|
|
SaplingInViewingKey(uint256 ivk) : uint256(ivk) { } |
|
|
|
|
|
|
|
// Can pass in diversifier for Sapling addr
|
|
|
|
SaplingPaymentAddress address(diversifier_t d) const; |
|
|
|
}; |
|
|
|
|
|
|
|
class SaplingFullViewingKey { |
|
|
|
public: |
|
|
|
uint256 ak; |
|
|
|
uint256 nk; |
|
|
|
uint256 ovk; |
|
|
|
|
|
|
|
SaplingFullViewingKey() : ak(), nk(), ovk() { } |
|
|
|
SaplingFullViewingKey(uint256 ak, uint256 nk, uint256 ovk) : ak(ak), nk(nk), ovk(ovk) { } |
|
|
|
|
|
|
|
ADD_SERIALIZE_METHODS; |
|
|
|
|
|
|
|
template <typename Stream, typename Operation> |
|
|
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { |
|
|
|
READWRITE(ak); |
|
|
|
READWRITE(nk); |
|
|
|
READWRITE(ovk); |
|
|
|
} |
|
|
|
|
|
|
|
SaplingInViewingKey in_viewing_key() const; |
|
|
|
|
|
|
|
friend inline bool operator==(const SaplingFullViewingKey& a, const SaplingFullViewingKey& b) { |
|
|
|
return a.ak == b.ak && a.nk == b.nk && a.ovk == b.ovk; |
|
|
|
} |
|
|
|
friend inline bool operator<(const SaplingFullViewingKey& a, const SaplingFullViewingKey& b) { |
|
|
|
return (a.ak < b.ak || |
|
|
|
(a.ak == b.ak && a.nk < b.nk) || |
|
|
|
(a.ak == b.ak && a.nk == b.nk && a.ovk < b.ovk)); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
class SaplingExpandedSpendingKey { |
|
|
|
public: |
|
|
|
uint256 ask; |
|
|
|
uint256 nsk; |
|
|
|
uint256 ovk; |
|
|
|
|
|
|
|
SaplingExpandedSpendingKey() : ask(), nsk(), ovk() { } |
|
|
|
SaplingExpandedSpendingKey(uint256 ask, uint256 nsk, uint256 ovk) : ask(ask), nsk(nsk), ovk(ovk) { } |
|
|
|
|
|
|
|
ADD_SERIALIZE_METHODS; |
|
|
|
|
|
|
|
template <typename Stream, typename Operation> |
|
|
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { |
|
|
|
READWRITE(ask); |
|
|
|
READWRITE(nsk); |
|
|
|
READWRITE(ovk); |
|
|
|
} |
|
|
|
|
|
|
|
SaplingFullViewingKey full_viewing_key() const; |
|
|
|
|
|
|
|
friend inline bool operator==(const SaplingExpandedSpendingKey& a, const SaplingExpandedSpendingKey& b) { |
|
|
|
return a.ask == b.ask && a.nsk == b.nsk && a.ovk == b.ovk; |
|
|
|
} |
|
|
|
friend inline bool operator<(const SaplingExpandedSpendingKey& a, const SaplingExpandedSpendingKey& b) { |
|
|
|
return (a.ask < b.ask || |
|
|
|
(a.ask == b.ask && a.nsk < b.nsk) || |
|
|
|
(a.ask == b.ask && a.nsk == b.nsk && a.ovk < b.ovk)); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
class SaplingSpendingKey : public uint256 { |
|
|
|
public: |
|
|
|
SaplingSpendingKey() : uint256() { } |
|
|
|
SaplingSpendingKey(uint256 sk) : uint256(sk) { } |
|
|
|
|
|
|
|
static SaplingSpendingKey random(); |
|
|
|
|
|
|
|
SaplingExpandedSpendingKey expanded_spending_key() const; |
|
|
|
SaplingFullViewingKey full_viewing_key() const; |
|
|
|
|
|
|
|
// Can derive Sapling addr from default diversifier
|
|
|
|
SaplingPaymentAddress default_address() const; |
|
|
|
}; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** Check whether a PaymentAddress is not an InvalidEncoding. */ |
|
|
|