mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-02 09:46:52 -05:00
Replace CScriptID and CKeyID in CTxDestination with dedicated types
This commit is contained in:
parent
caceff5546
commit
70946e7fee
31 changed files with 185 additions and 161 deletions
|
@ -39,9 +39,9 @@ SetupDummyInputs(CBasicKeyStore& keystoreRet, CCoinsViewCache& coinsRet)
|
||||||
|
|
||||||
dummyTransactions[1].vout.resize(2);
|
dummyTransactions[1].vout.resize(2);
|
||||||
dummyTransactions[1].vout[0].nValue = 21 * COIN;
|
dummyTransactions[1].vout[0].nValue = 21 * COIN;
|
||||||
dummyTransactions[1].vout[0].scriptPubKey = GetScriptForDestination(key[2].GetPubKey().GetID());
|
dummyTransactions[1].vout[0].scriptPubKey = GetScriptForDestination(PKHash(key[2].GetPubKey()));
|
||||||
dummyTransactions[1].vout[1].nValue = 22 * COIN;
|
dummyTransactions[1].vout[1].nValue = 22 * COIN;
|
||||||
dummyTransactions[1].vout[1].scriptPubKey = GetScriptForDestination(key[3].GetPubKey().GetID());
|
dummyTransactions[1].vout[1].scriptPubKey = GetScriptForDestination(PKHash(key[3].GetPubKey()));
|
||||||
AddCoins(coinsRet, CTransaction(dummyTransactions[1]), 0);
|
AddCoins(coinsRet, CTransaction(dummyTransactions[1]), 0);
|
||||||
|
|
||||||
return dummyTransactions;
|
return dummyTransactions;
|
||||||
|
|
|
@ -323,7 +323,7 @@ static void MutateTxAddOutPubKey(CMutableTransaction& tx, const std::string& str
|
||||||
}
|
}
|
||||||
if (bScriptHash) {
|
if (bScriptHash) {
|
||||||
// Get the ID for the script, and then construct a P2SH destination for it.
|
// Get the ID for the script, and then construct a P2SH destination for it.
|
||||||
scriptPubKey = GetScriptForDestination(CScriptID(scriptPubKey));
|
scriptPubKey = GetScriptForDestination(ScriptHash(scriptPubKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
// construct TxOut, append to transaction output list
|
// construct TxOut, append to transaction output list
|
||||||
|
@ -397,7 +397,7 @@ static void MutateTxAddOutMultiSig(CMutableTransaction& tx, const std::string& s
|
||||||
"redeemScript exceeds size limit: %d > %d", scriptPubKey.size(), MAX_SCRIPT_ELEMENT_SIZE));
|
"redeemScript exceeds size limit: %d > %d", scriptPubKey.size(), MAX_SCRIPT_ELEMENT_SIZE));
|
||||||
}
|
}
|
||||||
// Get the ID for the script, and then construct a P2SH destination for it.
|
// Get the ID for the script, and then construct a P2SH destination for it.
|
||||||
scriptPubKey = GetScriptForDestination(CScriptID(scriptPubKey));
|
scriptPubKey = GetScriptForDestination(ScriptHash(scriptPubKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
// construct TxOut, append to transaction output list
|
// construct TxOut, append to transaction output list
|
||||||
|
@ -469,7 +469,7 @@ static void MutateTxAddOutScript(CMutableTransaction& tx, const std::string& str
|
||||||
throw std::runtime_error(strprintf(
|
throw std::runtime_error(strprintf(
|
||||||
"redeemScript exceeds size limit: %d > %d", scriptPubKey.size(), MAX_SCRIPT_ELEMENT_SIZE));
|
"redeemScript exceeds size limit: %d > %d", scriptPubKey.size(), MAX_SCRIPT_ELEMENT_SIZE));
|
||||||
}
|
}
|
||||||
scriptPubKey = GetScriptForDestination(CScriptID(scriptPubKey));
|
scriptPubKey = GetScriptForDestination(ScriptHash(scriptPubKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
// construct TxOut, append to transaction output list
|
// construct TxOut, append to transaction output list
|
||||||
|
|
|
@ -26,14 +26,14 @@ private:
|
||||||
public:
|
public:
|
||||||
explicit DestinationEncoder(const CChainParams& params) : m_params(params) {}
|
explicit DestinationEncoder(const CChainParams& params) : m_params(params) {}
|
||||||
|
|
||||||
std::string operator()(const CKeyID& id) const
|
std::string operator()(const PKHash& id) const
|
||||||
{
|
{
|
||||||
std::vector<unsigned char> data = m_params.Base58Prefix(CChainParams::PUBKEY_ADDRESS);
|
std::vector<unsigned char> data = m_params.Base58Prefix(CChainParams::PUBKEY_ADDRESS);
|
||||||
data.insert(data.end(), id.begin(), id.end());
|
data.insert(data.end(), id.begin(), id.end());
|
||||||
return EncodeBase58Check(data);
|
return EncodeBase58Check(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string operator()(const CScriptID& id) const
|
std::string operator()(const ScriptHash& id) const
|
||||||
{
|
{
|
||||||
std::vector<unsigned char> data = m_params.Base58Prefix(CChainParams::SCRIPT_ADDRESS);
|
std::vector<unsigned char> data = m_params.Base58Prefix(CChainParams::SCRIPT_ADDRESS);
|
||||||
data.insert(data.end(), id.begin(), id.end());
|
data.insert(data.end(), id.begin(), id.end());
|
||||||
|
@ -81,14 +81,14 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par
|
||||||
const std::vector<unsigned char>& pubkey_prefix = params.Base58Prefix(CChainParams::PUBKEY_ADDRESS);
|
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())) {
|
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());
|
std::copy(data.begin() + pubkey_prefix.size(), data.end(), hash.begin());
|
||||||
return CKeyID(hash);
|
return PKHash(hash);
|
||||||
}
|
}
|
||||||
// Script-hash-addresses have version 5 (or 196 testnet).
|
// Script-hash-addresses have version 5 (or 196 testnet).
|
||||||
// The data vector contains RIPEMD160(SHA256(cscript)), where cscript is the serialized redemption script.
|
// 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);
|
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())) {
|
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());
|
std::copy(data.begin() + script_prefix.size(), data.end(), hash.begin());
|
||||||
return CScriptID(hash);
|
return ScriptHash(hash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data.clear();
|
data.clear();
|
||||||
|
|
|
@ -178,16 +178,17 @@ CKeyID GetKeyForDestination(const CKeyStore& store, const CTxDestination& dest)
|
||||||
{
|
{
|
||||||
// Only supports destinations which map to single public keys, i.e. P2PKH,
|
// Only supports destinations which map to single public keys, i.e. P2PKH,
|
||||||
// P2WPKH, and P2SH-P2WPKH.
|
// P2WPKH, and P2SH-P2WPKH.
|
||||||
if (auto id = boost::get<CKeyID>(&dest)) {
|
if (auto id = boost::get<PKHash>(&dest)) {
|
||||||
return *id;
|
return CKeyID(*id);
|
||||||
}
|
}
|
||||||
if (auto witness_id = boost::get<WitnessV0KeyHash>(&dest)) {
|
if (auto witness_id = boost::get<WitnessV0KeyHash>(&dest)) {
|
||||||
return CKeyID(*witness_id);
|
return CKeyID(*witness_id);
|
||||||
}
|
}
|
||||||
if (auto script_id = boost::get<CScriptID>(&dest)) {
|
if (auto script_hash = boost::get<ScriptHash>(&dest)) {
|
||||||
CScript script;
|
CScript script;
|
||||||
|
CScriptID script_id(*script_hash);
|
||||||
CTxDestination inner_dest;
|
CTxDestination inner_dest;
|
||||||
if (store.GetCScript(*script_id, script) && ExtractDestination(script, inner_dest)) {
|
if (store.GetCScript(script_id, script) && ExtractDestination(script, inner_dest)) {
|
||||||
if (auto inner_witness_id = boost::get<WitnessV0KeyHash>(&inner_dest)) {
|
if (auto inner_witness_id = boost::get<WitnessV0KeyHash>(&inner_dest)) {
|
||||||
return CKeyID(*inner_witness_id);
|
return CKeyID(*inner_witness_id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,14 +45,14 @@ const std::string& FormatOutputType(OutputType type)
|
||||||
CTxDestination GetDestinationForKey(const CPubKey& key, OutputType type)
|
CTxDestination GetDestinationForKey(const CPubKey& key, OutputType type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case OutputType::LEGACY: return key.GetID();
|
case OutputType::LEGACY: return PKHash(key);
|
||||||
case OutputType::P2SH_SEGWIT:
|
case OutputType::P2SH_SEGWIT:
|
||||||
case OutputType::BECH32: {
|
case OutputType::BECH32: {
|
||||||
if (!key.IsCompressed()) return key.GetID();
|
if (!key.IsCompressed()) return PKHash(key);
|
||||||
CTxDestination witdest = WitnessV0KeyHash(key.GetID());
|
CTxDestination witdest = WitnessV0KeyHash(PKHash(key));
|
||||||
CScript witprog = GetScriptForDestination(witdest);
|
CScript witprog = GetScriptForDestination(witdest);
|
||||||
if (type == OutputType::P2SH_SEGWIT) {
|
if (type == OutputType::P2SH_SEGWIT) {
|
||||||
return CScriptID(witprog);
|
return ScriptHash(witprog);
|
||||||
} else {
|
} else {
|
||||||
return witdest;
|
return witdest;
|
||||||
}
|
}
|
||||||
|
@ -63,10 +63,10 @@ CTxDestination GetDestinationForKey(const CPubKey& key, OutputType type)
|
||||||
|
|
||||||
std::vector<CTxDestination> GetAllDestinationsForKey(const CPubKey& key)
|
std::vector<CTxDestination> GetAllDestinationsForKey(const CPubKey& key)
|
||||||
{
|
{
|
||||||
CKeyID keyid = key.GetID();
|
PKHash keyid(key);
|
||||||
if (key.IsCompressed()) {
|
if (key.IsCompressed()) {
|
||||||
CTxDestination segwit = WitnessV0KeyHash(keyid);
|
CTxDestination segwit = WitnessV0KeyHash(keyid);
|
||||||
CTxDestination p2sh = CScriptID(GetScriptForDestination(segwit));
|
CTxDestination p2sh = ScriptHash(GetScriptForDestination(segwit));
|
||||||
return std::vector<CTxDestination>{std::move(keyid), std::move(p2sh), std::move(segwit)};
|
return std::vector<CTxDestination>{std::move(keyid), std::move(p2sh), std::move(segwit)};
|
||||||
} else {
|
} else {
|
||||||
return std::vector<CTxDestination>{std::move(keyid)};
|
return std::vector<CTxDestination>{std::move(keyid)};
|
||||||
|
@ -80,19 +80,19 @@ CTxDestination AddAndGetDestinationForScript(CKeyStore& keystore, const CScript&
|
||||||
// Note that scripts over 520 bytes are not yet supported.
|
// Note that scripts over 520 bytes are not yet supported.
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case OutputType::LEGACY:
|
case OutputType::LEGACY:
|
||||||
return CScriptID(script);
|
return ScriptHash(script);
|
||||||
case OutputType::P2SH_SEGWIT:
|
case OutputType::P2SH_SEGWIT:
|
||||||
case OutputType::BECH32: {
|
case OutputType::BECH32: {
|
||||||
CTxDestination witdest = WitnessV0ScriptHash(script);
|
CTxDestination witdest = WitnessV0ScriptHash(script);
|
||||||
CScript witprog = GetScriptForDestination(witdest);
|
CScript witprog = GetScriptForDestination(witdest);
|
||||||
// Check if the resulting program is solvable (i.e. doesn't use an uncompressed key)
|
// Check if the resulting program is solvable (i.e. doesn't use an uncompressed key)
|
||||||
if (!IsSolvable(keystore, witprog)) return CScriptID(script);
|
if (!IsSolvable(keystore, witprog)) return ScriptHash(script);
|
||||||
// Add the redeemscript, so that P2WSH and P2SH-P2WSH outputs are recognized as ours.
|
// Add the redeemscript, so that P2WSH and P2SH-P2WSH outputs are recognized as ours.
|
||||||
keystore.AddCScript(witprog);
|
keystore.AddCScript(witprog);
|
||||||
if (type == OutputType::BECH32) {
|
if (type == OutputType::BECH32) {
|
||||||
return witdest;
|
return witdest;
|
||||||
} else {
|
} else {
|
||||||
return CScriptID(witprog);
|
return ScriptHash(witprog);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default: assert(false);
|
default: assert(false);
|
||||||
|
|
|
@ -471,8 +471,8 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
|
||||||
else if(ExtractDestination(out.txout.scriptPubKey, address))
|
else if(ExtractDestination(out.txout.scriptPubKey, address))
|
||||||
{
|
{
|
||||||
CPubKey pubkey;
|
CPubKey pubkey;
|
||||||
CKeyID *keyid = boost::get<CKeyID>(&address);
|
PKHash *pkhash = boost::get<PKHash>(&address);
|
||||||
if (keyid && model->wallet().getPubKey(*keyid, pubkey))
|
if (pkhash && model->wallet().getPubKey(CKeyID(*pkhash), pubkey))
|
||||||
{
|
{
|
||||||
nBytesInputs += (pubkey.IsCompressed() ? 148 : 180);
|
nBytesInputs += (pubkey.IsCompressed() ? 148 : 180);
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,8 +120,8 @@ void SignVerifyMessageDialog::on_signMessageButton_SM_clicked()
|
||||||
ui->statusLabel_SM->setText(tr("The entered address is invalid.") + QString(" ") + tr("Please check the address and try again."));
|
ui->statusLabel_SM->setText(tr("The entered address is invalid.") + QString(" ") + tr("Please check the address and try again."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const CKeyID* keyID = boost::get<CKeyID>(&destination);
|
const PKHash* pkhash = boost::get<PKHash>(&destination);
|
||||||
if (!keyID) {
|
if (!pkhash) {
|
||||||
ui->addressIn_SM->setValid(false);
|
ui->addressIn_SM->setValid(false);
|
||||||
ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
|
ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
|
||||||
ui->statusLabel_SM->setText(tr("The entered address does not refer to a key.") + QString(" ") + tr("Please check the address and try again."));
|
ui->statusLabel_SM->setText(tr("The entered address does not refer to a key.") + QString(" ") + tr("Please check the address and try again."));
|
||||||
|
@ -137,7 +137,7 @@ void SignVerifyMessageDialog::on_signMessageButton_SM_clicked()
|
||||||
}
|
}
|
||||||
|
|
||||||
CKey key;
|
CKey key;
|
||||||
if (!model->wallet().getPrivKey(*keyID, key))
|
if (!model->wallet().getPrivKey(CKeyID(*pkhash), key))
|
||||||
{
|
{
|
||||||
ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
|
ui->statusLabel_SM->setStyleSheet("QLabel { color: red; }");
|
||||||
ui->statusLabel_SM->setText(tr("Private key for the entered address is not available."));
|
ui->statusLabel_SM->setText(tr("Private key for the entered address is not available."));
|
||||||
|
@ -198,7 +198,7 @@ void SignVerifyMessageDialog::on_verifyMessageButton_VM_clicked()
|
||||||
ui->statusLabel_VM->setText(tr("The entered address is invalid.") + QString(" ") + tr("Please check the address and try again."));
|
ui->statusLabel_VM->setText(tr("The entered address is invalid.") + QString(" ") + tr("Please check the address and try again."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!boost::get<CKeyID>(&destination)) {
|
if (!boost::get<PKHash>(&destination)) {
|
||||||
ui->addressIn_VM->setValid(false);
|
ui->addressIn_VM->setValid(false);
|
||||||
ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
|
ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
|
||||||
ui->statusLabel_VM->setText(tr("The entered address does not refer to a key.") + QString(" ") + tr("Please check the address and try again."));
|
ui->statusLabel_VM->setText(tr("The entered address does not refer to a key.") + QString(" ") + tr("Please check the address and try again."));
|
||||||
|
@ -229,7 +229,7 @@ void SignVerifyMessageDialog::on_verifyMessageButton_VM_clicked()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(CTxDestination(pubkey.GetID()) == destination)) {
|
if (!(CTxDestination(PKHash(pubkey)) == destination)) {
|
||||||
ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
|
ui->statusLabel_VM->setStyleSheet("QLabel { color: red; }");
|
||||||
ui->statusLabel_VM->setText(QString("<nobr>") + tr("Message verification failed.") + QString("</nobr>"));
|
ui->statusLabel_VM->setText(QString("<nobr>") + tr("Message verification failed.") + QString("</nobr>"));
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -169,8 +169,8 @@ void TestGUI()
|
||||||
// Send two transactions, and verify they are added to transaction list.
|
// Send two transactions, and verify they are added to transaction list.
|
||||||
TransactionTableModel* transactionTableModel = walletModel.getTransactionTableModel();
|
TransactionTableModel* transactionTableModel = walletModel.getTransactionTableModel();
|
||||||
QCOMPARE(transactionTableModel->rowCount({}), 105);
|
QCOMPARE(transactionTableModel->rowCount({}), 105);
|
||||||
uint256 txid1 = SendCoins(*wallet.get(), sendCoinsDialog, CKeyID(), 5 * COIN, false /* rbf */);
|
uint256 txid1 = SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 5 * COIN, false /* rbf */);
|
||||||
uint256 txid2 = SendCoins(*wallet.get(), sendCoinsDialog, CKeyID(), 10 * COIN, true /* rbf */);
|
uint256 txid2 = SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 10 * COIN, true /* rbf */);
|
||||||
QCOMPARE(transactionTableModel->rowCount({}), 107);
|
QCOMPARE(transactionTableModel->rowCount({}), 107);
|
||||||
QVERIFY(FindTx(*transactionTableModel, txid1).isValid());
|
QVERIFY(FindTx(*transactionTableModel, txid1).isValid());
|
||||||
QVERIFY(FindTx(*transactionTableModel, txid2).isValid());
|
QVERIFY(FindTx(*transactionTableModel, txid2).isValid());
|
||||||
|
|
|
@ -307,8 +307,8 @@ static UniValue verifymessage(const JSONRPCRequest& request)
|
||||||
throw JSONRPCError(RPC_TYPE_ERROR, "Invalid address");
|
throw JSONRPCError(RPC_TYPE_ERROR, "Invalid address");
|
||||||
}
|
}
|
||||||
|
|
||||||
const CKeyID *keyID = boost::get<CKeyID>(&destination);
|
const PKHash *pkhash = boost::get<PKHash>(&destination);
|
||||||
if (!keyID) {
|
if (!pkhash) {
|
||||||
throw JSONRPCError(RPC_TYPE_ERROR, "Address does not refer to key");
|
throw JSONRPCError(RPC_TYPE_ERROR, "Address does not refer to key");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,7 +326,7 @@ static UniValue verifymessage(const JSONRPCRequest& request)
|
||||||
if (!pubkey.RecoverCompact(ss.GetHash(), vchSig))
|
if (!pubkey.RecoverCompact(ss.GetHash(), vchSig))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return (pubkey.GetID() == *keyID);
|
return (pubkey.GetID() == *pkhash);
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniValue signmessagewithprivkey(const JSONRPCRequest& request)
|
static UniValue signmessagewithprivkey(const JSONRPCRequest& request)
|
||||||
|
|
|
@ -571,7 +571,7 @@ static UniValue decodescript(const JSONRPCRequest& request)
|
||||||
if (type.isStr() && type.get_str() != "scripthash") {
|
if (type.isStr() && type.get_str() != "scripthash") {
|
||||||
// P2SH cannot be wrapped in a P2SH. If this script is already a P2SH,
|
// P2SH cannot be wrapped in a P2SH. If this script is already a P2SH,
|
||||||
// don't return the address for a P2SH of the P2SH.
|
// don't return the address for a P2SH of the P2SH.
|
||||||
r.pushKV("p2sh", EncodeDestination(CScriptID(script)));
|
r.pushKV("p2sh", EncodeDestination(ScriptHash(script)));
|
||||||
// P2SH and witness programs cannot be wrapped in P2WSH, if this script
|
// P2SH and witness programs cannot be wrapped in P2WSH, if this script
|
||||||
// is a witness program, don't return addresses for a segwit programs.
|
// is a witness program, don't return addresses for a segwit programs.
|
||||||
if (type.get_str() == "pubkey" || type.get_str() == "pubkeyhash" || type.get_str() == "multisig" || type.get_str() == "nonstandard") {
|
if (type.get_str() == "pubkey" || type.get_str() == "pubkeyhash" || type.get_str() == "multisig" || type.get_str() == "nonstandard") {
|
||||||
|
@ -598,7 +598,7 @@ static UniValue decodescript(const JSONRPCRequest& request)
|
||||||
segwitScr = GetScriptForDestination(WitnessV0ScriptHash(script));
|
segwitScr = GetScriptForDestination(WitnessV0ScriptHash(script));
|
||||||
}
|
}
|
||||||
ScriptPubKeyToUniv(segwitScr, sr, /* fIncludeHex */ true);
|
ScriptPubKeyToUniv(segwitScr, sr, /* fIncludeHex */ true);
|
||||||
sr.pushKV("p2sh-segwit", EncodeDestination(CScriptID(segwitScr)));
|
sr.pushKV("p2sh-segwit", EncodeDestination(ScriptHash(segwitScr)));
|
||||||
r.pushKV("segwit", sr);
|
r.pushKV("segwit", sr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -181,7 +181,7 @@ public:
|
||||||
return UniValue(UniValue::VOBJ);
|
return UniValue(UniValue::VOBJ);
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue operator()(const CKeyID& keyID) const
|
UniValue operator()(const PKHash& keyID) const
|
||||||
{
|
{
|
||||||
UniValue obj(UniValue::VOBJ);
|
UniValue obj(UniValue::VOBJ);
|
||||||
obj.pushKV("isscript", false);
|
obj.pushKV("isscript", false);
|
||||||
|
@ -189,7 +189,7 @@ public:
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue operator()(const CScriptID& scriptID) const
|
UniValue operator()(const ScriptHash& scriptID) const
|
||||||
{
|
{
|
||||||
UniValue obj(UniValue::VOBJ);
|
UniValue obj(UniValue::VOBJ);
|
||||||
obj.pushKV("isscript", true);
|
obj.pushKV("isscript", true);
|
||||||
|
|
|
@ -514,7 +514,7 @@ protected:
|
||||||
{
|
{
|
||||||
CKeyID id = keys[0].GetID();
|
CKeyID id = keys[0].GetID();
|
||||||
out.pubkeys.emplace(id, keys[0]);
|
out.pubkeys.emplace(id, keys[0]);
|
||||||
return Singleton(GetScriptForDestination(id));
|
return Singleton(GetScriptForDestination(PKHash(id)));
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
PKHDescriptor(std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Singleton(std::move(prov)), {}, "pkh") {}
|
PKHDescriptor(std::unique_ptr<PubkeyProvider> prov) : DescriptorImpl(Singleton(std::move(prov)), {}, "pkh") {}
|
||||||
|
@ -544,12 +544,12 @@ protected:
|
||||||
CKeyID id = keys[0].GetID();
|
CKeyID id = keys[0].GetID();
|
||||||
out.pubkeys.emplace(id, keys[0]);
|
out.pubkeys.emplace(id, keys[0]);
|
||||||
ret.emplace_back(GetScriptForRawPubKey(keys[0])); // P2PK
|
ret.emplace_back(GetScriptForRawPubKey(keys[0])); // P2PK
|
||||||
ret.emplace_back(GetScriptForDestination(id)); // P2PKH
|
ret.emplace_back(GetScriptForDestination(PKHash(id))); // P2PKH
|
||||||
if (keys[0].IsCompressed()) {
|
if (keys[0].IsCompressed()) {
|
||||||
CScript p2wpkh = GetScriptForDestination(WitnessV0KeyHash(id));
|
CScript p2wpkh = GetScriptForDestination(WitnessV0KeyHash(id));
|
||||||
out.scripts.emplace(CScriptID(p2wpkh), p2wpkh);
|
out.scripts.emplace(CScriptID(p2wpkh), p2wpkh);
|
||||||
ret.emplace_back(p2wpkh);
|
ret.emplace_back(p2wpkh);
|
||||||
ret.emplace_back(GetScriptForDestination(CScriptID(p2wpkh))); // P2SH-P2WPKH
|
ret.emplace_back(GetScriptForDestination(ScriptHash(p2wpkh))); // P2SH-P2WPKH
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -572,7 +572,7 @@ public:
|
||||||
class SHDescriptor final : public DescriptorImpl
|
class SHDescriptor final : public DescriptorImpl
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
std::vector<CScript> MakeScripts(const std::vector<CPubKey>&, const CScript* script, FlatSigningProvider&) const override { return Singleton(GetScriptForDestination(CScriptID(*script))); }
|
std::vector<CScript> MakeScripts(const std::vector<CPubKey>&, const CScript* script, FlatSigningProvider&) const override { return Singleton(GetScriptForDestination(ScriptHash(*script))); }
|
||||||
public:
|
public:
|
||||||
SHDescriptor(std::unique_ptr<DescriptorImpl> desc) : DescriptorImpl({}, std::move(desc), "sh") {}
|
SHDescriptor(std::unique_ptr<DescriptorImpl> desc) : DescriptorImpl({}, std::move(desc), "sh") {}
|
||||||
};
|
};
|
||||||
|
|
|
@ -90,7 +90,7 @@ IsMineResult IsMineInner(const CKeyStore& keystore, const CScript& scriptPubKey,
|
||||||
// This also applies to the P2WSH case.
|
// This also applies to the P2WSH case.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
ret = std::max(ret, IsMineInner(keystore, GetScriptForDestination(CKeyID(uint160(vSolutions[0]))), IsMineSigVersion::WITNESS_V0));
|
ret = std::max(ret, IsMineInner(keystore, GetScriptForDestination(PKHash(uint160(vSolutions[0]))), IsMineSigVersion::WITNESS_V0));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TX_PUBKEYHASH:
|
case TX_PUBKEYHASH:
|
||||||
|
|
|
@ -19,6 +19,10 @@ unsigned nMaxDatacarrierBytes = MAX_OP_RETURN_RELAY;
|
||||||
|
|
||||||
CScriptID::CScriptID(const CScript& in) : uint160(Hash160(in.begin(), in.end())) {}
|
CScriptID::CScriptID(const CScript& in) : uint160(Hash160(in.begin(), in.end())) {}
|
||||||
|
|
||||||
|
ScriptHash::ScriptHash(const CScript& in) : uint160(Hash160(in.begin(), in.end())) {}
|
||||||
|
|
||||||
|
PKHash::PKHash(const CPubKey& pubkey) : uint160(pubkey.GetID()) {}
|
||||||
|
|
||||||
WitnessV0ScriptHash::WitnessV0ScriptHash(const CScript& in)
|
WitnessV0ScriptHash::WitnessV0ScriptHash(const CScript& in)
|
||||||
{
|
{
|
||||||
CSHA256().Write(in.data(), in.size()).Finalize(begin());
|
CSHA256().Write(in.data(), in.size()).Finalize(begin());
|
||||||
|
@ -162,17 +166,17 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
||||||
if (!pubKey.IsValid())
|
if (!pubKey.IsValid())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
addressRet = pubKey.GetID();
|
addressRet = PKHash(pubKey);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (whichType == TX_PUBKEYHASH)
|
else if (whichType == TX_PUBKEYHASH)
|
||||||
{
|
{
|
||||||
addressRet = CKeyID(uint160(vSolutions[0]));
|
addressRet = PKHash(uint160(vSolutions[0]));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (whichType == TX_SCRIPTHASH)
|
else if (whichType == TX_SCRIPTHASH)
|
||||||
{
|
{
|
||||||
addressRet = CScriptID(uint160(vSolutions[0]));
|
addressRet = ScriptHash(uint160(vSolutions[0]));
|
||||||
return true;
|
return true;
|
||||||
} else if (whichType == TX_WITNESS_V0_KEYHASH) {
|
} else if (whichType == TX_WITNESS_V0_KEYHASH) {
|
||||||
WitnessV0KeyHash hash;
|
WitnessV0KeyHash hash;
|
||||||
|
@ -217,7 +221,7 @@ bool ExtractDestinations(const CScript& scriptPubKey, txnouttype& typeRet, std::
|
||||||
if (!pubKey.IsValid())
|
if (!pubKey.IsValid())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
CTxDestination address = pubKey.GetID();
|
CTxDestination address = PKHash(pubKey);
|
||||||
addressRet.push_back(address);
|
addressRet.push_back(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,13 +254,13 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator()(const CKeyID &keyID) const {
|
bool operator()(const PKHash &keyID) const {
|
||||||
script->clear();
|
script->clear();
|
||||||
*script << OP_DUP << OP_HASH160 << ToByteVector(keyID) << OP_EQUALVERIFY << OP_CHECKSIG;
|
*script << OP_DUP << OP_HASH160 << ToByteVector(keyID) << OP_EQUALVERIFY << OP_CHECKSIG;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool operator()(const CScriptID &scriptID) const {
|
bool operator()(const ScriptHash &scriptID) const {
|
||||||
script->clear();
|
script->clear();
|
||||||
*script << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
|
*script << OP_HASH160 << ToByteVector(scriptID) << OP_EQUAL;
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -73,6 +73,22 @@ public:
|
||||||
friend bool operator<(const CNoDestination &a, const CNoDestination &b) { return true; }
|
friend bool operator<(const CNoDestination &a, const CNoDestination &b) { return true; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct PKHash : public uint160
|
||||||
|
{
|
||||||
|
PKHash() : uint160() {}
|
||||||
|
explicit PKHash(const uint160& hash) : uint160(hash) {}
|
||||||
|
explicit PKHash(const CPubKey& pubkey);
|
||||||
|
using uint160::uint160;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ScriptHash : public uint160
|
||||||
|
{
|
||||||
|
ScriptHash() : uint160() {}
|
||||||
|
explicit ScriptHash(const uint160& hash) : uint160(hash) {}
|
||||||
|
explicit ScriptHash(const CScript& script);
|
||||||
|
using uint160::uint160;
|
||||||
|
};
|
||||||
|
|
||||||
struct WitnessV0ScriptHash : public uint256
|
struct WitnessV0ScriptHash : public uint256
|
||||||
{
|
{
|
||||||
WitnessV0ScriptHash() : uint256() {}
|
WitnessV0ScriptHash() : uint256() {}
|
||||||
|
@ -113,14 +129,14 @@ struct WitnessUnknown
|
||||||
/**
|
/**
|
||||||
* A txout script template with a specific destination. It is either:
|
* A txout script template with a specific destination. It is either:
|
||||||
* * CNoDestination: no destination set
|
* * CNoDestination: no destination set
|
||||||
* * CKeyID: TX_PUBKEYHASH destination (P2PKH)
|
* * PKHash: TX_PUBKEYHASH destination (P2PKH)
|
||||||
* * CScriptID: TX_SCRIPTHASH destination (P2SH)
|
* * ScriptHash: TX_SCRIPTHASH destination (P2SH)
|
||||||
* * WitnessV0ScriptHash: TX_WITNESS_V0_SCRIPTHASH destination (P2WSH)
|
* * WitnessV0ScriptHash: TX_WITNESS_V0_SCRIPTHASH destination (P2WSH)
|
||||||
* * WitnessV0KeyHash: TX_WITNESS_V0_KEYHASH destination (P2WPKH)
|
* * WitnessV0KeyHash: TX_WITNESS_V0_KEYHASH destination (P2WPKH)
|
||||||
* * WitnessUnknown: TX_WITNESS_UNKNOWN destination (P2W???)
|
* * WitnessUnknown: TX_WITNESS_UNKNOWN destination (P2W???)
|
||||||
* A CTxDestination is the internal data type encoded in a bitcoin address
|
* A CTxDestination is the internal data type encoded in a bitcoin address
|
||||||
*/
|
*/
|
||||||
typedef boost::variant<CNoDestination, CKeyID, CScriptID, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessUnknown> CTxDestination;
|
typedef boost::variant<CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessUnknown> CTxDestination;
|
||||||
|
|
||||||
/** Check whether a CTxDestination is a CNoDestination. */
|
/** Check whether a CTxDestination is a CNoDestination. */
|
||||||
bool IsValidDestination(const CTxDestination& dest);
|
bool IsValidDestination(const CTxDestination& dest);
|
||||||
|
|
|
@ -166,7 +166,7 @@ BOOST_FIXTURE_TEST_CASE(blockfilter_index_initial_sync, TestChain100Setup)
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
tip = chainActive.Tip();
|
tip = chainActive.Tip();
|
||||||
}
|
}
|
||||||
CScript coinbase_script_pub_key = GetScriptForDestination(coinbaseKey.GetPubKey().GetID());
|
CScript coinbase_script_pub_key = GetScriptForDestination(PKHash(coinbaseKey.GetPubKey()));
|
||||||
std::vector<std::shared_ptr<CBlock>> chainA, chainB;
|
std::vector<std::shared_ptr<CBlock>> chainA, chainB;
|
||||||
BOOST_REQUIRE(BuildChain(tip, coinbase_script_pub_key, 10, chainA));
|
BOOST_REQUIRE(BuildChain(tip, coinbase_script_pub_key, 10, chainA));
|
||||||
BOOST_REQUIRE(BuildChain(tip, coinbase_script_pub_key, 10, chainB));
|
BOOST_REQUIRE(BuildChain(tip, coinbase_script_pub_key, 10, chainB));
|
||||||
|
|
|
@ -485,7 +485,7 @@ BOOST_AUTO_TEST_CASE(ccoins_serialization)
|
||||||
BOOST_CHECK_EQUAL(cc1.fCoinBase, false);
|
BOOST_CHECK_EQUAL(cc1.fCoinBase, false);
|
||||||
BOOST_CHECK_EQUAL(cc1.nHeight, 203998U);
|
BOOST_CHECK_EQUAL(cc1.nHeight, 203998U);
|
||||||
BOOST_CHECK_EQUAL(cc1.out.nValue, CAmount{60000000000});
|
BOOST_CHECK_EQUAL(cc1.out.nValue, CAmount{60000000000});
|
||||||
BOOST_CHECK_EQUAL(HexStr(cc1.out.scriptPubKey), HexStr(GetScriptForDestination(CKeyID(uint160(ParseHex("816115944e077fe7c803cfa57f29b36bf87c1d35"))))));
|
BOOST_CHECK_EQUAL(HexStr(cc1.out.scriptPubKey), HexStr(GetScriptForDestination(PKHash(uint160(ParseHex("816115944e077fe7c803cfa57f29b36bf87c1d35"))))));
|
||||||
|
|
||||||
// Good example
|
// Good example
|
||||||
CDataStream ss2(ParseHex("8ddf77bbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa4"), SER_DISK, CLIENT_VERSION);
|
CDataStream ss2(ParseHex("8ddf77bbd123008c988f1a4a4de2161e0f50aac7f17e7f9555caa4"), SER_DISK, CLIENT_VERSION);
|
||||||
|
@ -494,7 +494,7 @@ BOOST_AUTO_TEST_CASE(ccoins_serialization)
|
||||||
BOOST_CHECK_EQUAL(cc2.fCoinBase, true);
|
BOOST_CHECK_EQUAL(cc2.fCoinBase, true);
|
||||||
BOOST_CHECK_EQUAL(cc2.nHeight, 120891U);
|
BOOST_CHECK_EQUAL(cc2.nHeight, 120891U);
|
||||||
BOOST_CHECK_EQUAL(cc2.out.nValue, 110397);
|
BOOST_CHECK_EQUAL(cc2.out.nValue, 110397);
|
||||||
BOOST_CHECK_EQUAL(HexStr(cc2.out.scriptPubKey), HexStr(GetScriptForDestination(CKeyID(uint160(ParseHex("8c988f1a4a4de2161e0f50aac7f17e7f9555caa4"))))));
|
BOOST_CHECK_EQUAL(HexStr(cc2.out.scriptPubKey), HexStr(GetScriptForDestination(PKHash(uint160(ParseHex("8c988f1a4a4de2161e0f50aac7f17e7f9555caa4"))))));
|
||||||
|
|
||||||
// Smallest possible example
|
// Smallest possible example
|
||||||
CDataStream ss3(ParseHex("000006"), SER_DISK, CLIENT_VERSION);
|
CDataStream ss3(ParseHex("000006"), SER_DISK, CLIENT_VERSION);
|
||||||
|
|
|
@ -381,7 +381,7 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
|
||||||
tx.vin[0].scriptSig << OP_1;
|
tx.vin[0].scriptSig << OP_1;
|
||||||
tx.vout.resize(1);
|
tx.vout.resize(1);
|
||||||
tx.vout[0].nValue = 1*CENT;
|
tx.vout[0].nValue = 1*CENT;
|
||||||
tx.vout[0].scriptPubKey = GetScriptForDestination(key.GetPubKey().GetID());
|
tx.vout[0].scriptPubKey = GetScriptForDestination(PKHash(key.GetPubKey()));
|
||||||
|
|
||||||
AddOrphanTx(MakeTransactionRef(tx), i);
|
AddOrphanTx(MakeTransactionRef(tx), i);
|
||||||
}
|
}
|
||||||
|
@ -397,7 +397,7 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
|
||||||
tx.vin[0].prevout.hash = txPrev->GetHash();
|
tx.vin[0].prevout.hash = txPrev->GetHash();
|
||||||
tx.vout.resize(1);
|
tx.vout.resize(1);
|
||||||
tx.vout[0].nValue = 1*CENT;
|
tx.vout[0].nValue = 1*CENT;
|
||||||
tx.vout[0].scriptPubKey = GetScriptForDestination(key.GetPubKey().GetID());
|
tx.vout[0].scriptPubKey = GetScriptForDestination(PKHash(key.GetPubKey()));
|
||||||
BOOST_CHECK(SignSignature(keystore, *txPrev, tx, 0, SIGHASH_ALL));
|
BOOST_CHECK(SignSignature(keystore, *txPrev, tx, 0, SIGHASH_ALL));
|
||||||
|
|
||||||
AddOrphanTx(MakeTransactionRef(tx), i);
|
AddOrphanTx(MakeTransactionRef(tx), i);
|
||||||
|
@ -411,7 +411,7 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
|
||||||
CMutableTransaction tx;
|
CMutableTransaction tx;
|
||||||
tx.vout.resize(1);
|
tx.vout.resize(1);
|
||||||
tx.vout[0].nValue = 1*CENT;
|
tx.vout[0].nValue = 1*CENT;
|
||||||
tx.vout[0].scriptPubKey = GetScriptForDestination(key.GetPubKey().GetID());
|
tx.vout[0].scriptPubKey = GetScriptForDestination(PKHash(key.GetPubKey()));
|
||||||
tx.vin.resize(2777);
|
tx.vin.resize(2777);
|
||||||
for (unsigned int j = 0; j < tx.vin.size(); j++)
|
for (unsigned int j = 0; j < tx.vin.size(); j++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -68,10 +68,10 @@ BOOST_AUTO_TEST_CASE(key_test1)
|
||||||
BOOST_CHECK(!key2C.VerifyPubKey(pubkey2));
|
BOOST_CHECK(!key2C.VerifyPubKey(pubkey2));
|
||||||
BOOST_CHECK(key2C.VerifyPubKey(pubkey2C));
|
BOOST_CHECK(key2C.VerifyPubKey(pubkey2C));
|
||||||
|
|
||||||
BOOST_CHECK(DecodeDestination(addr1) == CTxDestination(pubkey1.GetID()));
|
BOOST_CHECK(DecodeDestination(addr1) == CTxDestination(PKHash(pubkey1)));
|
||||||
BOOST_CHECK(DecodeDestination(addr2) == CTxDestination(pubkey2.GetID()));
|
BOOST_CHECK(DecodeDestination(addr2) == CTxDestination(PKHash(pubkey2)));
|
||||||
BOOST_CHECK(DecodeDestination(addr1C) == CTxDestination(pubkey1C.GetID()));
|
BOOST_CHECK(DecodeDestination(addr1C) == CTxDestination(PKHash(pubkey1C)));
|
||||||
BOOST_CHECK(DecodeDestination(addr2C) == CTxDestination(pubkey2C.GetID()));
|
BOOST_CHECK(DecodeDestination(addr2C) == CTxDestination(PKHash(pubkey2C)));
|
||||||
|
|
||||||
for (int n=0; n<16; n++)
|
for (int n=0; n<16; n++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -399,7 +399,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
|
||||||
tx.vin[0].scriptSig = CScript() << OP_1;
|
tx.vin[0].scriptSig = CScript() << OP_1;
|
||||||
tx.vout[0].nValue = BLOCKSUBSIDY-LOWFEE;
|
tx.vout[0].nValue = BLOCKSUBSIDY-LOWFEE;
|
||||||
script = CScript() << OP_0;
|
script = CScript() << OP_0;
|
||||||
tx.vout[0].scriptPubKey = GetScriptForDestination(CScriptID(script));
|
tx.vout[0].scriptPubKey = GetScriptForDestination(ScriptHash(script));
|
||||||
hash = tx.GetHash();
|
hash = tx.GetHash();
|
||||||
mempool.addUnchecked(entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
|
mempool.addUnchecked(entry.Fee(LOWFEE).Time(GetTime()).SpendsCoinbase(true).FromTx(tx));
|
||||||
tx.vin[0].prevout.hash = hash;
|
tx.vin[0].prevout.hash = hash;
|
||||||
|
|
|
@ -69,14 +69,14 @@ BOOST_AUTO_TEST_CASE(sign)
|
||||||
// different keys, straight/P2SH, pubkey/pubkeyhash
|
// different keys, straight/P2SH, pubkey/pubkeyhash
|
||||||
CScript standardScripts[4];
|
CScript standardScripts[4];
|
||||||
standardScripts[0] << ToByteVector(key[0].GetPubKey()) << OP_CHECKSIG;
|
standardScripts[0] << ToByteVector(key[0].GetPubKey()) << OP_CHECKSIG;
|
||||||
standardScripts[1] = GetScriptForDestination(key[1].GetPubKey().GetID());
|
standardScripts[1] = GetScriptForDestination(PKHash(key[1].GetPubKey()));
|
||||||
standardScripts[2] << ToByteVector(key[1].GetPubKey()) << OP_CHECKSIG;
|
standardScripts[2] << ToByteVector(key[1].GetPubKey()) << OP_CHECKSIG;
|
||||||
standardScripts[3] = GetScriptForDestination(key[2].GetPubKey().GetID());
|
standardScripts[3] = GetScriptForDestination(PKHash(key[2].GetPubKey()));
|
||||||
CScript evalScripts[4];
|
CScript evalScripts[4];
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
BOOST_CHECK(keystore.AddCScript(standardScripts[i]));
|
BOOST_CHECK(keystore.AddCScript(standardScripts[i]));
|
||||||
evalScripts[i] = GetScriptForDestination(CScriptID(standardScripts[i]));
|
evalScripts[i] = GetScriptForDestination(ScriptHash(standardScripts[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
CMutableTransaction txFrom; // Funding transaction:
|
CMutableTransaction txFrom; // Funding transaction:
|
||||||
|
@ -131,7 +131,7 @@ BOOST_AUTO_TEST_CASE(norecurse)
|
||||||
CScript invalidAsScript;
|
CScript invalidAsScript;
|
||||||
invalidAsScript << OP_INVALIDOPCODE << OP_INVALIDOPCODE;
|
invalidAsScript << OP_INVALIDOPCODE << OP_INVALIDOPCODE;
|
||||||
|
|
||||||
CScript p2sh = GetScriptForDestination(CScriptID(invalidAsScript));
|
CScript p2sh = GetScriptForDestination(ScriptHash(invalidAsScript));
|
||||||
|
|
||||||
CScript scriptSig;
|
CScript scriptSig;
|
||||||
scriptSig << Serialize(invalidAsScript);
|
scriptSig << Serialize(invalidAsScript);
|
||||||
|
@ -142,7 +142,7 @@ BOOST_AUTO_TEST_CASE(norecurse)
|
||||||
|
|
||||||
// Try to recur, and verification should succeed because
|
// Try to recur, and verification should succeed because
|
||||||
// the inner HASH160 <> EQUAL should only check the hash:
|
// the inner HASH160 <> EQUAL should only check the hash:
|
||||||
CScript p2sh2 = GetScriptForDestination(CScriptID(p2sh));
|
CScript p2sh2 = GetScriptForDestination(ScriptHash(p2sh));
|
||||||
CScript scriptSig2;
|
CScript scriptSig2;
|
||||||
scriptSig2 << Serialize(invalidAsScript) << Serialize(p2sh);
|
scriptSig2 << Serialize(invalidAsScript) << Serialize(p2sh);
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ BOOST_AUTO_TEST_CASE(set)
|
||||||
}
|
}
|
||||||
|
|
||||||
CScript inner[4];
|
CScript inner[4];
|
||||||
inner[0] = GetScriptForDestination(key[0].GetPubKey().GetID());
|
inner[0] = GetScriptForDestination(PKHash(key[0].GetPubKey()));
|
||||||
inner[1] = GetScriptForMultisig(2, std::vector<CPubKey>(keys.begin(), keys.begin()+2));
|
inner[1] = GetScriptForMultisig(2, std::vector<CPubKey>(keys.begin(), keys.begin()+2));
|
||||||
inner[2] = GetScriptForMultisig(1, std::vector<CPubKey>(keys.begin(), keys.begin()+2));
|
inner[2] = GetScriptForMultisig(1, std::vector<CPubKey>(keys.begin(), keys.begin()+2));
|
||||||
inner[3] = GetScriptForMultisig(2, std::vector<CPubKey>(keys.begin(), keys.begin()+3));
|
inner[3] = GetScriptForMultisig(2, std::vector<CPubKey>(keys.begin(), keys.begin()+3));
|
||||||
|
@ -173,7 +173,7 @@ BOOST_AUTO_TEST_CASE(set)
|
||||||
CScript outer[4];
|
CScript outer[4];
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
outer[i] = GetScriptForDestination(CScriptID(inner[i]));
|
outer[i] = GetScriptForDestination(ScriptHash(inner[i]));
|
||||||
BOOST_CHECK(keystore.AddCScript(inner[i]));
|
BOOST_CHECK(keystore.AddCScript(inner[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,7 +253,7 @@ BOOST_AUTO_TEST_CASE(switchover)
|
||||||
CScript scriptSig;
|
CScript scriptSig;
|
||||||
scriptSig << Serialize(notValid);
|
scriptSig << Serialize(notValid);
|
||||||
|
|
||||||
CScript fund = GetScriptForDestination(CScriptID(notValid));
|
CScript fund = GetScriptForDestination(ScriptHash(notValid));
|
||||||
|
|
||||||
|
|
||||||
// Validation should succeed under old rules (hash is correct):
|
// Validation should succeed under old rules (hash is correct):
|
||||||
|
@ -284,11 +284,11 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
|
||||||
txFrom.vout.resize(7);
|
txFrom.vout.resize(7);
|
||||||
|
|
||||||
// First three are standard:
|
// First three are standard:
|
||||||
CScript pay1 = GetScriptForDestination(key[0].GetPubKey().GetID());
|
CScript pay1 = GetScriptForDestination(PKHash(key[0].GetPubKey()));
|
||||||
BOOST_CHECK(keystore.AddCScript(pay1));
|
BOOST_CHECK(keystore.AddCScript(pay1));
|
||||||
CScript pay1of3 = GetScriptForMultisig(1, keys);
|
CScript pay1of3 = GetScriptForMultisig(1, keys);
|
||||||
|
|
||||||
txFrom.vout[0].scriptPubKey = GetScriptForDestination(CScriptID(pay1)); // P2SH (OP_CHECKSIG)
|
txFrom.vout[0].scriptPubKey = GetScriptForDestination(ScriptHash(pay1)); // P2SH (OP_CHECKSIG)
|
||||||
txFrom.vout[0].nValue = 1000;
|
txFrom.vout[0].nValue = 1000;
|
||||||
txFrom.vout[1].scriptPubKey = pay1; // ordinary OP_CHECKSIG
|
txFrom.vout[1].scriptPubKey = pay1; // ordinary OP_CHECKSIG
|
||||||
txFrom.vout[1].nValue = 2000;
|
txFrom.vout[1].nValue = 2000;
|
||||||
|
@ -303,7 +303,7 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
|
||||||
oneAndTwo << OP_2 << ToByteVector(key[3].GetPubKey()) << ToByteVector(key[4].GetPubKey()) << ToByteVector(key[5].GetPubKey());
|
oneAndTwo << OP_2 << ToByteVector(key[3].GetPubKey()) << ToByteVector(key[4].GetPubKey()) << ToByteVector(key[5].GetPubKey());
|
||||||
oneAndTwo << OP_3 << OP_CHECKMULTISIG;
|
oneAndTwo << OP_3 << OP_CHECKMULTISIG;
|
||||||
BOOST_CHECK(keystore.AddCScript(oneAndTwo));
|
BOOST_CHECK(keystore.AddCScript(oneAndTwo));
|
||||||
txFrom.vout[3].scriptPubKey = GetScriptForDestination(CScriptID(oneAndTwo));
|
txFrom.vout[3].scriptPubKey = GetScriptForDestination(ScriptHash(oneAndTwo));
|
||||||
txFrom.vout[3].nValue = 4000;
|
txFrom.vout[3].nValue = 4000;
|
||||||
|
|
||||||
// vout[4] is max sigops:
|
// vout[4] is max sigops:
|
||||||
|
@ -312,24 +312,24 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
|
||||||
fifteenSigops << ToByteVector(key[i%3].GetPubKey());
|
fifteenSigops << ToByteVector(key[i%3].GetPubKey());
|
||||||
fifteenSigops << OP_15 << OP_CHECKMULTISIG;
|
fifteenSigops << OP_15 << OP_CHECKMULTISIG;
|
||||||
BOOST_CHECK(keystore.AddCScript(fifteenSigops));
|
BOOST_CHECK(keystore.AddCScript(fifteenSigops));
|
||||||
txFrom.vout[4].scriptPubKey = GetScriptForDestination(CScriptID(fifteenSigops));
|
txFrom.vout[4].scriptPubKey = GetScriptForDestination(ScriptHash(fifteenSigops));
|
||||||
txFrom.vout[4].nValue = 5000;
|
txFrom.vout[4].nValue = 5000;
|
||||||
|
|
||||||
// vout[5/6] are non-standard because they exceed MAX_P2SH_SIGOPS
|
// vout[5/6] are non-standard because they exceed MAX_P2SH_SIGOPS
|
||||||
CScript sixteenSigops; sixteenSigops << OP_16 << OP_CHECKMULTISIG;
|
CScript sixteenSigops; sixteenSigops << OP_16 << OP_CHECKMULTISIG;
|
||||||
BOOST_CHECK(keystore.AddCScript(sixteenSigops));
|
BOOST_CHECK(keystore.AddCScript(sixteenSigops));
|
||||||
txFrom.vout[5].scriptPubKey = GetScriptForDestination(CScriptID(sixteenSigops));
|
txFrom.vout[5].scriptPubKey = GetScriptForDestination(ScriptHash(sixteenSigops));
|
||||||
txFrom.vout[5].nValue = 5000;
|
txFrom.vout[5].nValue = 5000;
|
||||||
CScript twentySigops; twentySigops << OP_CHECKMULTISIG;
|
CScript twentySigops; twentySigops << OP_CHECKMULTISIG;
|
||||||
BOOST_CHECK(keystore.AddCScript(twentySigops));
|
BOOST_CHECK(keystore.AddCScript(twentySigops));
|
||||||
txFrom.vout[6].scriptPubKey = GetScriptForDestination(CScriptID(twentySigops));
|
txFrom.vout[6].scriptPubKey = GetScriptForDestination(ScriptHash(twentySigops));
|
||||||
txFrom.vout[6].nValue = 6000;
|
txFrom.vout[6].nValue = 6000;
|
||||||
|
|
||||||
AddCoins(coins, CTransaction(txFrom), 0);
|
AddCoins(coins, CTransaction(txFrom), 0);
|
||||||
|
|
||||||
CMutableTransaction txTo;
|
CMutableTransaction txTo;
|
||||||
txTo.vout.resize(1);
|
txTo.vout.resize(1);
|
||||||
txTo.vout[0].scriptPubKey = GetScriptForDestination(key[1].GetPubKey().GetID());
|
txTo.vout[0].scriptPubKey = GetScriptForDestination(PKHash(key[1].GetPubKey()));
|
||||||
|
|
||||||
txTo.vin.resize(5);
|
txTo.vin.resize(5);
|
||||||
for (int i = 0; i < 5; i++)
|
for (int i = 0; i < 5; i++)
|
||||||
|
@ -352,7 +352,7 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
|
||||||
|
|
||||||
CMutableTransaction txToNonStd1;
|
CMutableTransaction txToNonStd1;
|
||||||
txToNonStd1.vout.resize(1);
|
txToNonStd1.vout.resize(1);
|
||||||
txToNonStd1.vout[0].scriptPubKey = GetScriptForDestination(key[1].GetPubKey().GetID());
|
txToNonStd1.vout[0].scriptPubKey = GetScriptForDestination(PKHash(key[1].GetPubKey()));
|
||||||
txToNonStd1.vout[0].nValue = 1000;
|
txToNonStd1.vout[0].nValue = 1000;
|
||||||
txToNonStd1.vin.resize(1);
|
txToNonStd1.vin.resize(1);
|
||||||
txToNonStd1.vin[0].prevout.n = 5;
|
txToNonStd1.vin[0].prevout.n = 5;
|
||||||
|
@ -364,7 +364,7 @@ BOOST_AUTO_TEST_CASE(AreInputsStandard)
|
||||||
|
|
||||||
CMutableTransaction txToNonStd2;
|
CMutableTransaction txToNonStd2;
|
||||||
txToNonStd2.vout.resize(1);
|
txToNonStd2.vout.resize(1);
|
||||||
txToNonStd2.vout[0].scriptPubKey = GetScriptForDestination(key[1].GetPubKey().GetID());
|
txToNonStd2.vout[0].scriptPubKey = GetScriptForDestination(PKHash(key[1].GetPubKey()));
|
||||||
txToNonStd2.vout[0].nValue = 1000;
|
txToNonStd2.vout[0].nValue = 1000;
|
||||||
txToNonStd2.vin.resize(1);
|
txToNonStd2.vin.resize(1);
|
||||||
txToNonStd2.vin[0].prevout.n = 6;
|
txToNonStd2.vin[0].prevout.n = 6;
|
||||||
|
|
|
@ -179,23 +179,23 @@ BOOST_AUTO_TEST_CASE(script_standard_ExtractDestination)
|
||||||
s.clear();
|
s.clear();
|
||||||
s << ToByteVector(pubkey) << OP_CHECKSIG;
|
s << ToByteVector(pubkey) << OP_CHECKSIG;
|
||||||
BOOST_CHECK(ExtractDestination(s, address));
|
BOOST_CHECK(ExtractDestination(s, address));
|
||||||
BOOST_CHECK(boost::get<CKeyID>(&address) &&
|
BOOST_CHECK(boost::get<PKHash>(&address) &&
|
||||||
*boost::get<CKeyID>(&address) == pubkey.GetID());
|
*boost::get<PKHash>(&address) == PKHash(pubkey));
|
||||||
|
|
||||||
// TX_PUBKEYHASH
|
// TX_PUBKEYHASH
|
||||||
s.clear();
|
s.clear();
|
||||||
s << OP_DUP << OP_HASH160 << ToByteVector(pubkey.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
|
s << OP_DUP << OP_HASH160 << ToByteVector(pubkey.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
|
||||||
BOOST_CHECK(ExtractDestination(s, address));
|
BOOST_CHECK(ExtractDestination(s, address));
|
||||||
BOOST_CHECK(boost::get<CKeyID>(&address) &&
|
BOOST_CHECK(boost::get<PKHash>(&address) &&
|
||||||
*boost::get<CKeyID>(&address) == pubkey.GetID());
|
*boost::get<PKHash>(&address) == PKHash(pubkey));
|
||||||
|
|
||||||
// TX_SCRIPTHASH
|
// TX_SCRIPTHASH
|
||||||
CScript redeemScript(s); // initialize with leftover P2PKH script
|
CScript redeemScript(s); // initialize with leftover P2PKH script
|
||||||
s.clear();
|
s.clear();
|
||||||
s << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
|
s << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
|
||||||
BOOST_CHECK(ExtractDestination(s, address));
|
BOOST_CHECK(ExtractDestination(s, address));
|
||||||
BOOST_CHECK(boost::get<CScriptID>(&address) &&
|
BOOST_CHECK(boost::get<ScriptHash>(&address) &&
|
||||||
*boost::get<CScriptID>(&address) == CScriptID(redeemScript));
|
*boost::get<ScriptHash>(&address) == ScriptHash(redeemScript));
|
||||||
|
|
||||||
// TX_MULTISIG
|
// TX_MULTISIG
|
||||||
s.clear();
|
s.clear();
|
||||||
|
@ -255,8 +255,8 @@ BOOST_AUTO_TEST_CASE(script_standard_ExtractDestinations)
|
||||||
BOOST_CHECK_EQUAL(whichType, TX_PUBKEY);
|
BOOST_CHECK_EQUAL(whichType, TX_PUBKEY);
|
||||||
BOOST_CHECK_EQUAL(addresses.size(), 1U);
|
BOOST_CHECK_EQUAL(addresses.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(nRequired, 1);
|
BOOST_CHECK_EQUAL(nRequired, 1);
|
||||||
BOOST_CHECK(boost::get<CKeyID>(&addresses[0]) &&
|
BOOST_CHECK(boost::get<PKHash>(&addresses[0]) &&
|
||||||
*boost::get<CKeyID>(&addresses[0]) == pubkeys[0].GetID());
|
*boost::get<PKHash>(&addresses[0]) == PKHash(pubkeys[0]));
|
||||||
|
|
||||||
// TX_PUBKEYHASH
|
// TX_PUBKEYHASH
|
||||||
s.clear();
|
s.clear();
|
||||||
|
@ -265,8 +265,8 @@ BOOST_AUTO_TEST_CASE(script_standard_ExtractDestinations)
|
||||||
BOOST_CHECK_EQUAL(whichType, TX_PUBKEYHASH);
|
BOOST_CHECK_EQUAL(whichType, TX_PUBKEYHASH);
|
||||||
BOOST_CHECK_EQUAL(addresses.size(), 1U);
|
BOOST_CHECK_EQUAL(addresses.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(nRequired, 1);
|
BOOST_CHECK_EQUAL(nRequired, 1);
|
||||||
BOOST_CHECK(boost::get<CKeyID>(&addresses[0]) &&
|
BOOST_CHECK(boost::get<PKHash>(&addresses[0]) &&
|
||||||
*boost::get<CKeyID>(&addresses[0]) == pubkeys[0].GetID());
|
*boost::get<PKHash>(&addresses[0]) == PKHash(pubkeys[0]));
|
||||||
|
|
||||||
// TX_SCRIPTHASH
|
// TX_SCRIPTHASH
|
||||||
CScript redeemScript(s); // initialize with leftover P2PKH script
|
CScript redeemScript(s); // initialize with leftover P2PKH script
|
||||||
|
@ -276,8 +276,8 @@ BOOST_AUTO_TEST_CASE(script_standard_ExtractDestinations)
|
||||||
BOOST_CHECK_EQUAL(whichType, TX_SCRIPTHASH);
|
BOOST_CHECK_EQUAL(whichType, TX_SCRIPTHASH);
|
||||||
BOOST_CHECK_EQUAL(addresses.size(), 1U);
|
BOOST_CHECK_EQUAL(addresses.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(nRequired, 1);
|
BOOST_CHECK_EQUAL(nRequired, 1);
|
||||||
BOOST_CHECK(boost::get<CScriptID>(&addresses[0]) &&
|
BOOST_CHECK(boost::get<ScriptHash>(&addresses[0]) &&
|
||||||
*boost::get<CScriptID>(&addresses[0]) == CScriptID(redeemScript));
|
*boost::get<ScriptHash>(&addresses[0]) == ScriptHash(redeemScript));
|
||||||
|
|
||||||
// TX_MULTISIG
|
// TX_MULTISIG
|
||||||
s.clear();
|
s.clear();
|
||||||
|
@ -289,10 +289,10 @@ BOOST_AUTO_TEST_CASE(script_standard_ExtractDestinations)
|
||||||
BOOST_CHECK_EQUAL(whichType, TX_MULTISIG);
|
BOOST_CHECK_EQUAL(whichType, TX_MULTISIG);
|
||||||
BOOST_CHECK_EQUAL(addresses.size(), 2U);
|
BOOST_CHECK_EQUAL(addresses.size(), 2U);
|
||||||
BOOST_CHECK_EQUAL(nRequired, 2);
|
BOOST_CHECK_EQUAL(nRequired, 2);
|
||||||
BOOST_CHECK(boost::get<CKeyID>(&addresses[0]) &&
|
BOOST_CHECK(boost::get<PKHash>(&addresses[0]) &&
|
||||||
*boost::get<CKeyID>(&addresses[0]) == pubkeys[0].GetID());
|
*boost::get<PKHash>(&addresses[0]) == PKHash(pubkeys[0]));
|
||||||
BOOST_CHECK(boost::get<CKeyID>(&addresses[1]) &&
|
BOOST_CHECK(boost::get<PKHash>(&addresses[1]) &&
|
||||||
*boost::get<CKeyID>(&addresses[1]) == pubkeys[1].GetID());
|
*boost::get<PKHash>(&addresses[1]) == PKHash(pubkeys[1]));
|
||||||
|
|
||||||
// TX_NULL_DATA
|
// TX_NULL_DATA
|
||||||
s.clear();
|
s.clear();
|
||||||
|
@ -311,17 +311,17 @@ BOOST_AUTO_TEST_CASE(script_standard_GetScriptFor_)
|
||||||
|
|
||||||
CScript expected, result;
|
CScript expected, result;
|
||||||
|
|
||||||
// CKeyID
|
// PKHash
|
||||||
expected.clear();
|
expected.clear();
|
||||||
expected << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
|
expected << OP_DUP << OP_HASH160 << ToByteVector(pubkeys[0].GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
|
||||||
result = GetScriptForDestination(pubkeys[0].GetID());
|
result = GetScriptForDestination(PKHash(pubkeys[0]));
|
||||||
BOOST_CHECK(result == expected);
|
BOOST_CHECK(result == expected);
|
||||||
|
|
||||||
// CScriptID
|
// CScriptID
|
||||||
CScript redeemScript(result);
|
CScript redeemScript(result);
|
||||||
expected.clear();
|
expected.clear();
|
||||||
expected << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
|
expected << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
|
||||||
result = GetScriptForDestination(CScriptID(redeemScript));
|
result = GetScriptForDestination(ScriptHash(redeemScript));
|
||||||
BOOST_CHECK(result == expected);
|
BOOST_CHECK(result == expected);
|
||||||
|
|
||||||
// CNoDestination
|
// CNoDestination
|
||||||
|
@ -421,7 +421,7 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
// P2PKH compressed
|
// P2PKH compressed
|
||||||
{
|
{
|
||||||
CBasicKeyStore keystore;
|
CBasicKeyStore keystore;
|
||||||
scriptPubKey = GetScriptForDestination(pubkeys[0].GetID());
|
scriptPubKey = GetScriptForDestination(PKHash(pubkeys[0]));
|
||||||
|
|
||||||
// Keystore does not have key
|
// Keystore does not have key
|
||||||
result = IsMine(keystore, scriptPubKey);
|
result = IsMine(keystore, scriptPubKey);
|
||||||
|
@ -436,7 +436,7 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
// P2PKH uncompressed
|
// P2PKH uncompressed
|
||||||
{
|
{
|
||||||
CBasicKeyStore keystore;
|
CBasicKeyStore keystore;
|
||||||
scriptPubKey = GetScriptForDestination(uncompressedPubkey.GetID());
|
scriptPubKey = GetScriptForDestination(PKHash(uncompressedPubkey));
|
||||||
|
|
||||||
// Keystore does not have key
|
// Keystore does not have key
|
||||||
result = IsMine(keystore, scriptPubKey);
|
result = IsMine(keystore, scriptPubKey);
|
||||||
|
@ -452,8 +452,8 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
{
|
{
|
||||||
CBasicKeyStore keystore;
|
CBasicKeyStore keystore;
|
||||||
|
|
||||||
CScript redeemScript = GetScriptForDestination(pubkeys[0].GetID());
|
CScript redeemScript = GetScriptForDestination(PKHash(pubkeys[0]));
|
||||||
scriptPubKey = GetScriptForDestination(CScriptID(redeemScript));
|
scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
|
||||||
|
|
||||||
// Keystore does not have redeemScript or key
|
// Keystore does not have redeemScript or key
|
||||||
result = IsMine(keystore, scriptPubKey);
|
result = IsMine(keystore, scriptPubKey);
|
||||||
|
@ -474,9 +474,9 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
{
|
{
|
||||||
CBasicKeyStore keystore;
|
CBasicKeyStore keystore;
|
||||||
|
|
||||||
CScript redeemscript_inner = GetScriptForDestination(pubkeys[0].GetID());
|
CScript redeemscript_inner = GetScriptForDestination(PKHash(pubkeys[0]));
|
||||||
CScript redeemscript = GetScriptForDestination(CScriptID(redeemscript_inner));
|
CScript redeemscript = GetScriptForDestination(ScriptHash(redeemscript_inner));
|
||||||
scriptPubKey = GetScriptForDestination(CScriptID(redeemscript));
|
scriptPubKey = GetScriptForDestination(ScriptHash(redeemscript));
|
||||||
|
|
||||||
BOOST_CHECK(keystore.AddCScript(redeemscript));
|
BOOST_CHECK(keystore.AddCScript(redeemscript));
|
||||||
BOOST_CHECK(keystore.AddCScript(redeemscript_inner));
|
BOOST_CHECK(keystore.AddCScript(redeemscript_inner));
|
||||||
|
@ -490,8 +490,8 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
{
|
{
|
||||||
CBasicKeyStore keystore;
|
CBasicKeyStore keystore;
|
||||||
|
|
||||||
CScript redeemscript = GetScriptForDestination(pubkeys[0].GetID());
|
CScript redeemscript = GetScriptForDestination(PKHash(pubkeys[0]));
|
||||||
CScript witnessscript = GetScriptForDestination(CScriptID(redeemscript));
|
CScript witnessscript = GetScriptForDestination(ScriptHash(redeemscript));
|
||||||
scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
|
scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
|
||||||
|
|
||||||
BOOST_CHECK(keystore.AddCScript(witnessscript));
|
BOOST_CHECK(keystore.AddCScript(witnessscript));
|
||||||
|
@ -506,7 +506,7 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
{
|
{
|
||||||
CBasicKeyStore keystore;
|
CBasicKeyStore keystore;
|
||||||
|
|
||||||
CScript witnessscript = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0].GetID()));
|
CScript witnessscript = GetScriptForDestination(WitnessV0KeyHash(PKHash(pubkeys[0])));
|
||||||
scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
|
scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
|
||||||
|
|
||||||
BOOST_CHECK(keystore.AddCScript(witnessscript));
|
BOOST_CHECK(keystore.AddCScript(witnessscript));
|
||||||
|
@ -520,7 +520,7 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
{
|
{
|
||||||
CBasicKeyStore keystore;
|
CBasicKeyStore keystore;
|
||||||
|
|
||||||
CScript witnessscript_inner = GetScriptForDestination(pubkeys[0].GetID());
|
CScript witnessscript_inner = GetScriptForDestination(PKHash(pubkeys[0]));
|
||||||
CScript witnessscript = GetScriptForDestination(WitnessV0ScriptHash(witnessscript_inner));
|
CScript witnessscript = GetScriptForDestination(WitnessV0ScriptHash(witnessscript_inner));
|
||||||
scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
|
scriptPubKey = GetScriptForDestination(WitnessV0ScriptHash(witnessscript));
|
||||||
|
|
||||||
|
@ -537,7 +537,7 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
CBasicKeyStore keystore;
|
CBasicKeyStore keystore;
|
||||||
BOOST_CHECK(keystore.AddKey(keys[0]));
|
BOOST_CHECK(keystore.AddKey(keys[0]));
|
||||||
|
|
||||||
scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(pubkeys[0].GetID()));
|
scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(PKHash(pubkeys[0])));
|
||||||
|
|
||||||
// Keystore implicitly has key and P2SH redeemScript
|
// Keystore implicitly has key and P2SH redeemScript
|
||||||
BOOST_CHECK(keystore.AddCScript(scriptPubKey));
|
BOOST_CHECK(keystore.AddCScript(scriptPubKey));
|
||||||
|
@ -550,7 +550,7 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
CBasicKeyStore keystore;
|
CBasicKeyStore keystore;
|
||||||
BOOST_CHECK(keystore.AddKey(uncompressedKey));
|
BOOST_CHECK(keystore.AddKey(uncompressedKey));
|
||||||
|
|
||||||
scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(uncompressedPubkey.GetID()));
|
scriptPubKey = GetScriptForDestination(WitnessV0KeyHash(PKHash(uncompressedPubkey)));
|
||||||
|
|
||||||
// Keystore has key, but no P2SH redeemScript
|
// Keystore has key, but no P2SH redeemScript
|
||||||
result = IsMine(keystore, scriptPubKey);
|
result = IsMine(keystore, scriptPubKey);
|
||||||
|
@ -598,7 +598,7 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
BOOST_CHECK(keystore.AddKey(keys[1]));
|
BOOST_CHECK(keystore.AddKey(keys[1]));
|
||||||
|
|
||||||
CScript redeemScript = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});
|
CScript redeemScript = GetScriptForMultisig(2, {uncompressedPubkey, pubkeys[1]});
|
||||||
scriptPubKey = GetScriptForDestination(CScriptID(redeemScript));
|
scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
|
||||||
|
|
||||||
// Keystore has no redeemScript
|
// Keystore has no redeemScript
|
||||||
result = IsMine(keystore, scriptPubKey);
|
result = IsMine(keystore, scriptPubKey);
|
||||||
|
@ -664,7 +664,7 @@ BOOST_AUTO_TEST_CASE(script_standard_IsMine)
|
||||||
|
|
||||||
CScript witnessScript = GetScriptForMultisig(2, {pubkeys[0], pubkeys[1]});
|
CScript witnessScript = GetScriptForMultisig(2, {pubkeys[0], pubkeys[1]});
|
||||||
CScript redeemScript = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
|
CScript redeemScript = GetScriptForDestination(WitnessV0ScriptHash(witnessScript));
|
||||||
scriptPubKey = GetScriptForDestination(CScriptID(redeemScript));
|
scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
|
||||||
|
|
||||||
// Keystore has no witnessScript, P2SH redeemScript, or keys
|
// Keystore has no witnessScript, P2SH redeemScript, or keys
|
||||||
result = IsMine(keystore, scriptPubKey);
|
result = IsMine(keystore, scriptPubKey);
|
||||||
|
|
|
@ -1211,7 +1211,7 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
|
||||||
BOOST_CHECK(keystore.AddKey(key));
|
BOOST_CHECK(keystore.AddKey(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
CMutableTransaction txFrom = BuildCreditingTransaction(GetScriptForDestination(keys[0].GetPubKey().GetID()));
|
CMutableTransaction txFrom = BuildCreditingTransaction(GetScriptForDestination(PKHash(keys[0].GetPubKey())));
|
||||||
CMutableTransaction txTo = BuildSpendingTransaction(CScript(), CScriptWitness(), CTransaction(txFrom));
|
CMutableTransaction txTo = BuildSpendingTransaction(CScript(), CScriptWitness(), CTransaction(txFrom));
|
||||||
CScript& scriptPubKey = txFrom.vout[0].scriptPubKey;
|
CScript& scriptPubKey = txFrom.vout[0].scriptPubKey;
|
||||||
SignatureData scriptSig;
|
SignatureData scriptSig;
|
||||||
|
@ -1237,7 +1237,7 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
|
||||||
// P2SH, single-signature case:
|
// P2SH, single-signature case:
|
||||||
CScript pkSingle; pkSingle << ToByteVector(keys[0].GetPubKey()) << OP_CHECKSIG;
|
CScript pkSingle; pkSingle << ToByteVector(keys[0].GetPubKey()) << OP_CHECKSIG;
|
||||||
BOOST_CHECK(keystore.AddCScript(pkSingle));
|
BOOST_CHECK(keystore.AddCScript(pkSingle));
|
||||||
scriptPubKey = GetScriptForDestination(CScriptID(pkSingle));
|
scriptPubKey = GetScriptForDestination(ScriptHash(pkSingle));
|
||||||
BOOST_CHECK(SignSignature(keystore, CTransaction(txFrom), txTo, 0, SIGHASH_ALL));
|
BOOST_CHECK(SignSignature(keystore, CTransaction(txFrom), txTo, 0, SIGHASH_ALL));
|
||||||
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
scriptSig = DataFromTransaction(txTo, 0, txFrom.vout[0]);
|
||||||
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
|
combined = CombineSignatures(txFrom.vout[0], txTo, scriptSig, empty);
|
||||||
|
|
|
@ -39,7 +39,7 @@ BOOST_AUTO_TEST_CASE(GetSigOpCount)
|
||||||
BOOST_CHECK_EQUAL(s1.GetSigOpCount(true), 3U);
|
BOOST_CHECK_EQUAL(s1.GetSigOpCount(true), 3U);
|
||||||
BOOST_CHECK_EQUAL(s1.GetSigOpCount(false), 21U);
|
BOOST_CHECK_EQUAL(s1.GetSigOpCount(false), 21U);
|
||||||
|
|
||||||
CScript p2sh = GetScriptForDestination(CScriptID(s1));
|
CScript p2sh = GetScriptForDestination(ScriptHash(s1));
|
||||||
CScript scriptSig;
|
CScript scriptSig;
|
||||||
scriptSig << OP_0 << Serialize(s1);
|
scriptSig << OP_0 << Serialize(s1);
|
||||||
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(scriptSig), 3U);
|
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(scriptSig), 3U);
|
||||||
|
@ -55,7 +55,7 @@ BOOST_AUTO_TEST_CASE(GetSigOpCount)
|
||||||
BOOST_CHECK_EQUAL(s2.GetSigOpCount(true), 3U);
|
BOOST_CHECK_EQUAL(s2.GetSigOpCount(true), 3U);
|
||||||
BOOST_CHECK_EQUAL(s2.GetSigOpCount(false), 20U);
|
BOOST_CHECK_EQUAL(s2.GetSigOpCount(false), 20U);
|
||||||
|
|
||||||
p2sh = GetScriptForDestination(CScriptID(s2));
|
p2sh = GetScriptForDestination(ScriptHash(s2));
|
||||||
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(true), 0U);
|
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(true), 0U);
|
||||||
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(false), 0U);
|
BOOST_CHECK_EQUAL(p2sh.GetSigOpCount(false), 0U);
|
||||||
CScript scriptSig2;
|
CScript scriptSig2;
|
||||||
|
@ -144,7 +144,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
|
||||||
// Multisig nested in P2SH
|
// Multisig nested in P2SH
|
||||||
{
|
{
|
||||||
CScript redeemScript = CScript() << 1 << ToByteVector(pubkey) << ToByteVector(pubkey) << 2 << OP_CHECKMULTISIGVERIFY;
|
CScript redeemScript = CScript() << 1 << ToByteVector(pubkey) << ToByteVector(pubkey) << 2 << OP_CHECKMULTISIGVERIFY;
|
||||||
CScript scriptPubKey = GetScriptForDestination(CScriptID(redeemScript));
|
CScript scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
|
||||||
CScript scriptSig = CScript() << OP_0 << OP_0 << ToByteVector(redeemScript);
|
CScript scriptSig = CScript() << OP_0 << OP_0 << ToByteVector(redeemScript);
|
||||||
|
|
||||||
BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, CScriptWitness());
|
BuildTxs(spendingTx, coins, creationTx, scriptPubKey, scriptSig, CScriptWitness());
|
||||||
|
@ -185,7 +185,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
|
||||||
{
|
{
|
||||||
CScript p2pk = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
|
CScript p2pk = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
|
||||||
CScript scriptSig = GetScriptForWitness(p2pk);
|
CScript scriptSig = GetScriptForWitness(p2pk);
|
||||||
CScript scriptPubKey = GetScriptForDestination(CScriptID(scriptSig));
|
CScript scriptPubKey = GetScriptForDestination(ScriptHash(scriptSig));
|
||||||
scriptSig = CScript() << ToByteVector(scriptSig);
|
scriptSig = CScript() << ToByteVector(scriptSig);
|
||||||
CScriptWitness scriptWitness;
|
CScriptWitness scriptWitness;
|
||||||
scriptWitness.stack.push_back(std::vector<unsigned char>(0));
|
scriptWitness.stack.push_back(std::vector<unsigned char>(0));
|
||||||
|
@ -216,7 +216,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
|
||||||
{
|
{
|
||||||
CScript witnessScript = CScript() << 1 << ToByteVector(pubkey) << ToByteVector(pubkey) << 2 << OP_CHECKMULTISIGVERIFY;
|
CScript witnessScript = CScript() << 1 << ToByteVector(pubkey) << ToByteVector(pubkey) << 2 << OP_CHECKMULTISIGVERIFY;
|
||||||
CScript redeemScript = GetScriptForWitness(witnessScript);
|
CScript redeemScript = GetScriptForWitness(witnessScript);
|
||||||
CScript scriptPubKey = GetScriptForDestination(CScriptID(redeemScript));
|
CScript scriptPubKey = GetScriptForDestination(ScriptHash(redeemScript));
|
||||||
CScript scriptSig = CScript() << ToByteVector(redeemScript);
|
CScript scriptSig = CScript() << ToByteVector(redeemScript);
|
||||||
CScriptWitness scriptWitness;
|
CScriptWitness scriptWitness;
|
||||||
scriptWitness.stack.push_back(std::vector<unsigned char>(0));
|
scriptWitness.stack.push_back(std::vector<unsigned char>(0));
|
||||||
|
|
|
@ -311,9 +311,9 @@ SetupDummyInputs(CBasicKeyStore& keystoreRet, CCoinsViewCache& coinsRet)
|
||||||
|
|
||||||
dummyTransactions[1].vout.resize(2);
|
dummyTransactions[1].vout.resize(2);
|
||||||
dummyTransactions[1].vout[0].nValue = 21*CENT;
|
dummyTransactions[1].vout[0].nValue = 21*CENT;
|
||||||
dummyTransactions[1].vout[0].scriptPubKey = GetScriptForDestination(key[2].GetPubKey().GetID());
|
dummyTransactions[1].vout[0].scriptPubKey = GetScriptForDestination(PKHash(key[2].GetPubKey()));
|
||||||
dummyTransactions[1].vout[1].nValue = 22*CENT;
|
dummyTransactions[1].vout[1].nValue = 22*CENT;
|
||||||
dummyTransactions[1].vout[1].scriptPubKey = GetScriptForDestination(key[3].GetPubKey().GetID());
|
dummyTransactions[1].vout[1].scriptPubKey = GetScriptForDestination(PKHash(key[3].GetPubKey()));
|
||||||
AddCoins(coinsRet, CTransaction(dummyTransactions[1]), 0);
|
AddCoins(coinsRet, CTransaction(dummyTransactions[1]), 0);
|
||||||
|
|
||||||
return dummyTransactions;
|
return dummyTransactions;
|
||||||
|
@ -562,8 +562,8 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||||
CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
|
CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
|
||||||
|
|
||||||
// P2SH pay-to-compressed-pubkey.
|
// P2SH pay-to-compressed-pubkey.
|
||||||
CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(scriptPubkey1)), output1, input1);
|
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(scriptPubkey1)), output1, input1);
|
||||||
CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(scriptPubkey2)), output2, input2);
|
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(scriptPubkey2)), output2, input2);
|
||||||
ReplaceRedeemScript(input2.vin[0].scriptSig, scriptPubkey1);
|
ReplaceRedeemScript(input2.vin[0].scriptSig, scriptPubkey1);
|
||||||
CheckWithFlag(output1, input1, 0, true);
|
CheckWithFlag(output1, input1, 0, true);
|
||||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
|
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
|
||||||
|
@ -587,8 +587,8 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||||
CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
|
CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
|
||||||
|
|
||||||
// P2SH witness pay-to-compressed-pubkey (v0).
|
// P2SH witness pay-to-compressed-pubkey (v0).
|
||||||
CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptPubkey1))), output1, input1);
|
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptPubkey1))), output1, input1);
|
||||||
CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptPubkey2))), output2, input2);
|
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptPubkey2))), output2, input2);
|
||||||
ReplaceRedeemScript(input2.vin[0].scriptSig, GetScriptForWitness(scriptPubkey1));
|
ReplaceRedeemScript(input2.vin[0].scriptSig, GetScriptForWitness(scriptPubkey1));
|
||||||
CheckWithFlag(output1, input1, 0, true);
|
CheckWithFlag(output1, input1, 0, true);
|
||||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
|
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
|
||||||
|
@ -612,8 +612,8 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||||
CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
|
CheckWithFlag(output1, input2, STANDARD_SCRIPT_VERIFY_FLAGS, false);
|
||||||
|
|
||||||
// P2SH pay-to-uncompressed-pubkey.
|
// P2SH pay-to-uncompressed-pubkey.
|
||||||
CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(scriptPubkey1L)), output1, input1);
|
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(scriptPubkey1L)), output1, input1);
|
||||||
CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(scriptPubkey2L)), output2, input2);
|
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(scriptPubkey2L)), output2, input2);
|
||||||
ReplaceRedeemScript(input2.vin[0].scriptSig, scriptPubkey1L);
|
ReplaceRedeemScript(input2.vin[0].scriptSig, scriptPubkey1L);
|
||||||
CheckWithFlag(output1, input1, 0, true);
|
CheckWithFlag(output1, input1, 0, true);
|
||||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
|
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
|
||||||
|
@ -629,8 +629,8 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||||
CreateCreditAndSpend(keystore, GetScriptForWitness(scriptPubkey2L), output2, input2, false);
|
CreateCreditAndSpend(keystore, GetScriptForWitness(scriptPubkey2L), output2, input2, false);
|
||||||
|
|
||||||
// Signing disabled for P2SH witness pay-to-uncompressed-pubkey (v1).
|
// Signing disabled for P2SH witness pay-to-uncompressed-pubkey (v1).
|
||||||
CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptPubkey1L))), output1, input1, false);
|
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptPubkey1L))), output1, input1, false);
|
||||||
CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptPubkey2L))), output2, input2, false);
|
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptPubkey2L))), output2, input2, false);
|
||||||
|
|
||||||
// Normal 2-of-2 multisig
|
// Normal 2-of-2 multisig
|
||||||
CreateCreditAndSpend(keystore, scriptMulti, output1, input1, false);
|
CreateCreditAndSpend(keystore, scriptMulti, output1, input1, false);
|
||||||
|
@ -642,10 +642,10 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||||
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
||||||
|
|
||||||
// P2SH 2-of-2 multisig
|
// P2SH 2-of-2 multisig
|
||||||
CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(scriptMulti)), output1, input1, false);
|
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(scriptMulti)), output1, input1, false);
|
||||||
CheckWithFlag(output1, input1, 0, true);
|
CheckWithFlag(output1, input1, 0, true);
|
||||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, false);
|
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, false);
|
||||||
CreateCreditAndSpend(keystore2, GetScriptForDestination(CScriptID(scriptMulti)), output2, input2, false);
|
CreateCreditAndSpend(keystore2, GetScriptForDestination(ScriptHash(scriptMulti)), output2, input2, false);
|
||||||
CheckWithFlag(output2, input2, 0, true);
|
CheckWithFlag(output2, input2, 0, true);
|
||||||
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, false);
|
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, false);
|
||||||
BOOST_CHECK(*output1 == *output2);
|
BOOST_CHECK(*output1 == *output2);
|
||||||
|
@ -666,10 +666,10 @@ BOOST_AUTO_TEST_CASE(test_witness)
|
||||||
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
CheckWithFlag(output1, input1, STANDARD_SCRIPT_VERIFY_FLAGS, true);
|
||||||
|
|
||||||
// P2SH witness 2-of-2 multisig
|
// P2SH witness 2-of-2 multisig
|
||||||
CreateCreditAndSpend(keystore, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptMulti))), output1, input1, false);
|
CreateCreditAndSpend(keystore, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptMulti))), output1, input1, false);
|
||||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
|
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH, true);
|
||||||
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
|
CheckWithFlag(output1, input1, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
|
||||||
CreateCreditAndSpend(keystore2, GetScriptForDestination(CScriptID(GetScriptForWitness(scriptMulti))), output2, input2, false);
|
CreateCreditAndSpend(keystore2, GetScriptForDestination(ScriptHash(GetScriptForWitness(scriptMulti))), output2, input2, false);
|
||||||
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, true);
|
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH, true);
|
||||||
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
|
CheckWithFlag(output2, input2, SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_WITNESS, false);
|
||||||
BOOST_CHECK(*output1 == *output2);
|
BOOST_CHECK(*output1 == *output2);
|
||||||
|
@ -695,7 +695,7 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
|
||||||
t.vout[0].nValue = 90*CENT;
|
t.vout[0].nValue = 90*CENT;
|
||||||
CKey key;
|
CKey key;
|
||||||
key.MakeNewKey(true);
|
key.MakeNewKey(true);
|
||||||
t.vout[0].scriptPubKey = GetScriptForDestination(key.GetPubKey().GetID());
|
t.vout[0].scriptPubKey = GetScriptForDestination(PKHash(key.GetPubKey()));
|
||||||
|
|
||||||
std::string reason;
|
std::string reason;
|
||||||
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
BOOST_CHECK(IsStandardTx(CTransaction(t), reason));
|
||||||
|
|
|
@ -56,7 +56,7 @@ BOOST_FIXTURE_TEST_CASE(txindex_initial_sync, TestChain100Setup)
|
||||||
|
|
||||||
// Check that new transactions in new blocks make it into the index.
|
// Check that new transactions in new blocks make it into the index.
|
||||||
for (int i = 0; i < 10; i++) {
|
for (int i = 0; i < 10; i++) {
|
||||||
CScript coinbase_script_pub_key = GetScriptForDestination(coinbaseKey.GetPubKey().GetID());
|
CScript coinbase_script_pub_key = GetScriptForDestination(PKHash(coinbaseKey.GetPubKey()));
|
||||||
std::vector<CMutableTransaction> no_txns;
|
std::vector<CMutableTransaction> no_txns;
|
||||||
const CBlock& block = CreateAndProcessBlock(no_txns, coinbase_script_pub_key);
|
const CBlock& block = CreateAndProcessBlock(no_txns, coinbase_script_pub_key);
|
||||||
const CTransaction& txn = *block.vtx[0];
|
const CTransaction& txn = *block.vtx[0];
|
||||||
|
|
|
@ -151,8 +151,8 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
||||||
}
|
}
|
||||||
|
|
||||||
CScript p2pk_scriptPubKey = CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG;
|
CScript p2pk_scriptPubKey = CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG;
|
||||||
CScript p2sh_scriptPubKey = GetScriptForDestination(CScriptID(p2pk_scriptPubKey));
|
CScript p2sh_scriptPubKey = GetScriptForDestination(ScriptHash(p2pk_scriptPubKey));
|
||||||
CScript p2pkh_scriptPubKey = GetScriptForDestination(coinbaseKey.GetPubKey().GetID());
|
CScript p2pkh_scriptPubKey = GetScriptForDestination(PKHash(coinbaseKey.GetPubKey()));
|
||||||
CScript p2wpkh_scriptPubKey = GetScriptForWitness(p2pkh_scriptPubKey);
|
CScript p2wpkh_scriptPubKey = GetScriptForWitness(p2pkh_scriptPubKey);
|
||||||
|
|
||||||
CBasicKeyStore keystore;
|
CBasicKeyStore keystore;
|
||||||
|
|
|
@ -252,7 +252,7 @@ static void ImportScript(CWallet* const pwallet, const CScript& script, const st
|
||||||
if (!pwallet->HaveCScript(id) && !pwallet->AddCScript(script)) {
|
if (!pwallet->HaveCScript(id) && !pwallet->AddCScript(script)) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding p2sh redeemScript to wallet");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding p2sh redeemScript to wallet");
|
||||||
}
|
}
|
||||||
ImportAddress(pwallet, id, strLabel);
|
ImportAddress(pwallet, ScriptHash(id), strLabel);
|
||||||
} else {
|
} else {
|
||||||
CTxDestination destination;
|
CTxDestination destination;
|
||||||
if (ExtractDestination(script, destination)) {
|
if (ExtractDestination(script, destination)) {
|
||||||
|
@ -661,17 +661,17 @@ UniValue importwallet(const JSONRPCRequest& request)
|
||||||
assert(key.VerifyPubKey(pubkey));
|
assert(key.VerifyPubKey(pubkey));
|
||||||
CKeyID keyid = pubkey.GetID();
|
CKeyID keyid = pubkey.GetID();
|
||||||
if (pwallet->HaveKey(keyid)) {
|
if (pwallet->HaveKey(keyid)) {
|
||||||
pwallet->WalletLogPrintf("Skipping import of %s (key already present)\n", EncodeDestination(keyid));
|
pwallet->WalletLogPrintf("Skipping import of %s (key already present)\n", EncodeDestination(PKHash(keyid)));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pwallet->WalletLogPrintf("Importing %s...\n", EncodeDestination(keyid));
|
pwallet->WalletLogPrintf("Importing %s...\n", EncodeDestination(PKHash(keyid)));
|
||||||
if (!pwallet->AddKeyPubKey(key, pubkey)) {
|
if (!pwallet->AddKeyPubKey(key, pubkey)) {
|
||||||
fGood = false;
|
fGood = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pwallet->mapKeyMetadata[keyid].nCreateTime = time;
|
pwallet->mapKeyMetadata[keyid].nCreateTime = time;
|
||||||
if (has_label)
|
if (has_label)
|
||||||
pwallet->SetAddressBook(keyid, label, "receive");
|
pwallet->SetAddressBook(PKHash(keyid), label, "receive");
|
||||||
nTimeBegin = std::min(nTimeBegin, time);
|
nTimeBegin = std::min(nTimeBegin, time);
|
||||||
progress++;
|
progress++;
|
||||||
}
|
}
|
||||||
|
@ -817,8 +817,8 @@ UniValue dumpwallet(const JSONRPCRequest& request)
|
||||||
// sort time/key pairs
|
// sort time/key pairs
|
||||||
std::vector<std::pair<int64_t, CKeyID> > vKeyBirth;
|
std::vector<std::pair<int64_t, CKeyID> > vKeyBirth;
|
||||||
for (const auto& entry : mapKeyBirth) {
|
for (const auto& entry : mapKeyBirth) {
|
||||||
if (const CKeyID* keyID = boost::get<CKeyID>(&entry.first)) { // set and test
|
if (const PKHash* keyID = boost::get<PKHash>(&entry.first)) { // set and test
|
||||||
vKeyBirth.push_back(std::make_pair(entry.second, *keyID));
|
vKeyBirth.push_back(std::make_pair(entry.second, CKeyID(*keyID)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mapKeyBirth.clear();
|
mapKeyBirth.clear();
|
||||||
|
@ -870,7 +870,7 @@ UniValue dumpwallet(const JSONRPCRequest& request)
|
||||||
for (const CScriptID &scriptid : scripts) {
|
for (const CScriptID &scriptid : scripts) {
|
||||||
CScript script;
|
CScript script;
|
||||||
std::string create_time = "0";
|
std::string create_time = "0";
|
||||||
std::string address = EncodeDestination(scriptid);
|
std::string address = EncodeDestination(ScriptHash(scriptid));
|
||||||
// get birth times for scripts with metadata
|
// get birth times for scripts with metadata
|
||||||
auto it = pwallet->m_script_metadata.find(scriptid);
|
auto it = pwallet->m_script_metadata.find(scriptid);
|
||||||
if (it != pwallet->m_script_metadata.end()) {
|
if (it != pwallet->m_script_metadata.end()) {
|
||||||
|
|
|
@ -550,13 +550,14 @@ static UniValue signmessage(const JSONRPCRequest& request)
|
||||||
throw JSONRPCError(RPC_TYPE_ERROR, "Invalid address");
|
throw JSONRPCError(RPC_TYPE_ERROR, "Invalid address");
|
||||||
}
|
}
|
||||||
|
|
||||||
const CKeyID *keyID = boost::get<CKeyID>(&dest);
|
const PKHash *pkhash = boost::get<PKHash>(&dest);
|
||||||
if (!keyID) {
|
if (!pkhash) {
|
||||||
throw JSONRPCError(RPC_TYPE_ERROR, "Address does not refer to key");
|
throw JSONRPCError(RPC_TYPE_ERROR, "Address does not refer to key");
|
||||||
}
|
}
|
||||||
|
|
||||||
CKey key;
|
CKey key;
|
||||||
if (!pwallet->GetKey(*keyID, key)) {
|
CKeyID keyID(*pkhash);
|
||||||
|
if (!pwallet->GetKey(keyID, key)) {
|
||||||
throw JSONRPCError(RPC_WALLET_ERROR, "Private key not available");
|
throw JSONRPCError(RPC_WALLET_ERROR, "Private key not available");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2820,7 +2821,7 @@ static UniValue listunspent(const JSONRPCRequest& request)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scriptPubKey.IsPayToScriptHash()) {
|
if (scriptPubKey.IsPayToScriptHash()) {
|
||||||
const CScriptID& hash = boost::get<CScriptID>(address);
|
const CScriptID& hash = CScriptID(boost::get<ScriptHash>(address));
|
||||||
CScript redeemScript;
|
CScript redeemScript;
|
||||||
if (pwallet->GetCScript(hash, redeemScript)) {
|
if (pwallet->GetCScript(hash, redeemScript)) {
|
||||||
entry.pushKV("redeemScript", HexStr(redeemScript.begin(), redeemScript.end()));
|
entry.pushKV("redeemScript", HexStr(redeemScript.begin(), redeemScript.end()));
|
||||||
|
@ -3453,8 +3454,9 @@ public:
|
||||||
|
|
||||||
UniValue operator()(const CNoDestination& dest) const { return UniValue(UniValue::VOBJ); }
|
UniValue operator()(const CNoDestination& dest) const { return UniValue(UniValue::VOBJ); }
|
||||||
|
|
||||||
UniValue operator()(const CKeyID& keyID) const
|
UniValue operator()(const PKHash& pkhash) const
|
||||||
{
|
{
|
||||||
|
CKeyID keyID(pkhash);
|
||||||
UniValue obj(UniValue::VOBJ);
|
UniValue obj(UniValue::VOBJ);
|
||||||
CPubKey vchPubKey;
|
CPubKey vchPubKey;
|
||||||
if (pwallet && pwallet->GetPubKey(keyID, vchPubKey)) {
|
if (pwallet && pwallet->GetPubKey(keyID, vchPubKey)) {
|
||||||
|
@ -3464,8 +3466,9 @@ public:
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
UniValue operator()(const CScriptID& scriptID) const
|
UniValue operator()(const ScriptHash& scripthash) const
|
||||||
{
|
{
|
||||||
|
CScriptID scriptID(scripthash);
|
||||||
UniValue obj(UniValue::VOBJ);
|
UniValue obj(UniValue::VOBJ);
|
||||||
CScript subscript;
|
CScript subscript;
|
||||||
if (pwallet && pwallet->GetCScript(scriptID, subscript)) {
|
if (pwallet && pwallet->GetCScript(scriptID, subscript)) {
|
||||||
|
|
|
@ -322,7 +322,7 @@ BOOST_AUTO_TEST_CASE(ComputeTimeSmart)
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(LoadReceiveRequests)
|
BOOST_AUTO_TEST_CASE(LoadReceiveRequests)
|
||||||
{
|
{
|
||||||
CTxDestination dest = CKeyID();
|
CTxDestination dest = PKHash();
|
||||||
LOCK(m_wallet.cs_wallet);
|
LOCK(m_wallet.cs_wallet);
|
||||||
m_wallet.AddDestData(dest, "misc", "val_misc");
|
m_wallet.AddDestData(dest, "misc", "val_misc");
|
||||||
m_wallet.AddDestData(dest, "rr0", "val_rr0");
|
m_wallet.AddDestData(dest, "rr0", "val_rr0");
|
||||||
|
@ -399,7 +399,7 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
||||||
list = wallet->ListCoins(*m_locked_chain);
|
list = wallet->ListCoins(*m_locked_chain);
|
||||||
}
|
}
|
||||||
BOOST_CHECK_EQUAL(list.size(), 1U);
|
BOOST_CHECK_EQUAL(list.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
|
BOOST_CHECK_EQUAL(boost::get<PKHash>(list.begin()->first).ToString(), coinbaseAddress);
|
||||||
BOOST_CHECK_EQUAL(list.begin()->second.size(), 1U);
|
BOOST_CHECK_EQUAL(list.begin()->second.size(), 1U);
|
||||||
|
|
||||||
// Check initial balance from one mature coinbase transaction.
|
// Check initial balance from one mature coinbase transaction.
|
||||||
|
@ -415,7 +415,7 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
||||||
list = wallet->ListCoins(*m_locked_chain);
|
list = wallet->ListCoins(*m_locked_chain);
|
||||||
}
|
}
|
||||||
BOOST_CHECK_EQUAL(list.size(), 1U);
|
BOOST_CHECK_EQUAL(list.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
|
BOOST_CHECK_EQUAL(boost::get<PKHash>(list.begin()->first).ToString(), coinbaseAddress);
|
||||||
BOOST_CHECK_EQUAL(list.begin()->second.size(), 2U);
|
BOOST_CHECK_EQUAL(list.begin()->second.size(), 2U);
|
||||||
|
|
||||||
// Lock both coins. Confirm number of available coins drops to 0.
|
// Lock both coins. Confirm number of available coins drops to 0.
|
||||||
|
@ -444,7 +444,7 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
||||||
list = wallet->ListCoins(*m_locked_chain);
|
list = wallet->ListCoins(*m_locked_chain);
|
||||||
}
|
}
|
||||||
BOOST_CHECK_EQUAL(list.size(), 1U);
|
BOOST_CHECK_EQUAL(list.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
|
BOOST_CHECK_EQUAL(boost::get<PKHash>(list.begin()->first).ToString(), coinbaseAddress);
|
||||||
BOOST_CHECK_EQUAL(list.begin()->second.size(), 2U);
|
BOOST_CHECK_EQUAL(list.begin()->second.size(), 2U);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -306,7 +306,7 @@ bool CWallet::AddKeyPubKeyWithDB(WalletBatch& batch, const CKey& secret, const C
|
||||||
|
|
||||||
// check if we need to remove from watch-only
|
// check if we need to remove from watch-only
|
||||||
CScript script;
|
CScript script;
|
||||||
script = GetScriptForDestination(pubkey.GetID());
|
script = GetScriptForDestination(PKHash(pubkey));
|
||||||
if (HaveWatchOnly(script)) {
|
if (HaveWatchOnly(script)) {
|
||||||
RemoveWatchOnly(script);
|
RemoveWatchOnly(script);
|
||||||
}
|
}
|
||||||
|
@ -449,7 +449,7 @@ bool CWallet::LoadCScript(const CScript& redeemScript)
|
||||||
* these. Do not add them to the wallet and warn. */
|
* these. Do not add them to the wallet and warn. */
|
||||||
if (redeemScript.size() > MAX_SCRIPT_ELEMENT_SIZE)
|
if (redeemScript.size() > MAX_SCRIPT_ELEMENT_SIZE)
|
||||||
{
|
{
|
||||||
std::string strAddr = EncodeDestination(CScriptID(redeemScript));
|
std::string strAddr = EncodeDestination(ScriptHash(redeemScript));
|
||||||
WalletLogPrintf("%s: Warning: This wallet contains a redeemScript of size %i which exceeds maximum size %i thus can never be redeemed. Do not use address %s.\n", __func__, redeemScript.size(), MAX_SCRIPT_ELEMENT_SIZE, strAddr);
|
WalletLogPrintf("%s: Warning: This wallet contains a redeemScript of size %i which exceeds maximum size %i thus can never be redeemed. Do not use address %s.\n", __func__, redeemScript.size(), MAX_SCRIPT_ELEMENT_SIZE, strAddr);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -3768,7 +3768,7 @@ void CWallet::GetKeyBirthTimes(interfaces::Chain::Lock& locked_chain, std::map<C
|
||||||
// get birth times for keys with metadata
|
// get birth times for keys with metadata
|
||||||
for (const auto& entry : mapKeyMetadata) {
|
for (const auto& entry : mapKeyMetadata) {
|
||||||
if (entry.second.nCreateTime) {
|
if (entry.second.nCreateTime) {
|
||||||
mapKeyBirth[entry.first] = entry.second.nCreateTime;
|
mapKeyBirth[PKHash(entry.first)] = entry.second.nCreateTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3777,7 +3777,7 @@ void CWallet::GetKeyBirthTimes(interfaces::Chain::Lock& locked_chain, std::map<C
|
||||||
const int max_height = tip_height && *tip_height > 144 ? *tip_height - 144 : 0; // the tip can be reorganized; use a 144-block safety margin
|
const int max_height = tip_height && *tip_height > 144 ? *tip_height - 144 : 0; // the tip can be reorganized; use a 144-block safety margin
|
||||||
std::map<CKeyID, int> mapKeyFirstBlock;
|
std::map<CKeyID, int> mapKeyFirstBlock;
|
||||||
for (const CKeyID &keyid : GetKeys()) {
|
for (const CKeyID &keyid : GetKeys()) {
|
||||||
if (mapKeyBirth.count(keyid) == 0)
|
if (mapKeyBirth.count(PKHash(keyid)) == 0)
|
||||||
mapKeyFirstBlock[keyid] = max_height;
|
mapKeyFirstBlock[keyid] = max_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3805,7 +3805,7 @@ void CWallet::GetKeyBirthTimes(interfaces::Chain::Lock& locked_chain, std::map<C
|
||||||
|
|
||||||
// Extract block timestamps for those keys
|
// Extract block timestamps for those keys
|
||||||
for (const auto& entry : mapKeyFirstBlock)
|
for (const auto& entry : mapKeyFirstBlock)
|
||||||
mapKeyBirth[entry.first] = locked_chain.getBlockTime(entry.second) - TIMESTAMP_WINDOW; // block times can be 2h off
|
mapKeyBirth[PKHash(entry.first)] = locked_chain.getBlockTime(entry.second) - TIMESTAMP_WINDOW; // block times can be 2h off
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue