Add Sapling key classes to wallet, with new librustzcash APIs
This commit is contained in:
@@ -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. */
|
||||
|
||||
Reference in New Issue
Block a user