Split key_io (address/key encodings) off from base58
This commit is contained in:
parent
3e60c9fabd
commit
3d31e09cbb
|
@ -152,6 +152,7 @@ BITCOIN_CORE_H = \
|
||||||
httpserver.h \
|
httpserver.h \
|
||||||
init.h \
|
init.h \
|
||||||
key.h \
|
key.h \
|
||||||
|
key_io.h \
|
||||||
keystore.h \
|
keystore.h \
|
||||||
dbwrapper.h \
|
dbwrapper.h \
|
||||||
limitedmap.h \
|
limitedmap.h \
|
||||||
|
@ -368,6 +369,7 @@ libbitcoin_common_a_SOURCES = \
|
||||||
core_write.cpp \
|
core_write.cpp \
|
||||||
hash.cpp \
|
hash.cpp \
|
||||||
key.cpp \
|
key.cpp \
|
||||||
|
key_io.cpp \
|
||||||
keystore.cpp \
|
keystore.cpp \
|
||||||
netbase.cpp \
|
netbase.cpp \
|
||||||
primitives/block.cpp \
|
primitives/block.cpp \
|
||||||
|
|
249
src/base58.cpp
249
src/base58.cpp
|
@ -4,21 +4,12 @@
|
||||||
|
|
||||||
#include "base58.h"
|
#include "base58.h"
|
||||||
|
|
||||||
#include "hash.h"
|
#include <hash.h>
|
||||||
#include "script/script.h"
|
#include <uint256.h>
|
||||||
#include "uint256.h"
|
|
||||||
|
|
||||||
#include "version.h"
|
|
||||||
#include "streams.h"
|
|
||||||
|
|
||||||
#include <boost/variant/apply_visitor.hpp>
|
|
||||||
#include <boost/variant/static_visitor.hpp>
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
/** All alphanumeric characters except for "0", "I", "O", and "l" */
|
/** All alphanumeric characters except for "0", "I", "O", and "l" */
|
||||||
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
||||||
|
|
||||||
|
@ -143,239 +134,3 @@ bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>& vchRe
|
||||||
{
|
{
|
||||||
return DecodeBase58Check(str.c_str(), vchRet);
|
return DecodeBase58Check(str.c_str(), vchRet);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
|
||||||
{
|
|
||||||
class DestinationEncoder : public boost::static_visitor<std::string>
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
const CChainParams& m_params;
|
|
||||||
|
|
||||||
public:
|
|
||||||
DestinationEncoder(const CChainParams& params) : m_params(params) {}
|
|
||||||
|
|
||||||
std::string operator()(const CKeyID& id) const
|
|
||||||
{
|
|
||||||
std::vector<unsigned char> data = m_params.Base58Prefix(CChainParams::PUBKEY_ADDRESS);
|
|
||||||
data.insert(data.end(), id.begin(), id.end());
|
|
||||||
return EncodeBase58Check(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string operator()(const CScriptID& id) const
|
|
||||||
{
|
|
||||||
std::vector<unsigned char> data = m_params.Base58Prefix(CChainParams::SCRIPT_ADDRESS);
|
|
||||||
data.insert(data.end(), id.begin(), id.end());
|
|
||||||
return EncodeBase58Check(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string operator()(const CNoDestination& no) const { return ""; }
|
|
||||||
};
|
|
||||||
|
|
||||||
CTxDestination DecodeDestination(const std::string& str, const CChainParams& params)
|
|
||||||
{
|
|
||||||
std::vector<unsigned char> data;
|
|
||||||
uint160 hash;
|
|
||||||
if (DecodeBase58Check(str, data)) {
|
|
||||||
// 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.
|
|
||||||
const std::vector<unsigned char>& pubkey_prefix = params.Base58Prefix(CChainParams::PUBKEY_ADDRESS);
|
|
||||||
if (data.size() == hash.size() + pubkey_prefix.size() && std::equal(pubkey_prefix.begin(), pubkey_prefix.end(), data.begin())) {
|
|
||||||
std::copy(data.begin() + pubkey_prefix.size(), data.end(), hash.begin());
|
|
||||||
return CKeyID(hash);
|
|
||||||
}
|
|
||||||
// Script-hash-addresses have version 5 (or 196 testnet).
|
|
||||||
// The data vector contains RIPEMD160(SHA256(cscript)), where cscript is the serialized redemption script.
|
|
||||||
const std::vector<unsigned char>& script_prefix = params.Base58Prefix(CChainParams::SCRIPT_ADDRESS);
|
|
||||||
if (data.size() == hash.size() + script_prefix.size() && std::equal(script_prefix.begin(), script_prefix.end(), data.begin())) {
|
|
||||||
std::copy(data.begin() + script_prefix.size(), data.end(), hash.begin());
|
|
||||||
return CScriptID(hash);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return CNoDestination();
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
CKey DecodeSecret(const std::string& str)
|
|
||||||
{
|
|
||||||
CKey key;
|
|
||||||
std::vector<unsigned char> data;
|
|
||||||
if (DecodeBase58Check(str, data)) {
|
|
||||||
const std::vector<unsigned char>& privkey_prefix = Params().Base58Prefix(CChainParams::SECRET_KEY);
|
|
||||||
if ((data.size() == 32 + privkey_prefix.size() || (data.size() == 33 + privkey_prefix.size() && data.back() == 1)) &&
|
|
||||||
std::equal(privkey_prefix.begin(), privkey_prefix.end(), data.begin())) {
|
|
||||||
bool compressed = data.size() == 33 + privkey_prefix.size();
|
|
||||||
key.Set(data.begin() + privkey_prefix.size(), data.begin() + privkey_prefix.size() + 32, compressed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
memory_cleanse(data.data(), data.size());
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string EncodeSecret(const CKey& key)
|
|
||||||
{
|
|
||||||
assert(key.IsValid());
|
|
||||||
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::SECRET_KEY);
|
|
||||||
data.insert(data.end(), key.begin(), key.end());
|
|
||||||
if (key.IsCompressed()) {
|
|
||||||
data.push_back(1);
|
|
||||||
}
|
|
||||||
std::string ret = EncodeBase58Check(data);
|
|
||||||
memory_cleanse(data.data(), data.size());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
CExtPubKey DecodeExtPubKey(const std::string& str)
|
|
||||||
{
|
|
||||||
CExtPubKey key;
|
|
||||||
std::vector<unsigned char> data;
|
|
||||||
if (DecodeBase58Check(str, data)) {
|
|
||||||
const std::vector<unsigned char>& prefix = Params().Base58Prefix(CChainParams::EXT_PUBLIC_KEY);
|
|
||||||
if (data.size() == BIP32_EXTKEY_SIZE + prefix.size() && std::equal(prefix.begin(), prefix.end(), data.begin())) {
|
|
||||||
key.Decode(data.data() + prefix.size());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string EncodeExtPubKey(const CExtPubKey& key)
|
|
||||||
{
|
|
||||||
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::EXT_PUBLIC_KEY);
|
|
||||||
size_t size = data.size();
|
|
||||||
data.resize(size + BIP32_EXTKEY_SIZE);
|
|
||||||
key.Encode(data.data() + size);
|
|
||||||
std::string ret = EncodeBase58Check(data);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
CExtKey DecodeExtKey(const std::string& str)
|
|
||||||
{
|
|
||||||
CExtKey key;
|
|
||||||
std::vector<unsigned char> data;
|
|
||||||
if (DecodeBase58Check(str, data)) {
|
|
||||||
const std::vector<unsigned char>& prefix = Params().Base58Prefix(CChainParams::EXT_SECRET_KEY);
|
|
||||||
if (data.size() == BIP32_EXTKEY_SIZE + prefix.size() && std::equal(prefix.begin(), prefix.end(), data.begin())) {
|
|
||||||
key.Decode(data.data() + prefix.size());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string EncodeExtKey(const CExtKey& key)
|
|
||||||
{
|
|
||||||
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::EXT_SECRET_KEY);
|
|
||||||
size_t size = data.size();
|
|
||||||
data.resize(size + BIP32_EXTKEY_SIZE);
|
|
||||||
key.Encode(data.data() + size);
|
|
||||||
std::string ret = EncodeBase58Check(data);
|
|
||||||
memory_cleanse(data.data(), data.size());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string EncodeDestination(const CTxDestination& dest)
|
|
||||||
{
|
|
||||||
return boost::apply_visitor(DestinationEncoder(Params()), dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
CTxDestination DecodeDestination(const std::string& str)
|
|
||||||
{
|
|
||||||
return DecodeDestination(str, Params());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsValidDestinationString(const std::string& str, const CChainParams& params)
|
|
||||||
{
|
|
||||||
return IsValidDestination(DecodeDestination(str, params));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsValidDestinationString(const std::string& str)
|
|
||||||
{
|
|
||||||
return IsValidDestinationString(str, Params());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string EncodePaymentAddress(const libzcash::PaymentAddress& zaddr)
|
|
||||||
{
|
|
||||||
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
|
|
||||||
ss << zaddr;
|
|
||||||
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::ZCPAYMENT_ADDRRESS);
|
|
||||||
data.insert(data.end(), ss.begin(), ss.end());
|
|
||||||
return EncodeBase58Check(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
boost::optional<libzcash::PaymentAddress> DecodePaymentAddress(const std::string& str)
|
|
||||||
{
|
|
||||||
std::vector<unsigned char> data;
|
|
||||||
if (DecodeBase58Check(str, data)) {
|
|
||||||
const std::vector<unsigned char>& zaddr_prefix = Params().Base58Prefix(CChainParams::ZCPAYMENT_ADDRRESS);
|
|
||||||
if ((data.size() == libzcash::SerializedPaymentAddressSize + zaddr_prefix.size()) &&
|
|
||||||
std::equal(zaddr_prefix.begin(), zaddr_prefix.end(), data.begin())) {
|
|
||||||
CSerializeData serialized(data.begin() + zaddr_prefix.size(), data.end());
|
|
||||||
CDataStream ss(serialized, SER_NETWORK, PROTOCOL_VERSION);
|
|
||||||
libzcash::PaymentAddress ret;
|
|
||||||
ss >> ret;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return boost::none;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string EncodeViewingKey(const libzcash::ViewingKey& vk)
|
|
||||||
{
|
|
||||||
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
|
|
||||||
ss << vk;
|
|
||||||
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::ZCVIEWING_KEY);
|
|
||||||
data.insert(data.end(), ss.begin(), ss.end());
|
|
||||||
std::string ret = EncodeBase58Check(data);
|
|
||||||
memory_cleanse(data.data(), data.size());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
boost::optional<libzcash::ViewingKey> DecodeViewingKey(const std::string& str)
|
|
||||||
{
|
|
||||||
std::vector<unsigned char> data;
|
|
||||||
if (DecodeBase58Check(str, data)) {
|
|
||||||
const std::vector<unsigned char>& vk_prefix = Params().Base58Prefix(CChainParams::ZCVIEWING_KEY);
|
|
||||||
if ((data.size() == libzcash::SerializedViewingKeySize + vk_prefix.size()) &&
|
|
||||||
std::equal(vk_prefix.begin(), vk_prefix.end(), data.begin())) {
|
|
||||||
CSerializeData serialized(data.begin() + vk_prefix.size(), data.end());
|
|
||||||
CDataStream ss(serialized, SER_NETWORK, PROTOCOL_VERSION);
|
|
||||||
libzcash::ViewingKey ret;
|
|
||||||
ss >> ret;
|
|
||||||
memory_cleanse(serialized.data(), serialized.size());
|
|
||||||
memory_cleanse(data.data(), data.size());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
memory_cleanse(data.data(), data.size());
|
|
||||||
return boost::none;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string EncodeSpendingKey(const libzcash::SpendingKey& zkey)
|
|
||||||
{
|
|
||||||
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
|
|
||||||
ss << zkey;
|
|
||||||
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::ZCSPENDING_KEY);
|
|
||||||
data.insert(data.end(), ss.begin(), ss.end());
|
|
||||||
std::string ret = EncodeBase58Check(data);
|
|
||||||
memory_cleanse(data.data(), data.size());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
boost::optional<libzcash::SpendingKey> DecodeSpendingKey(const std::string& str)
|
|
||||||
{
|
|
||||||
std::vector<unsigned char> data;
|
|
||||||
if (DecodeBase58Check(str, data)) {
|
|
||||||
const std::vector<unsigned char>& zkey_prefix = Params().Base58Prefix(CChainParams::ZCSPENDING_KEY);
|
|
||||||
if ((data.size() == libzcash::SerializedSpendingKeySize + zkey_prefix.size()) &&
|
|
||||||
std::equal(zkey_prefix.begin(), zkey_prefix.end(), data.begin())) {
|
|
||||||
CSerializeData serialized(data.begin() + zkey_prefix.size(), data.end());
|
|
||||||
CDataStream ss(serialized, SER_NETWORK, PROTOCOL_VERSION);
|
|
||||||
libzcash::SpendingKey ret;
|
|
||||||
ss >> ret;
|
|
||||||
memory_cleanse(serialized.data(), serialized.size());
|
|
||||||
memory_cleanse(data.data(), data.size());
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
memory_cleanse(data.data(), data.size());
|
|
||||||
return boost::none;
|
|
||||||
}
|
|
||||||
|
|
33
src/base58.h
33
src/base58.h
|
@ -14,13 +14,6 @@
|
||||||
#ifndef BITCOIN_BASE58_H
|
#ifndef BITCOIN_BASE58_H
|
||||||
#define BITCOIN_BASE58_H
|
#define BITCOIN_BASE58_H
|
||||||
|
|
||||||
#include "chainparams.h"
|
|
||||||
#include "key.h"
|
|
||||||
#include "pubkey.h"
|
|
||||||
#include "script/standard.h"
|
|
||||||
#include "support/allocators/zeroafterfree.h"
|
|
||||||
#include "zcash/Address.hpp"
|
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -57,34 +50,12 @@ std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn);
|
||||||
* Decode a base58-encoded string (psz) that includes a checksum into a byte
|
* Decode a base58-encoded string (psz) that includes a checksum into a byte
|
||||||
* vector (vchRet), return true if decoding is successful
|
* vector (vchRet), return true if decoding is successful
|
||||||
*/
|
*/
|
||||||
inline bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRet);
|
bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRet);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode a base58-encoded string (str) that includes a checksum into a byte
|
* Decode a base58-encoded string (str) that includes a checksum into a byte
|
||||||
* vector (vchRet), return true if decoding is successful
|
* vector (vchRet), return true if decoding is successful
|
||||||
*/
|
*/
|
||||||
inline bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>& vchRet);
|
bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>& vchRet);
|
||||||
|
|
||||||
CKey DecodeSecret(const std::string& str);
|
|
||||||
std::string EncodeSecret(const CKey& key);
|
|
||||||
|
|
||||||
CExtKey DecodeExtKey(const std::string& str);
|
|
||||||
std::string EncodeExtKey(const CExtKey& extkey);
|
|
||||||
CExtPubKey DecodeExtPubKey(const std::string& str);
|
|
||||||
std::string EncodeExtPubKey(const CExtPubKey& extpubkey);
|
|
||||||
|
|
||||||
std::string EncodeDestination(const CTxDestination& dest);
|
|
||||||
CTxDestination DecodeDestination(const std::string& str);
|
|
||||||
bool IsValidDestinationString(const std::string& str);
|
|
||||||
bool IsValidDestinationString(const std::string& str, const CChainParams& params);
|
|
||||||
|
|
||||||
std::string EncodePaymentAddress(const libzcash::PaymentAddress& zaddr);
|
|
||||||
boost::optional<libzcash::PaymentAddress> DecodePaymentAddress(const std::string& str);
|
|
||||||
|
|
||||||
std::string EncodeViewingKey(const libzcash::ViewingKey& vk);
|
|
||||||
boost::optional<libzcash::ViewingKey> DecodeViewingKey(const std::string& str);
|
|
||||||
|
|
||||||
std::string EncodeSpendingKey(const libzcash::SpendingKey& zkey);
|
|
||||||
boost::optional<libzcash::SpendingKey> DecodeSpendingKey(const std::string& str);
|
|
||||||
|
|
||||||
#endif // BITCOIN_BASE58_H
|
#endif // BITCOIN_BASE58_H
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
// Distributed under the MIT software license, see the accompanying
|
// Distributed under the MIT software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#include "base58.h"
|
|
||||||
#include "clientversion.h"
|
#include "clientversion.h"
|
||||||
#include "coins.h"
|
#include "coins.h"
|
||||||
#include "consensus/consensus.h"
|
#include "consensus/consensus.h"
|
||||||
#include "consensus/upgrades.h"
|
#include "consensus/upgrades.h"
|
||||||
#include "core_io.h"
|
#include "core_io.h"
|
||||||
|
#include "key_io.h"
|
||||||
#include "keystore.h"
|
#include "keystore.h"
|
||||||
#include "primitives/transaction.h"
|
#include "primitives/transaction.h"
|
||||||
#include "script/script.h"
|
#include "script/script.h"
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include "core_io.h"
|
#include "core_io.h"
|
||||||
|
|
||||||
#include "base58.h"
|
#include "key_io.h"
|
||||||
#include "primitives/transaction.h"
|
#include "primitives/transaction.h"
|
||||||
#include "script/script.h"
|
#include "script/script.h"
|
||||||
#include "script/standard.h"
|
#include "script/standard.h"
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
#include "httprpc.h"
|
#include "httprpc.h"
|
||||||
|
|
||||||
#include "base58.h"
|
|
||||||
#include "chainparams.h"
|
#include "chainparams.h"
|
||||||
#include "httpserver.h"
|
#include "httpserver.h"
|
||||||
|
#include "key_io.h"
|
||||||
#include "rpcprotocol.h"
|
#include "rpcprotocol.h"
|
||||||
#include "rpcserver.h"
|
#include "rpcserver.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
|
|
|
@ -0,0 +1,254 @@
|
||||||
|
// Copyright (c) 2014-2016 The Bitcoin Core developers
|
||||||
|
// Copyright (c) 2016-2018 The Zcash developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#include <key_io.h>
|
||||||
|
|
||||||
|
#include <base58.h>
|
||||||
|
#include <bech32.h>
|
||||||
|
#include <script/script.h>
|
||||||
|
#include <utilstrencodings.h>
|
||||||
|
|
||||||
|
#include <boost/variant/apply_visitor.hpp>
|
||||||
|
#include <boost/variant/static_visitor.hpp>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
class DestinationEncoder : public boost::static_visitor<std::string>
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const CChainParams& m_params;
|
||||||
|
|
||||||
|
public:
|
||||||
|
DestinationEncoder(const CChainParams& params) : m_params(params) {}
|
||||||
|
|
||||||
|
std::string operator()(const CKeyID& id) const
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> data = m_params.Base58Prefix(CChainParams::PUBKEY_ADDRESS);
|
||||||
|
data.insert(data.end(), id.begin(), id.end());
|
||||||
|
return EncodeBase58Check(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string operator()(const CScriptID& id) const
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> data = m_params.Base58Prefix(CChainParams::SCRIPT_ADDRESS);
|
||||||
|
data.insert(data.end(), id.begin(), id.end());
|
||||||
|
return EncodeBase58Check(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string operator()(const CNoDestination& no) const { return {}; }
|
||||||
|
};
|
||||||
|
|
||||||
|
CTxDestination DecodeDestination(const std::string& str, const CChainParams& params)
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> data;
|
||||||
|
uint160 hash;
|
||||||
|
if (DecodeBase58Check(str, data)) {
|
||||||
|
// 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.
|
||||||
|
const std::vector<unsigned char>& pubkey_prefix = params.Base58Prefix(CChainParams::PUBKEY_ADDRESS);
|
||||||
|
if (data.size() == hash.size() + pubkey_prefix.size() && std::equal(pubkey_prefix.begin(), pubkey_prefix.end(), data.begin())) {
|
||||||
|
std::copy(data.begin() + pubkey_prefix.size(), data.end(), hash.begin());
|
||||||
|
return CKeyID(hash);
|
||||||
|
}
|
||||||
|
// Script-hash-addresses have version 5 (or 196 testnet).
|
||||||
|
// The data vector contains RIPEMD160(SHA256(cscript)), where cscript is the serialized redemption script.
|
||||||
|
const std::vector<unsigned char>& script_prefix = params.Base58Prefix(CChainParams::SCRIPT_ADDRESS);
|
||||||
|
if (data.size() == hash.size() + script_prefix.size() && std::equal(script_prefix.begin(), script_prefix.end(), data.begin())) {
|
||||||
|
std::copy(data.begin() + script_prefix.size(), data.end(), hash.begin());
|
||||||
|
return CScriptID(hash);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CNoDestination();
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
CKey DecodeSecret(const std::string& str)
|
||||||
|
{
|
||||||
|
CKey key;
|
||||||
|
std::vector<unsigned char> data;
|
||||||
|
if (DecodeBase58Check(str, data)) {
|
||||||
|
const std::vector<unsigned char>& privkey_prefix = Params().Base58Prefix(CChainParams::SECRET_KEY);
|
||||||
|
if ((data.size() == 32 + privkey_prefix.size() || (data.size() == 33 + privkey_prefix.size() && data.back() == 1)) &&
|
||||||
|
std::equal(privkey_prefix.begin(), privkey_prefix.end(), data.begin())) {
|
||||||
|
bool compressed = data.size() == 33 + privkey_prefix.size();
|
||||||
|
key.Set(data.begin() + privkey_prefix.size(), data.begin() + privkey_prefix.size() + 32, compressed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memory_cleanse(data.data(), data.size());
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EncodeSecret(const CKey& key)
|
||||||
|
{
|
||||||
|
assert(key.IsValid());
|
||||||
|
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::SECRET_KEY);
|
||||||
|
data.insert(data.end(), key.begin(), key.end());
|
||||||
|
if (key.IsCompressed()) {
|
||||||
|
data.push_back(1);
|
||||||
|
}
|
||||||
|
std::string ret = EncodeBase58Check(data);
|
||||||
|
memory_cleanse(data.data(), data.size());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
CExtPubKey DecodeExtPubKey(const std::string& str)
|
||||||
|
{
|
||||||
|
CExtPubKey key;
|
||||||
|
std::vector<unsigned char> data;
|
||||||
|
if (DecodeBase58Check(str, data)) {
|
||||||
|
const std::vector<unsigned char>& prefix = Params().Base58Prefix(CChainParams::EXT_PUBLIC_KEY);
|
||||||
|
if (data.size() == BIP32_EXTKEY_SIZE + prefix.size() && std::equal(prefix.begin(), prefix.end(), data.begin())) {
|
||||||
|
key.Decode(data.data() + prefix.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EncodeExtPubKey(const CExtPubKey& key)
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::EXT_PUBLIC_KEY);
|
||||||
|
size_t size = data.size();
|
||||||
|
data.resize(size + BIP32_EXTKEY_SIZE);
|
||||||
|
key.Encode(data.data() + size);
|
||||||
|
std::string ret = EncodeBase58Check(data);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
CExtKey DecodeExtKey(const std::string& str)
|
||||||
|
{
|
||||||
|
CExtKey key;
|
||||||
|
std::vector<unsigned char> data;
|
||||||
|
if (DecodeBase58Check(str, data)) {
|
||||||
|
const std::vector<unsigned char>& prefix = Params().Base58Prefix(CChainParams::EXT_SECRET_KEY);
|
||||||
|
if (data.size() == BIP32_EXTKEY_SIZE + prefix.size() && std::equal(prefix.begin(), prefix.end(), data.begin())) {
|
||||||
|
key.Decode(data.data() + prefix.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EncodeExtKey(const CExtKey& key)
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::EXT_SECRET_KEY);
|
||||||
|
size_t size = data.size();
|
||||||
|
data.resize(size + BIP32_EXTKEY_SIZE);
|
||||||
|
key.Encode(data.data() + size);
|
||||||
|
std::string ret = EncodeBase58Check(data);
|
||||||
|
memory_cleanse(data.data(), data.size());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EncodeDestination(const CTxDestination& dest)
|
||||||
|
{
|
||||||
|
return boost::apply_visitor(DestinationEncoder(Params()), dest);
|
||||||
|
}
|
||||||
|
|
||||||
|
CTxDestination DecodeDestination(const std::string& str)
|
||||||
|
{
|
||||||
|
return DecodeDestination(str, Params());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsValidDestinationString(const std::string& str, const CChainParams& params)
|
||||||
|
{
|
||||||
|
return IsValidDestination(DecodeDestination(str, params));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsValidDestinationString(const std::string& str)
|
||||||
|
{
|
||||||
|
return IsValidDestinationString(str, Params());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EncodePaymentAddress(const libzcash::PaymentAddress& zaddr)
|
||||||
|
{
|
||||||
|
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
ss << zaddr;
|
||||||
|
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::ZCPAYMENT_ADDRRESS);
|
||||||
|
data.insert(data.end(), ss.begin(), ss.end());
|
||||||
|
return EncodeBase58Check(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::optional<libzcash::PaymentAddress> DecodePaymentAddress(const std::string& str)
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> data;
|
||||||
|
if (DecodeBase58Check(str, data)) {
|
||||||
|
const std::vector<unsigned char>& zaddr_prefix = Params().Base58Prefix(CChainParams::ZCPAYMENT_ADDRRESS);
|
||||||
|
if ((data.size() == libzcash::SerializedPaymentAddressSize + zaddr_prefix.size()) &&
|
||||||
|
std::equal(zaddr_prefix.begin(), zaddr_prefix.end(), data.begin())) {
|
||||||
|
CSerializeData serialized(data.begin() + zaddr_prefix.size(), data.end());
|
||||||
|
CDataStream ss(serialized, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
libzcash::PaymentAddress ret;
|
||||||
|
ss >> ret;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return boost::none;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EncodeViewingKey(const libzcash::ViewingKey& vk)
|
||||||
|
{
|
||||||
|
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
ss << vk;
|
||||||
|
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::ZCVIEWING_KEY);
|
||||||
|
data.insert(data.end(), ss.begin(), ss.end());
|
||||||
|
std::string ret = EncodeBase58Check(data);
|
||||||
|
memory_cleanse(data.data(), data.size());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::optional<libzcash::ViewingKey> DecodeViewingKey(const std::string& str)
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> data;
|
||||||
|
if (DecodeBase58Check(str, data)) {
|
||||||
|
const std::vector<unsigned char>& vk_prefix = Params().Base58Prefix(CChainParams::ZCVIEWING_KEY);
|
||||||
|
if ((data.size() == libzcash::SerializedViewingKeySize + vk_prefix.size()) &&
|
||||||
|
std::equal(vk_prefix.begin(), vk_prefix.end(), data.begin())) {
|
||||||
|
CSerializeData serialized(data.begin() + vk_prefix.size(), data.end());
|
||||||
|
CDataStream ss(serialized, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
libzcash::ViewingKey ret;
|
||||||
|
ss >> ret;
|
||||||
|
memory_cleanse(serialized.data(), serialized.size());
|
||||||
|
memory_cleanse(data.data(), data.size());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memory_cleanse(data.data(), data.size());
|
||||||
|
return boost::none;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EncodeSpendingKey(const libzcash::SpendingKey& zkey)
|
||||||
|
{
|
||||||
|
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
ss << zkey;
|
||||||
|
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::ZCSPENDING_KEY);
|
||||||
|
data.insert(data.end(), ss.begin(), ss.end());
|
||||||
|
std::string ret = EncodeBase58Check(data);
|
||||||
|
memory_cleanse(data.data(), data.size());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::optional<libzcash::SpendingKey> DecodeSpendingKey(const std::string& str)
|
||||||
|
{
|
||||||
|
std::vector<unsigned char> data;
|
||||||
|
if (DecodeBase58Check(str, data)) {
|
||||||
|
const std::vector<unsigned char>& zkey_prefix = Params().Base58Prefix(CChainParams::ZCSPENDING_KEY);
|
||||||
|
if ((data.size() == libzcash::SerializedSpendingKeySize + zkey_prefix.size()) &&
|
||||||
|
std::equal(zkey_prefix.begin(), zkey_prefix.end(), data.begin())) {
|
||||||
|
CSerializeData serialized(data.begin() + zkey_prefix.size(), data.end());
|
||||||
|
CDataStream ss(serialized, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
libzcash::SpendingKey ret;
|
||||||
|
ss >> ret;
|
||||||
|
memory_cleanse(serialized.data(), serialized.size());
|
||||||
|
memory_cleanse(data.data(), data.size());
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
memory_cleanse(data.data(), data.size());
|
||||||
|
return boost::none;
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||||
|
// Copyright (c) 2009-2015 The Bitcoin Core developers
|
||||||
|
// Copyright (c) 2016-2018 The Zcash developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#ifndef BITCOIN_KEYIO_H
|
||||||
|
#define BITCOIN_KEYIO_H
|
||||||
|
|
||||||
|
#include <chainparams.h>
|
||||||
|
#include <key.h>
|
||||||
|
#include <pubkey.h>
|
||||||
|
#include <script/standard.h>
|
||||||
|
#include <zcash/Address.hpp>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
CKey DecodeSecret(const std::string& str);
|
||||||
|
std::string EncodeSecret(const CKey& key);
|
||||||
|
|
||||||
|
CExtKey DecodeExtKey(const std::string& str);
|
||||||
|
std::string EncodeExtKey(const CExtKey& extkey);
|
||||||
|
CExtPubKey DecodeExtPubKey(const std::string& str);
|
||||||
|
std::string EncodeExtPubKey(const CExtPubKey& extpubkey);
|
||||||
|
|
||||||
|
std::string EncodeDestination(const CTxDestination& dest);
|
||||||
|
CTxDestination DecodeDestination(const std::string& str);
|
||||||
|
bool IsValidDestinationString(const std::string& str);
|
||||||
|
bool IsValidDestinationString(const std::string& str, const CChainParams& params);
|
||||||
|
|
||||||
|
std::string EncodePaymentAddress(const libzcash::PaymentAddress& zaddr);
|
||||||
|
boost::optional<libzcash::PaymentAddress> DecodePaymentAddress(const std::string& str);
|
||||||
|
|
||||||
|
std::string EncodeViewingKey(const libzcash::ViewingKey& vk);
|
||||||
|
boost::optional<libzcash::ViewingKey> DecodeViewingKey(const std::string& str);
|
||||||
|
|
||||||
|
std::string EncodeSpendingKey(const libzcash::SpendingKey& zkey);
|
||||||
|
boost::optional<libzcash::SpendingKey> DecodeSpendingKey(const std::string& str);
|
||||||
|
|
||||||
|
#endif // BITCOIN_KEYIO_H
|
|
@ -3,9 +3,9 @@
|
||||||
// Distributed under the MIT software license, see the accompanying
|
// Distributed under the MIT software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#include "base58.h"
|
|
||||||
#include "clientversion.h"
|
#include "clientversion.h"
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
|
#include "key_io.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include "netbase.h"
|
#include "netbase.h"
|
||||||
|
|
|
@ -3,11 +3,11 @@
|
||||||
// Distributed under the MIT software license, see the accompanying
|
// Distributed under the MIT software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#include "base58.h"
|
|
||||||
#include "consensus/upgrades.h"
|
#include "consensus/upgrades.h"
|
||||||
#include "consensus/validation.h"
|
#include "consensus/validation.h"
|
||||||
#include "core_io.h"
|
#include "core_io.h"
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
|
#include "key_io.h"
|
||||||
#include "keystore.h"
|
#include "keystore.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "merkleblock.h"
|
#include "merkleblock.h"
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
|
|
||||||
#include "rpcserver.h"
|
#include "rpcserver.h"
|
||||||
|
|
||||||
#include "base58.h"
|
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
|
#include "key_io.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
#include "ui_interface.h"
|
#include "ui_interface.h"
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "data/base58_keys_valid.json.h"
|
#include "data/base58_keys_valid.json.h"
|
||||||
|
|
||||||
#include "key.h"
|
#include "key.h"
|
||||||
|
#include "key_io.h"
|
||||||
#include "script/script.h"
|
#include "script/script.h"
|
||||||
#include "test/test_bitcoin.h"
|
#include "test/test_bitcoin.h"
|
||||||
#include "uint256.h"
|
#include "uint256.h"
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include <boost/test/unit_test.hpp>
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
#include "base58.h"
|
|
||||||
#include "key.h"
|
#include "key.h"
|
||||||
|
#include "key_io.h"
|
||||||
#include "uint256.h"
|
#include "uint256.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "utilstrencodings.h"
|
#include "utilstrencodings.h"
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
|
|
||||||
#include "bloom.h"
|
#include "bloom.h"
|
||||||
|
|
||||||
#include "base58.h"
|
|
||||||
#include "clientversion.h"
|
#include "clientversion.h"
|
||||||
#include "key.h"
|
#include "key.h"
|
||||||
|
#include "key_io.h"
|
||||||
#include "merkleblock.h"
|
#include "merkleblock.h"
|
||||||
#include "random.h"
|
#include "random.h"
|
||||||
#include "serialize.h"
|
#include "serialize.h"
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include "key.h"
|
#include "key.h"
|
||||||
|
|
||||||
#include "base58.h"
|
#include "key_io.h"
|
||||||
#include "script/script.h"
|
#include "script/script.h"
|
||||||
#include "uint256.h"
|
#include "uint256.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#include "rpcserver.h"
|
#include "rpcserver.h"
|
||||||
#include "rpcclient.h"
|
#include "rpcclient.h"
|
||||||
|
|
||||||
#include "base58.h"
|
#include "key_io.h"
|
||||||
#include "netbase.h"
|
#include "netbase.h"
|
||||||
#include "utilstrencodings.h"
|
#include "utilstrencodings.h"
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// Distributed under the MIT software license, see the accompanying
|
// Distributed under the MIT software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#include "base58.h"
|
#include "key_io.h"
|
||||||
#include "rpcserver.h"
|
#include "rpcserver.h"
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
|
@ -4,10 +4,10 @@
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#include "amount.h"
|
#include "amount.h"
|
||||||
#include "base58.h"
|
|
||||||
#include "consensus/upgrades.h"
|
#include "consensus/upgrades.h"
|
||||||
#include "core_io.h"
|
#include "core_io.h"
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
|
#include "key_io.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include "netbase.h"
|
#include "netbase.h"
|
||||||
|
|
|
@ -5,13 +5,13 @@
|
||||||
|
|
||||||
#include "wallet/wallet.h"
|
#include "wallet/wallet.h"
|
||||||
|
|
||||||
#include "base58.h"
|
|
||||||
#include "checkpoints.h"
|
#include "checkpoints.h"
|
||||||
#include "coincontrol.h"
|
#include "coincontrol.h"
|
||||||
#include "consensus/upgrades.h"
|
#include "consensus/upgrades.h"
|
||||||
#include "consensus/validation.h"
|
#include "consensus/validation.h"
|
||||||
#include "consensus/consensus.h"
|
#include "consensus/consensus.h"
|
||||||
#include "init.h"
|
#include "init.h"
|
||||||
|
#include "key_io.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "net.h"
|
#include "net.h"
|
||||||
#include "script/script.h"
|
#include "script/script.h"
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
|
|
||||||
#include "wallet/walletdb.h"
|
#include "wallet/walletdb.h"
|
||||||
|
|
||||||
#include "base58.h"
|
|
||||||
#include "consensus/validation.h"
|
#include "consensus/validation.h"
|
||||||
|
#include "key_io.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include "serialize.h"
|
#include "serialize.h"
|
||||||
|
|
Loading…
Reference in New Issue