From 62b86d6afc468c42ba54f58ccefcc01c6d442124 Mon Sep 17 00:00:00 2001 From: Kris Nuttycombe Date: Fri, 19 Nov 2021 16:21:36 -0700 Subject: [PATCH] Use CKeyID and CScriptID instead of new P2PKH/P2SHAddress classes. --- src/gtest/test_keys.cpp | 8 ++++---- src/key_io.cpp | 12 ++++++------ src/pubkey.h | 1 + src/script/script.h | 10 ++++++++++ src/script/standard.h | 9 --------- src/zcash/Address.cpp | 12 ++++++------ src/zcash/Address.hpp | 25 ++++++++----------------- 7 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/gtest/test_keys.cpp b/src/gtest/test_keys.cpp index a632f3dec..2ad3ecfc2 100644 --- a/src/gtest/test_keys.cpp +++ b/src/gtest/test_keys.cpp @@ -78,11 +78,11 @@ namespace libzcash { return tfm::format("Sapling(%s)", HexStr(ss.begin(), ss.end())); } - std::string operator()(const P2SHAddress &p2sh) const { + std::string operator()(const CScriptID &p2sh) const { return tfm::format("P2SH(%s)", p2sh.GetHex()); } - std::string operator()(const P2PKHAddress &p2pkh) const { + std::string operator()(const CKeyID &p2pkh) const { return tfm::format("P2PKH(%s)", p2pkh.GetHex()); } @@ -140,11 +140,11 @@ TEST(Keys, EncodeAndDecodeUnified) ua.AddReceiver(r); } if (!test[1].isNull()) { - libzcash::P2SHAddress r(ParseHex(test[1].get_str())); + CScriptID r(ParseHex(test[1].get_str())); ua.AddReceiver(r); } if (!test[0].isNull()) { - libzcash::P2PKHAddress r(ParseHex(test[0].get_str())); + CKeyID r(ParseHex(test[0].get_str())); ua.AddReceiver(r); } diff --git a/src/key_io.cpp b/src/key_io.cpp index 671cc8d34..c8f180296 100644 --- a/src/key_io.cpp +++ b/src/key_io.cpp @@ -56,8 +56,8 @@ public: DataLenForReceiver() {} size_t operator()(const libzcash::SaplingPaymentAddress &zaddr) const { return 43; } - size_t operator()(const libzcash::P2SHAddress &p2sh) const { return 20; } - size_t operator()(const libzcash::P2PKHAddress &p2pkh) const { return 20; } + size_t operator()(const CScriptID &p2sh) const { return 20; } + size_t operator()(const CKeyID &p2pkh) const { return 20; } size_t operator()(const libzcash::UnknownReceiver &unknown) const { return unknown.data.size(); } }; @@ -82,11 +82,11 @@ public: memcpy(data, ss.data(), ss.size()); } - void operator()(const libzcash::P2SHAddress &p2sh) const { + void operator()(const CScriptID &p2sh) const { memcpy(data, p2sh.begin(), p2sh.size()); } - void operator()(const libzcash::P2PKHAddress &p2pkh) const { + void operator()(const CKeyID &p2pkh) const { memcpy(data, p2pkh.begin(), p2pkh.size()); } @@ -415,7 +415,7 @@ static bool AddP2SHReceiver(void* ua, const unsigned char* raw) reinterpret_cast(raw + 20), SER_NETWORK, PROTOCOL_VERSION); - libzcash::P2SHAddress receiver; + CScriptID receiver; ss >> receiver; return reinterpret_cast(ua)->AddReceiver(receiver); } @@ -430,7 +430,7 @@ static bool AddP2PKHReceiver(void* ua, const unsigned char* raw) reinterpret_cast(raw + 20), SER_NETWORK, PROTOCOL_VERSION); - libzcash::P2PKHAddress receiver; + CKeyID receiver; ss >> receiver; return reinterpret_cast(ua)->AddReceiver(receiver); } diff --git a/src/pubkey.h b/src/pubkey.h index 4cdfbef38..94ff547c4 100644 --- a/src/pubkey.h +++ b/src/pubkey.h @@ -22,6 +22,7 @@ class CKeyID : public uint160 public: CKeyID() : uint160() {} CKeyID(const uint160& in) : uint160(in) {} + explicit CKeyID(const std::vector& vch) : uint160(vch) {} }; typedef uint256 ChainCode; diff --git a/src/script/script.h b/src/script/script.h index e67119197..b20227caf 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -625,6 +625,16 @@ public: } }; +/** A reference to a CScript: the Hash160 of its serialization */ +class CScriptID : public uint160 +{ +public: + CScriptID() : uint160() {} + explicit CScriptID(const CScript& in); + CScriptID(const uint160& in) : uint160(in) {} + explicit CScriptID(const std::vector& vch) : uint160(vch) {} +}; + class CReserveScript { public: diff --git a/src/script/standard.h b/src/script/standard.h index 09a23368f..920ac165d 100644 --- a/src/script/standard.h +++ b/src/script/standard.h @@ -18,15 +18,6 @@ static const bool DEFAULT_ACCEPT_DATACARRIER = true; class CKeyID; class CScript; -/** A reference to a CScript: the Hash160 of its serialization (see script.h) */ -class CScriptID : public uint160 -{ -public: - CScriptID() : uint160() {} - explicit CScriptID(const CScript& in); - CScriptID(const uint160& in) : uint160(in) {} -}; - /** * Default setting for nMaxDatacarrierBytes. 80 bytes of data, +1 for OP_RETURN, * +2 for the pushdata opcodes. diff --git a/src/zcash/Address.cpp b/src/zcash/Address.cpp index dbd8e7c20..fe048c1a9 100644 --- a/src/zcash/Address.cpp +++ b/src/zcash/Address.cpp @@ -24,8 +24,8 @@ bool UnifiedAddress::AddReceiver(Receiver receiver) { auto t = std::visit(TypecodeForReceiver(), r); if ( (t == typecode) || - (std::holds_alternative(r) && std::holds_alternative(receiver)) || - (std::holds_alternative(r) && std::holds_alternative(receiver)) + (std::holds_alternative(r) && std::holds_alternative(receiver)) || + (std::holds_alternative(r) && std::holds_alternative(receiver)) ) { return false; } @@ -58,13 +58,13 @@ uint32_t TypecodeForReceiver::operator()( } uint32_t TypecodeForReceiver::operator()( - const libzcash::P2SHAddress &p2sh) const + const CScriptID &p2sh) const { return ZCASH_UA_TYPECODE_P2SH; } uint32_t TypecodeForReceiver::operator()( - const libzcash::P2PKHAddress &p2sh) const + const CKeyID &p2sh) const { return ZCASH_UA_TYPECODE_P2PKH; } @@ -82,13 +82,13 @@ std::optional ReceiverToRawAddress::operator()( } std::optional ReceiverToRawAddress::operator()( - const libzcash::P2SHAddress &p2sh) const + const CScriptID &p2sh) const { return std::nullopt; } std::optional ReceiverToRawAddress::operator()( - const libzcash::P2PKHAddress &p2sh) const + const CKeyID &p2sh) const { return std::nullopt; } diff --git a/src/zcash/Address.hpp b/src/zcash/Address.hpp index 8eec84ee5..fd95418d4 100644 --- a/src/zcash/Address.hpp +++ b/src/zcash/Address.hpp @@ -2,6 +2,8 @@ #define ZC_ADDRESS_H_ #include "uint256.h" +#include "pubkey.h" +#include "script/script.h" #include "zcash/address/sapling.hpp" #include "zcash/address/sprout.hpp" #include "zcash/address/zip32.h" @@ -9,17 +11,6 @@ #include namespace libzcash { -// We use new classes here instead of CKeyID and CScriptID to prevent a cyclic dependency. -class P2PKHAddress: public uint160 { -public: - P2PKHAddress() {} - explicit P2PKHAddress(const std::vector& vch) : uint160(vch) {} -}; -class P2SHAddress: public uint160 { -public: - P2SHAddress() {} - explicit P2SHAddress(const std::vector& vch) : uint160(vch) {} -}; /** Protocol addresses that can receive funds in a transaction. */ typedef std::variant RawAddress; @@ -53,8 +44,8 @@ public: */ typedef std::variant< SaplingPaymentAddress, - P2SHAddress, - P2PKHAddress, + CScriptID, + CKeyID, UnknownReceiver> Receiver; struct ReceiverIterator { @@ -165,8 +156,8 @@ public: TypecodeForReceiver() {} uint32_t operator()(const libzcash::SaplingPaymentAddress &zaddr) const; - uint32_t operator()(const libzcash::P2SHAddress &p2sh) const; - uint32_t operator()(const libzcash::P2PKHAddress &p2pkh) const; + uint32_t operator()(const CScriptID &p2sh) const; + uint32_t operator()(const CKeyID &p2pkh) const; uint32_t operator()(const libzcash::UnknownReceiver &p2pkh) const; }; @@ -178,8 +169,8 @@ public: ReceiverToRawAddress() {} std::optional operator()(const libzcash::SaplingPaymentAddress &zaddr) const; - std::optional operator()(const libzcash::P2SHAddress &p2sh) const; - std::optional operator()(const libzcash::P2PKHAddress &p2pkh) const; + std::optional operator()(const CScriptID &p2sh) const; + std::optional operator()(const CKeyID &p2pkh) const; std::optional operator()(const libzcash::UnknownReceiver &p2pkh) const; };