// Copyright (c) 2014 The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
-// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+// file COPYING or https://www.opensource.org/licenses/mit-license.php .
#include "base58.h"
-#include "hash.h"
-#include "uint256.h"
-
-#include "version.h"
-#include "streams.h"
+#include <hash.h>
+#include <uint256.h>
#include <assert.h>
-#include <stdint.h>
#include <string.h>
+#include <stdint.h>
#include <vector>
#include <string>
#include <boost/variant/apply_visitor.hpp>
return DecodeBase58Check(str.c_str(), vchRet);
}
+
CBase58Data::CBase58Data()
{
vchVersion.clear();
vchVersion = vchVersionIn;
vchData.resize(nSize);
if (!vchData.empty())
- memcpy(vchData.data(), pdata, nSize);
+ memcpy(&vchData[0], pdata, nSize);
}
void CBase58Data::SetData(const std::vector<unsigned char>& vchVersionIn, const unsigned char* pbegin, const unsigned char* pend)
vchVersion.assign(vchTemp.begin(), vchTemp.begin() + nVersionBytes);
vchData.resize(vchTemp.size() - nVersionBytes);
if (!vchData.empty())
- memcpy(vchData.data(), vchTemp.data() + nVersionBytes, vchData.size());
- memory_cleanse(vchTemp.data(), vchTemp.size());
+ memcpy(&vchData[0], &vchTemp[nVersionBytes], vchData.size());
+ memory_cleanse(&vchTemp[0], vchData.size());
return true;
}
namespace
{
-/** base58-encoded Bitcoin addresses.
- * Public-key-hash-addresses have version 0 (or 111 testnet).
- * The data vector contains RIPEMD160(SHA256(pubkey)), where pubkey is the serialized public key.
- * Script-hash-addresses have version 5 (or 196 testnet).
- * The data vector contains RIPEMD160(SHA256(cscript)), where cscript is the serialized redemption script.
- */
-class CBitcoinAddress : public CBase58Data {
-public:
- bool Set(const CKeyID &id);
- bool Set(const CScriptID &id);
- bool Set(const CTxDestination &dest);
- bool IsValid() const;
- bool IsValid(const CChainParams ¶ms) const;
- bool SetString(const char* pszSecret);
- bool SetString(const std::string& strSecret);
-
- CBitcoinAddress() {}
- CBitcoinAddress(const CTxDestination &dest) { Set(dest); }
- CBitcoinAddress(const std::string& strAddress) { SetString(strAddress); }
- CBitcoinAddress(const char* pszAddress) { SetString(pszAddress); }
-
- CTxDestination Get() const;
-};
-
class CBitcoinAddressVisitor : public boost::static_visitor<bool>
{
private:
CBitcoinAddressVisitor(CBitcoinAddress* addrIn) : addr(addrIn) {}
bool operator()(const CKeyID& id) const { return addr->Set(id); }
+ bool operator()(const CPubKey& key) const { return addr->Set(key); }
bool operator()(const CScriptID& id) const { return addr->Set(id); }
bool operator()(const CNoDestination& no) const { return false; }
};
return true;
}
+bool CBitcoinAddress::Set(const CPubKey& key)
+{
+ CKeyID id = key.GetID();
+ SetData(Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS), &id, 20);
+ return true;
+}
+
bool CBitcoinAddress::Set(const CScriptID& id)
{
SetData(Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS), &id, 20);
bool CBitcoinAddress::SetString(const char* pszAddress)
{
- return CBase58Data::SetString(pszAddress, 2);
+ return CBase58Data::SetString(pszAddress, 1);//2);
}
bool CBitcoinAddress::SetString(const std::string& strAddress)
if (!IsValid())
return CNoDestination();
uint160 id;
- memcpy(&id, vchData.data(), 20);
+ memcpy(&id, &vchData[0], 20);
if (vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS))
return CKeyID(id);
else if (vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS))
return CNoDestination();
}
+bool CBitcoinAddress::GetIndexKey(uint160& hashBytes, int& type) const
+{
+ if (!IsValid()) {
+ return false;
+ } else if (vchVersion == Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS)) {
+ memcpy(&hashBytes, &vchData[0], 20);
+ type = 1;
+ return true;
+ } else if (vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS)) {
+ memcpy(&hashBytes, &vchData[0], 20);
+ type = 2;
+ return true;
+ }
+
+ return false;
+}
+
+bool CBitcoinAddress::GetKeyID(CKeyID& keyID) const
+{
+ if (!IsValid() || vchVersion != Params().Base58Prefix(CChainParams::PUBKEY_ADDRESS))
+ return false;
+ uint160 id;
+ memcpy(&id, &vchData[0], 20);
+ keyID = CKeyID(id);
+ return true;
+}
+
+bool CBitcoinAddress::GetKeyID_NoCheck(CKeyID& keyID) const
+{
+ uint160 id;
+ memcpy(&id, &vchData[0], 20);
+ keyID = CKeyID(id);
+ return true;
+}
+
+bool CBitcoinAddress::IsScript() const
+{
+ return IsValid() && vchVersion == Params().Base58Prefix(CChainParams::SCRIPT_ADDRESS);
+}
+
void CBitcoinSecret::SetKey(const CKey& vchSecret)
{
assert(vchSecret.IsValid());
return SetString(strSecret.c_str());
}
-std::string EncodeDestination(const CTxDestination& dest)
-{
- CBitcoinAddress addr(dest);
- if (!addr.IsValid()) return "";
- return addr.ToString();
-}
-
-CTxDestination DecodeDestination(const std::string& str)
-{
- return CBitcoinAddress(str).Get();
-}
-
-bool IsValidDestinationString(const std::string& str, const CChainParams& params)
-{
- return CBitcoinAddress(str).IsValid(params);
-}
-
-bool IsValidDestinationString(const std::string& str)
-{
- return CBitcoinAddress(str).IsValid();
-}
-
template<class DATA_TYPE, CChainParams::Base58Type PREFIX, size_t SER_SIZE>
bool CZCEncoding<DATA_TYPE, PREFIX, SER_SIZE>::Set(const DATA_TYPE& addr)
{
ss >> ret;
return ret;
}
-
-// Explicit instantiations for libzcash::PaymentAddress
-template bool CZCEncoding<libzcash::PaymentAddress,
- CChainParams::ZCPAYMENT_ADDRRESS,
- libzcash::SerializedPaymentAddressSize>::Set(const libzcash::PaymentAddress& addr);
-template libzcash::PaymentAddress CZCEncoding<libzcash::PaymentAddress,
- CChainParams::ZCPAYMENT_ADDRRESS,
- libzcash::SerializedPaymentAddressSize>::Get() const;
-
-// Explicit instantiations for libzcash::ViewingKey
-template bool CZCEncoding<libzcash::ViewingKey,
- CChainParams::ZCVIEWING_KEY,
- libzcash::SerializedViewingKeySize>::Set(const libzcash::ViewingKey& vk);
-template libzcash::ViewingKey CZCEncoding<libzcash::ViewingKey,
- CChainParams::ZCVIEWING_KEY,
- libzcash::SerializedViewingKeySize>::Get() const;
-
-// Explicit instantiations for libzcash::SpendingKey
-template bool CZCEncoding<libzcash::SpendingKey,
- CChainParams::ZCSPENDING_KEY,
- libzcash::SerializedSpendingKeySize>::Set(const libzcash::SpendingKey& sk);
-template libzcash::SpendingKey CZCEncoding<libzcash::SpendingKey,
- CChainParams::ZCSPENDING_KEY,
- libzcash::SerializedSpendingKeySize>::Get() const;