mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
merge bitcoin#20286: deprecate addresses and reqSigs from rpc outputs
This commit is contained in:
parent
7cddf70c58
commit
169dce7e50
@ -98,11 +98,8 @@ $ curl localhost:19998/rest/getutxos/checkmempool/b2cdfd7b89def827ff8af7cd9bff76
|
|||||||
"scriptPubKey" : {
|
"scriptPubKey" : {
|
||||||
"asm" : "OP_DUP OP_HASH160 1c7cebb529b86a04c683dfa87be49de35bcf589e OP_EQUALVERIFY OP_CHECKSIG",
|
"asm" : "OP_DUP OP_HASH160 1c7cebb529b86a04c683dfa87be49de35bcf589e OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex" : "76a9141c7cebb529b86a04c683dfa87be49de35bcf589e88ac",
|
"hex" : "76a9141c7cebb529b86a04c683dfa87be49de35bcf589e88ac",
|
||||||
"reqSigs" : 1,
|
|
||||||
"type" : "pubkeyhash",
|
"type" : "pubkeyhash",
|
||||||
"addresses" : [
|
"address" : "mi7as51dvLJsizWnTMurtRmrP8hG2m1XvD"
|
||||||
"mi7as51dvLJsizWnTMurtRmrP8hG2m1XvD"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
16
doc/release-notes-20286.md
Normal file
16
doc/release-notes-20286.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
Updated RPCs
|
||||||
|
------------
|
||||||
|
|
||||||
|
- The following RPCs: `gettxout`, `getrawtransaction`, `decoderawtransaction`,
|
||||||
|
`decodescript`, `gettransaction`, and REST endpoints: `/rest/tx`,
|
||||||
|
`/rest/getutxos`, `/rest/block` deprecated the following fields (which are no
|
||||||
|
longer returned in the responses by default): `addresses`, `reqSigs`.
|
||||||
|
The `-deprecatedrpc=addresses` flag must be passed for these fields to be
|
||||||
|
included in the RPC response. Note that these fields are attributes of
|
||||||
|
the `scriptPubKey` object returned in the RPC response. However, in the response
|
||||||
|
of `decodescript` these fields are top-level attributes, and included again as attributes
|
||||||
|
of the `scriptPubKey` object.
|
||||||
|
|
||||||
|
- When creating a hex-encoded Dash transaction using the `dash-tx` utility
|
||||||
|
with the `-json` option set, the following fields: `addresses`, `reqSigs` are no longer
|
||||||
|
returned in the tx output of the response.
|
@ -676,7 +676,7 @@ static void MutateTx(CMutableTransaction& tx, const std::string& command,
|
|||||||
static void OutputTxJSON(const CTransaction& tx)
|
static void OutputTxJSON(const CTransaction& tx)
|
||||||
{
|
{
|
||||||
UniValue entry(UniValue::VOBJ);
|
UniValue entry(UniValue::VOBJ);
|
||||||
TxToUniv(tx, uint256(), entry);
|
TxToUniv(tx, uint256(), /* include_addresses */ false, entry);
|
||||||
|
|
||||||
std::string jsonOutput = entry.write(4);
|
std::string jsonOutput = entry.write(4);
|
||||||
tfm::format(std::cout, "%s\n", jsonOutput);
|
tfm::format(std::cout, "%s\n", jsonOutput);
|
||||||
|
@ -45,8 +45,8 @@ UniValue ValueFromAmount(const CAmount amount);
|
|||||||
std::string FormatScript(const CScript& script);
|
std::string FormatScript(const CScript& script);
|
||||||
std::string EncodeHexTx(const CTransaction& tx);
|
std::string EncodeHexTx(const CTransaction& tx);
|
||||||
std::string SighashToStr(unsigned char sighash_type);
|
std::string SighashToStr(unsigned char sighash_type);
|
||||||
void ScriptPubKeyToUniv(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex);
|
void ScriptPubKeyToUniv(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex, bool include_addresses);
|
||||||
void ScriptToUniv(const CScript& script, UniValue& out, bool include_address);
|
void ScriptToUniv(const CScript& script, UniValue& out, bool include_address);
|
||||||
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry, bool include_hex = true, const CTxUndo* txundo = nullptr, const CSpentIndexTxInfo* ptxSpentInfo = nullptr);
|
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, bool include_addresses, UniValue& entry, bool include_hex = true, const CTxUndo* txundo = nullptr, const CSpentIndexTxInfo* ptxSpentInfo = nullptr);
|
||||||
|
|
||||||
#endif // BITCOIN_CORE_IO_H
|
#endif // BITCOIN_CORE_IO_H
|
||||||
|
@ -166,10 +166,13 @@ void ScriptToUniv(const CScript& script, UniValue& out, bool include_address)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: from v21 ("addresses" and "reqSigs" deprecated) this method should be refactored to remove the `include_addresses` option
|
||||||
|
// this method can also be combined with `ScriptToUniv` as they will overlap
|
||||||
void ScriptPubKeyToUniv(const CScript& scriptPubKey,
|
void ScriptPubKeyToUniv(const CScript& scriptPubKey,
|
||||||
UniValue& out, bool fIncludeHex)
|
UniValue& out, bool fIncludeHex, bool include_addresses)
|
||||||
{
|
{
|
||||||
TxoutType type;
|
TxoutType type;
|
||||||
|
CTxDestination address;
|
||||||
std::vector<CTxDestination> addresses;
|
std::vector<CTxDestination> addresses;
|
||||||
int nRequired;
|
int nRequired;
|
||||||
|
|
||||||
@ -182,17 +185,22 @@ void ScriptPubKeyToUniv(const CScript& scriptPubKey,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
out.pushKV("reqSigs", nRequired);
|
if (ExtractDestination(scriptPubKey, address)) {
|
||||||
|
out.pushKV("address", EncodeDestination(address));
|
||||||
|
}
|
||||||
out.pushKV("type", GetTxnOutputType(type));
|
out.pushKV("type", GetTxnOutputType(type));
|
||||||
|
|
||||||
UniValue a(UniValue::VARR);
|
if (include_addresses) {
|
||||||
for (const CTxDestination& addr : addresses) {
|
UniValue a(UniValue::VARR);
|
||||||
a.push_back(EncodeDestination(addr));
|
for (const CTxDestination& addr : addresses) {
|
||||||
|
a.push_back(EncodeDestination(addr));
|
||||||
|
}
|
||||||
|
out.pushKV("addresses", a);
|
||||||
|
out.pushKV("reqSigs", nRequired);
|
||||||
}
|
}
|
||||||
out.pushKV("addresses", a);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry, bool include_hex, const CTxUndo* txundo, const CSpentIndexTxInfo* ptxSpentInfo)
|
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, bool include_addresses, UniValue& entry, bool include_hex, const CTxUndo* txundo, const CSpentIndexTxInfo* ptxSpentInfo)
|
||||||
{
|
{
|
||||||
uint256 txid = tx.GetHash();
|
uint256 txid = tx.GetHash();
|
||||||
entry.pushKV("txid", txid.GetHex());
|
entry.pushKV("txid", txid.GetHex());
|
||||||
@ -260,7 +268,7 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
|
|||||||
out.pushKV("n", (int64_t)i);
|
out.pushKV("n", (int64_t)i);
|
||||||
|
|
||||||
UniValue o(UniValue::VOBJ);
|
UniValue o(UniValue::VOBJ);
|
||||||
ScriptPubKeyToUniv(txout.scriptPubKey, o, true);
|
ScriptPubKeyToUniv(txout.scriptPubKey, o, true, include_addresses);
|
||||||
out.pushKV("scriptPubKey", o);
|
out.pushKV("scriptPubKey", o);
|
||||||
|
|
||||||
// Add spent information if spentindex is enabled
|
// Add spent information if spentindex is enabled
|
||||||
|
@ -1513,11 +1513,12 @@ static RPCHelpMan gettxout()
|
|||||||
{RPCResult::Type::STR_AMOUNT, "value", "The transaction value in " + CURRENCY_UNIT},
|
{RPCResult::Type::STR_AMOUNT, "value", "The transaction value in " + CURRENCY_UNIT},
|
||||||
{RPCResult::Type::OBJ, "scriptPubKey", "",
|
{RPCResult::Type::OBJ, "scriptPubKey", "",
|
||||||
{
|
{
|
||||||
{RPCResult::Type::STR_HEX, "asm", ""},
|
{RPCResult::Type::STR, "asm", ""},
|
||||||
{RPCResult::Type::STR_HEX, "hex", ""},
|
{RPCResult::Type::STR_HEX, "hex", ""},
|
||||||
{RPCResult::Type::NUM, "reqSigs", "Number of required signatures"},
|
{RPCResult::Type::NUM, "reqSigs", /* optional */ true, "(DEPRECATED, returned only if config option -deprecatedrpc=addresses is passed) Number of required signatures"},
|
||||||
{RPCResult::Type::STR_HEX, "type", "The type, eg pubkeyhash"},
|
{RPCResult::Type::STR_HEX, "type", "The type, eg pubkeyhash"},
|
||||||
{RPCResult::Type::ARR, "addresses", "Array of Dash addresses",
|
{RPCResult::Type::STR, "address", /* optional */ true, "Dash address (only if a well-defined address exists)"},
|
||||||
|
{RPCResult::Type::ARR, "addresses", /* optional */ true, "(DEPRECATED, returned only if config option -deprecatedrpc=addresses is passed) Array of Dash addresses",
|
||||||
{{RPCResult::Type::STR, "address", "Dash address"}}},
|
{{RPCResult::Type::STR, "address", "Dash address"}}},
|
||||||
}},
|
}},
|
||||||
{RPCResult::Type::BOOL, "coinbase", "Coinbase or not"},
|
{RPCResult::Type::BOOL, "coinbase", "Coinbase or not"},
|
||||||
@ -2264,6 +2265,16 @@ void CalculatePercentilesBySize(CAmount result[NUM_GETBLOCKSTATS_PERCENTILES], s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ScriptPubKeyToUniv(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex)
|
||||||
|
{
|
||||||
|
ScriptPubKeyToUniv(scriptPubKey, out, fIncludeHex, IsDeprecatedRPCEnabled("addresses"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry, bool include_hex, const CTxUndo* txundo, const CSpentIndexTxInfo* ptxSpentInfo)
|
||||||
|
{
|
||||||
|
TxToUniv(tx, hashBlock, IsDeprecatedRPCEnabled("addresses"), entry, include_hex, txundo, ptxSpentInfo);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static inline bool SetHasKeys(const std::set<T>& set) {return false;}
|
static inline bool SetHasKeys(const std::set<T>& set) {return false;}
|
||||||
template<typename T, typename Tk, typename... Args>
|
template<typename T, typename Tk, typename... Args>
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include <amount.h>
|
#include <amount.h>
|
||||||
#include <context.h>
|
#include <context.h>
|
||||||
|
#include <core_io.h>
|
||||||
#include <streams.h>
|
#include <streams.h>
|
||||||
#include <sync.h>
|
#include <sync.h>
|
||||||
|
|
||||||
@ -57,6 +58,9 @@ UniValue blockheaderToJSON(const CBlockIndex* tip, const CBlockIndex* blockindex
|
|||||||
/** Used by getblockstats to get feerates at different percentiles by weight */
|
/** Used by getblockstats to get feerates at different percentiles by weight */
|
||||||
void CalculatePercentilesBySize(CAmount result[NUM_GETBLOCKSTATS_PERCENTILES], std::vector<std::pair<CAmount, int64_t>>& scores, int64_t total_size);
|
void CalculatePercentilesBySize(CAmount result[NUM_GETBLOCKSTATS_PERCENTILES], std::vector<std::pair<CAmount, int64_t>>& scores, int64_t total_size);
|
||||||
|
|
||||||
|
void ScriptPubKeyToUniv(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex);
|
||||||
|
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry, bool include_hex = true, const CTxUndo* txundo = nullptr, const CSpentIndexTxInfo* ptxSpentInfo = nullptr);
|
||||||
|
|
||||||
NodeContext& EnsureAnyNodeContext(const CoreContext& context);
|
NodeContext& EnsureAnyNodeContext(const CoreContext& context);
|
||||||
CTxMemPool& EnsureMemPool(const NodeContext& node);
|
CTxMemPool& EnsureMemPool(const NodeContext& node);
|
||||||
CTxMemPool& EnsureAnyMemPool(const CoreContext& context);
|
CTxMemPool& EnsureAnyMemPool(const CoreContext& context);
|
||||||
|
@ -168,9 +168,10 @@ static RPCHelpMan getrawtransaction()
|
|||||||
{
|
{
|
||||||
{RPCResult::Type::STR, "asm", "the asm"},
|
{RPCResult::Type::STR, "asm", "the asm"},
|
||||||
{RPCResult::Type::STR, "hex", "the hex"},
|
{RPCResult::Type::STR, "hex", "the hex"},
|
||||||
{RPCResult::Type::NUM, "reqSigs", "The required sigs"},
|
{RPCResult::Type::NUM, "reqSigs", /* optional */ true, "(DEPRECATED, returned only if config option -deprecatedrpc=addresses is passed) Number of required signatures"},
|
||||||
{RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
|
{RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
|
||||||
{RPCResult::Type::ARR, "addresses", "",
|
{RPCResult::Type::STR, "address", /* optional */ true, "Dash address (only if a well-defined address exists)"},
|
||||||
|
{RPCResult::Type::ARR, "addresses", /* optional */ true, "(DEPRECATED, returned only if config option -deprecatedrpc=addresses is passed) Array of Dash addresses",
|
||||||
{
|
{
|
||||||
{RPCResult::Type::STR, "address", "Dash address"},
|
{RPCResult::Type::STR, "address", "Dash address"},
|
||||||
}},
|
}},
|
||||||
@ -827,9 +828,10 @@ static RPCHelpMan decoderawtransaction()
|
|||||||
{
|
{
|
||||||
{RPCResult::Type::STR, "asm", "the asm"},
|
{RPCResult::Type::STR, "asm", "the asm"},
|
||||||
{RPCResult::Type::STR_HEX, "hex", "the hex"},
|
{RPCResult::Type::STR_HEX, "hex", "the hex"},
|
||||||
{RPCResult::Type::NUM, "reqSigs", "The required sigs"},
|
{RPCResult::Type::NUM, "reqSigs", /* optional */ true, "(DEPRECATED, returned only if config option -deprecatedrpc=addresses is passed) Number of required signatures"},
|
||||||
{RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
|
{RPCResult::Type::STR, "type", "The type, eg 'pubkeyhash'"},
|
||||||
{RPCResult::Type::ARR, "addresses", "",
|
{RPCResult::Type::STR, "address", /* optional */ true, "Dash address (only if a well-defined address exists)"},
|
||||||
|
{RPCResult::Type::ARR, "addresses", /* optional */ true, "(DEPRECATED, returned only if config option -deprecatedrpc=addresses is passed) Array of Dash addresses",
|
||||||
{
|
{
|
||||||
{RPCResult::Type::STR, "address", "Dash address"},
|
{RPCResult::Type::STR, "address", "Dash address"},
|
||||||
}},
|
}},
|
||||||
@ -883,8 +885,9 @@ static RPCHelpMan decodescript()
|
|||||||
{
|
{
|
||||||
{RPCResult::Type::STR, "asm", "Script public key"},
|
{RPCResult::Type::STR, "asm", "Script public key"},
|
||||||
{RPCResult::Type::STR, "type", "The output type (e.g. "+GetAllOutputTypes()+")"},
|
{RPCResult::Type::STR, "type", "The output type (e.g. "+GetAllOutputTypes()+")"},
|
||||||
{RPCResult::Type::NUM, "reqSigs", "The required signatures"},
|
{RPCResult::Type::STR, "address", /* optional */ true, "Dash address (only if a well-defined address exists)"},
|
||||||
{RPCResult::Type::ARR, "addresses", "",
|
{RPCResult::Type::NUM, "reqSigs", /* optional */ true, "(DEPRECATED, returned only if config option -deprecatedrpc=addresses is passed) Number of required signatures"},
|
||||||
|
{RPCResult::Type::ARR, "addresses", /* optional */ true, "(DEPRECATED, returned only if config option -deprecatedrpc=addresses is passed) Array of Dash addresses",
|
||||||
{
|
{
|
||||||
{RPCResult::Type::STR, "address", "Dash address"},
|
{RPCResult::Type::STR, "address", "Dash address"},
|
||||||
}},
|
}},
|
||||||
|
@ -189,7 +189,6 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case TxoutType::MULTISIG:
|
case TxoutType::MULTISIG:
|
||||||
// Multisig txns have more than one address...
|
|
||||||
case TxoutType::NULL_DATA:
|
case TxoutType::NULL_DATA:
|
||||||
case TxoutType::NONSTANDARD:
|
case TxoutType::NONSTANDARD:
|
||||||
return false;
|
return false;
|
||||||
@ -197,6 +196,7 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
|||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: from v21 ("addresses" and "reqSigs" deprecated) "ExtractDestinations" should be removed
|
||||||
bool ExtractDestinations(const CScript& scriptPubKey, TxoutType& typeRet, std::vector<CTxDestination>& addressRet, int& nRequiredRet)
|
bool ExtractDestinations(const CScript& scriptPubKey, TxoutType& typeRet, std::vector<CTxDestination>& addressRet, int& nRequiredRet)
|
||||||
{
|
{
|
||||||
addressRet.clear();
|
addressRet.clear();
|
||||||
|
@ -134,6 +134,8 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
|||||||
* and nRequiredRet with the n required to spend. For other destinations,
|
* and nRequiredRet with the n required to spend. For other destinations,
|
||||||
* addressRet is populated with a single value and nRequiredRet is set to 1.
|
* addressRet is populated with a single value and nRequiredRet is set to 1.
|
||||||
* Returns true if successful.
|
* Returns true if successful.
|
||||||
|
*
|
||||||
|
* TODO: from v21 ("addresses" and "reqSigs" deprecated) "ExtractDestinations" should be removed
|
||||||
*/
|
*/
|
||||||
bool ExtractDestinations(const CScript& scriptPubKey, TxoutType& typeRet, std::vector<CTxDestination>& addressRet, int& nRequiredRet);
|
bool ExtractDestinations(const CScript& scriptPubKey, TxoutType& typeRet, std::vector<CTxDestination>& addressRet, int& nRequiredRet);
|
||||||
|
|
||||||
|
@ -125,9 +125,11 @@ FUZZ_TARGET_INIT(script, initialize_script)
|
|||||||
(void)ScriptToAsmStr(script, true);
|
(void)ScriptToAsmStr(script, true);
|
||||||
|
|
||||||
UniValue o1(UniValue::VOBJ);
|
UniValue o1(UniValue::VOBJ);
|
||||||
ScriptPubKeyToUniv(script, o1, true);
|
ScriptPubKeyToUniv(script, o1, true, true);
|
||||||
|
ScriptPubKeyToUniv(script, o1, true, false);
|
||||||
UniValue o2(UniValue::VOBJ);
|
UniValue o2(UniValue::VOBJ);
|
||||||
ScriptPubKeyToUniv(script, o2, false);
|
ScriptPubKeyToUniv(script, o2, false, true);
|
||||||
|
ScriptPubKeyToUniv(script, o2, false, false);
|
||||||
UniValue o3(UniValue::VOBJ);
|
UniValue o3(UniValue::VOBJ);
|
||||||
ScriptToUniv(script, o3, true);
|
ScriptToUniv(script, o3, true);
|
||||||
UniValue o4(UniValue::VOBJ);
|
UniValue o4(UniValue::VOBJ);
|
||||||
|
@ -94,7 +94,9 @@ FUZZ_TARGET_INIT(transaction, initialize_transaction)
|
|||||||
(void)AreInputsStandard(tx, coins_view_cache);
|
(void)AreInputsStandard(tx, coins_view_cache);
|
||||||
|
|
||||||
UniValue u(UniValue::VOBJ);
|
UniValue u(UniValue::VOBJ);
|
||||||
TxToUniv(tx, /* hashBlock */ {}, u);
|
TxToUniv(tx, /* hashBlock */ {}, /* include_addresses */ true, u);
|
||||||
|
TxToUniv(tx, /* hashBlock */ {}, /* include_addresses */ false, u);
|
||||||
static const uint256 u256_max(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
|
static const uint256 u256_max(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
|
||||||
TxToUniv(tx, u256_max, u);
|
TxToUniv(tx, u256_max, /* include_addresses */ true, u);
|
||||||
|
TxToUniv(tx, u256_max, /* include_addresses */ false, u);
|
||||||
}
|
}
|
||||||
|
@ -1811,7 +1811,7 @@ static RPCHelpMan gettransaction()
|
|||||||
|
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
UniValue decoded(UniValue::VOBJ);
|
UniValue decoded(UniValue::VOBJ);
|
||||||
TxToUniv(*wtx.tx, uint256(), decoded, false);
|
TxToUniv(*wtx.tx, uint256(), pwallet->chain().rpcEnableDeprecated("addresses"), decoded, false);
|
||||||
entry.pushKV("decoded", decoded);
|
entry.pushKV("decoded", decoded);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,8 @@ class DIP3Test(BitcoinTestFramework):
|
|||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.supports_cli = False
|
self.supports_cli = False
|
||||||
|
|
||||||
self.extra_args = ["-budgetparams=10:10:10"]
|
self.extra_args = ["-deprecatedrpc=addresses"]
|
||||||
|
self.extra_args += ["-budgetparams=10:10:10"]
|
||||||
self.extra_args += ["-sporkkey=cP4EKFyJsHT39LDqgdcB43Y3YXjNyjb5Fuas1GQSeAtjnZWmZEQK"]
|
self.extra_args += ["-sporkkey=cP4EKFyJsHT39LDqgdcB43Y3YXjNyjb5Fuas1GQSeAtjnZWmZEQK"]
|
||||||
self.extra_args += ["-dip3params=135:150"]
|
self.extra_args += ["-dip3params=135:150"]
|
||||||
|
|
||||||
|
@ -62,14 +62,14 @@ class DashGovernanceTest (DashTestFramework):
|
|||||||
coinbase_outputs = self.nodes[0].getblock(self.nodes[0].getbestblockhash(), 2)["tx"][0]["vout"]
|
coinbase_outputs = self.nodes[0].getblock(self.nodes[0].getbestblockhash(), 2)["tx"][0]["vout"]
|
||||||
payments_found = 0
|
payments_found = 0
|
||||||
for txout in coinbase_outputs:
|
for txout in coinbase_outputs:
|
||||||
if txout["value"] == self.p0_amount and txout["scriptPubKey"]["addresses"][0] == self.p0_payout_address:
|
if txout["value"] == self.p0_amount and txout["scriptPubKey"]["address"] == self.p0_payout_address:
|
||||||
payments_found += 1
|
payments_found += 1
|
||||||
if txout["value"] == self.p1_amount and txout["scriptPubKey"]["addresses"][0] == self.p1_payout_address:
|
if txout["value"] == self.p1_amount and txout["scriptPubKey"]["address"] == self.p1_payout_address:
|
||||||
if self.p1_hash > self.p2_hash:
|
if self.p1_hash > self.p2_hash:
|
||||||
payments_found += 1
|
payments_found += 1
|
||||||
else:
|
else:
|
||||||
assert False
|
assert False
|
||||||
if txout["value"] == self.p2_amount and txout["scriptPubKey"]["addresses"][0] == self.p2_payout_address:
|
if txout["value"] == self.p2_amount and txout["scriptPubKey"]["address"] == self.p2_payout_address:
|
||||||
if self.p2_hash > self.p1_hash:
|
if self.p2_hash > self.p1_hash:
|
||||||
payments_found += 1
|
payments_found += 1
|
||||||
else:
|
else:
|
||||||
|
@ -124,7 +124,7 @@ class FilterTest(BitcoinTestFramework):
|
|||||||
filter_peer = P2PBloomFilter()
|
filter_peer = P2PBloomFilter()
|
||||||
|
|
||||||
self.log.debug("Create a tx relevant to the peer before connecting")
|
self.log.debug("Create a tx relevant to the peer before connecting")
|
||||||
filter_address = self.nodes[0].decodescript(filter_peer.watch_script_pubkey)['addresses'][0]
|
filter_address = self.nodes[0].decodescript(filter_peer.watch_script_pubkey)['address']
|
||||||
txid = self.nodes[0].sendtoaddress(filter_address, 90)
|
txid = self.nodes[0].sendtoaddress(filter_address, 90)
|
||||||
|
|
||||||
self.log.debug("Send a mempool msg after connecting and check that the tx is received")
|
self.log.debug("Send a mempool msg after connecting and check that the tx is received")
|
||||||
@ -136,7 +136,7 @@ class FilterTest(BitcoinTestFramework):
|
|||||||
def test_frelay_false(self, filter_peer):
|
def test_frelay_false(self, filter_peer):
|
||||||
self.log.info("Check that a node with fRelay set to false does not receive invs until the filter is set")
|
self.log.info("Check that a node with fRelay set to false does not receive invs until the filter is set")
|
||||||
filter_peer.tx_received = False
|
filter_peer.tx_received = False
|
||||||
filter_address = self.nodes[0].decodescript(filter_peer.watch_script_pubkey)['addresses'][0]
|
filter_address = self.nodes[0].decodescript(filter_peer.watch_script_pubkey)['address']
|
||||||
self.nodes[0].sendtoaddress(filter_address, 90)
|
self.nodes[0].sendtoaddress(filter_address, 90)
|
||||||
# Sync to make sure the reason filter_peer doesn't receive the tx is not p2p delays
|
# Sync to make sure the reason filter_peer doesn't receive the tx is not p2p delays
|
||||||
filter_peer.sync_with_ping()
|
filter_peer.sync_with_ping()
|
||||||
@ -150,7 +150,7 @@ class FilterTest(BitcoinTestFramework):
|
|||||||
filter_peer.send_and_ping(filter_peer.watch_filter_init)
|
filter_peer.send_and_ping(filter_peer.watch_filter_init)
|
||||||
# If fRelay is not already True, sending filterload sets it to True
|
# If fRelay is not already True, sending filterload sets it to True
|
||||||
assert self.nodes[0].getpeerinfo()[0]['relaytxes']
|
assert self.nodes[0].getpeerinfo()[0]['relaytxes']
|
||||||
filter_address = self.nodes[0].decodescript(filter_peer.watch_script_pubkey)['addresses'][0]
|
filter_address = self.nodes[0].decodescript(filter_peer.watch_script_pubkey)['address']
|
||||||
|
|
||||||
self.log.info('Check that we receive merkleblock and tx if the filter matches a tx in a block')
|
self.log.info('Check that we receive merkleblock and tx if the filter matches a tx in a block')
|
||||||
block_hash = self.nodes[0].generatetoaddress(1, filter_address)[0]
|
block_hash = self.nodes[0].generatetoaddress(1, filter_address)[0]
|
||||||
|
58
test/functional/rpc_addresses_deprecation.py
Executable file
58
test/functional/rpc_addresses_deprecation.py
Executable file
@ -0,0 +1,58 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright (c) 2020 The Bitcoin Core developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
"""Test deprecation of reqSigs and addresses RPC fields."""
|
||||||
|
|
||||||
|
from io import BytesIO
|
||||||
|
|
||||||
|
from test_framework.messages import CTransaction
|
||||||
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
from test_framework.util import (
|
||||||
|
assert_equal,
|
||||||
|
hex_str_to_bytes
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class AddressesDeprecationTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
|
self.num_nodes = 2
|
||||||
|
self.extra_args = [[], ["-deprecatedrpc=addresses"]]
|
||||||
|
|
||||||
|
def skip_test_if_missing_module(self):
|
||||||
|
self.skip_if_no_wallet()
|
||||||
|
|
||||||
|
def run_test(self):
|
||||||
|
self.test_addresses_deprecation()
|
||||||
|
|
||||||
|
def test_addresses_deprecation(self):
|
||||||
|
node = self.nodes[0]
|
||||||
|
coin = node.listunspent().pop()
|
||||||
|
|
||||||
|
inputs = [{'txid': coin['txid'], 'vout': coin['vout']}]
|
||||||
|
outputs = {node.getnewaddress(): 0.99}
|
||||||
|
raw = node.createrawtransaction(inputs, outputs)
|
||||||
|
signed = node.signrawtransactionwithwallet(raw)['hex']
|
||||||
|
|
||||||
|
# This transaction is derived from test/util/data/txcreatemultisig1.json
|
||||||
|
tx = CTransaction()
|
||||||
|
tx.deserialize(BytesIO(hex_str_to_bytes(signed)))
|
||||||
|
tx.vout[0].scriptPubKey = hex_str_to_bytes("522102a5613bd857b7048924264d1e70e08fb2a7e6527d32b7ab1bb993ac59964ff39721021ac43c7ff740014c3b33737ede99c967e4764553d1b2b83db77c83b8715fa72d2102df2089105c77f266fa11a9d33f05c735234075f2e8780824c6b709415f9fb48553ae")
|
||||||
|
tx_signed = node.signrawtransactionwithwallet(tx.serialize().hex())['hex']
|
||||||
|
txid = node.sendrawtransaction(hexstring=tx_signed, maxfeerate=0)
|
||||||
|
|
||||||
|
self.log.info("Test RPCResult scriptPubKey no longer returns the fields addresses or reqSigs by default")
|
||||||
|
hash = node.generateblock(output=node.getnewaddress(), transactions=[txid])['hash']
|
||||||
|
# Ensure both nodes have the newly generated block on disk.
|
||||||
|
self.sync_blocks()
|
||||||
|
script_pub_key = node.getblock(blockhash=hash, verbose=2)['tx'][-1]['vout'][0]['scriptPubKey']
|
||||||
|
assert 'addresses' not in script_pub_key and 'reqSigs' not in script_pub_key
|
||||||
|
|
||||||
|
self.log.info("Test RPCResult scriptPubKey returns the addresses field with -deprecatedrpc=addresses")
|
||||||
|
script_pub_key = self.nodes[1].getblock(blockhash=hash, verbose=2)['tx'][-1]['vout'][0]['scriptPubKey']
|
||||||
|
assert_equal(script_pub_key['addresses'], ['yb7hsErReWuYeyxH1LzXbmyU5iBdruakMi', 'yarLqM3oXZFRtuVR4SsNxqKrGxyScZhohq', 'yPfMS8LWznSCnmz1QnEnMxqHZXUrq5Lfu7'])
|
||||||
|
assert_equal(script_pub_key['reqSigs'], 2)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
AddressesDeprecationTest().main()
|
@ -152,7 +152,7 @@ class RpcCreateMultiSigTest(BitcoinTestFramework):
|
|||||||
txid = node0.sendtoaddress(madd, 40)
|
txid = node0.sendtoaddress(madd, 40)
|
||||||
|
|
||||||
tx = node0.getrawtransaction(txid, True)
|
tx = node0.getrawtransaction(txid, True)
|
||||||
vout = [v["n"] for v in tx["vout"] if madd in v["scriptPubKey"].get("addresses", [])]
|
vout = [v["n"] for v in tx["vout"] if madd == v["scriptPubKey"]["address"]]
|
||||||
assert len(vout) == 1
|
assert len(vout) == 1
|
||||||
vout = vout[0]
|
vout = vout[0]
|
||||||
scriptPubKey = tx["vout"][vout]["scriptPubKey"]["hex"]
|
scriptPubKey = tx["vout"][vout]["scriptPubKey"]["hex"]
|
||||||
|
@ -163,7 +163,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||||||
totalOut = 0
|
totalOut = 0
|
||||||
for out in dec_tx['vout']:
|
for out in dec_tx['vout']:
|
||||||
totalOut += out['value']
|
totalOut += out['value']
|
||||||
address = out['scriptPubKey']['addresses'][0]
|
address = out['scriptPubKey']['address']
|
||||||
if address in outputs.keys():
|
if address in outputs.keys():
|
||||||
assert_equal(satoshi_round(outputs[address]), out['value'])
|
assert_equal(satoshi_round(outputs[address]), out['value'])
|
||||||
|
|
||||||
@ -252,7 +252,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||||||
rawtxfund = self.nodes[2].fundrawtransaction(rawtx, {'changeAddress': change, 'changePosition': 0})
|
rawtxfund = self.nodes[2].fundrawtransaction(rawtx, {'changeAddress': change, 'changePosition': 0})
|
||||||
dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
|
dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
|
||||||
out = dec_tx['vout'][0]
|
out = dec_tx['vout'][0]
|
||||||
assert_equal(change, out['scriptPubKey']['addresses'][0])
|
assert_equal(change, out['scriptPubKey']['address'])
|
||||||
|
|
||||||
def test_coin_selection(self):
|
def test_coin_selection(self):
|
||||||
self.log.info("Test fundrawtxn with a vin < required amount")
|
self.log.info("Test fundrawtxn with a vin < required amount")
|
||||||
@ -279,7 +279,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||||||
matchingOuts = 0
|
matchingOuts = 0
|
||||||
for i, out in enumerate(dec_tx['vout']):
|
for i, out in enumerate(dec_tx['vout']):
|
||||||
totalOut += out['value']
|
totalOut += out['value']
|
||||||
if out['scriptPubKey']['addresses'][0] in outputs:
|
if out['scriptPubKey']['address'] in outputs:
|
||||||
matchingOuts+=1
|
matchingOuts+=1
|
||||||
else:
|
else:
|
||||||
assert_equal(i, rawtxfund['changepos'])
|
assert_equal(i, rawtxfund['changepos'])
|
||||||
@ -310,7 +310,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||||||
matchingOuts = 0
|
matchingOuts = 0
|
||||||
for out in dec_tx['vout']:
|
for out in dec_tx['vout']:
|
||||||
totalOut += out['value']
|
totalOut += out['value']
|
||||||
if out['scriptPubKey']['addresses'][0] in outputs:
|
if out['scriptPubKey']['address'] in outputs:
|
||||||
matchingOuts+=1
|
matchingOuts+=1
|
||||||
|
|
||||||
assert_equal(matchingOuts, 1)
|
assert_equal(matchingOuts, 1)
|
||||||
@ -344,7 +344,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||||||
matchingOuts = 0
|
matchingOuts = 0
|
||||||
for out in dec_tx['vout']:
|
for out in dec_tx['vout']:
|
||||||
totalOut += out['value']
|
totalOut += out['value']
|
||||||
if out['scriptPubKey']['addresses'][0] in outputs:
|
if out['scriptPubKey']['address'] in outputs:
|
||||||
matchingOuts+=1
|
matchingOuts+=1
|
||||||
|
|
||||||
assert_equal(matchingOuts, 2)
|
assert_equal(matchingOuts, 2)
|
||||||
@ -727,7 +727,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||||||
changeaddress = ""
|
changeaddress = ""
|
||||||
for out in res_dec['vout']:
|
for out in res_dec['vout']:
|
||||||
if out['value'] > 1.0:
|
if out['value'] > 1.0:
|
||||||
changeaddress += out['scriptPubKey']['addresses'][0]
|
changeaddress += out['scriptPubKey']['address']
|
||||||
assert changeaddress != ""
|
assert changeaddress != ""
|
||||||
nextaddr = self.nodes[3].getnewaddress()
|
nextaddr = self.nodes[3].getnewaddress()
|
||||||
# Now the change address key should be removed from the keypool.
|
# Now the change address key should be removed from the keypool.
|
||||||
|
@ -26,13 +26,13 @@ class GenerateBlockTest(BitcoinTestFramework):
|
|||||||
hash = node.generateblock(address, [])['hash']
|
hash = node.generateblock(address, [])['hash']
|
||||||
block = node.getblock(hash, 2)
|
block = node.getblock(hash, 2)
|
||||||
assert_equal(len(block['tx']), 1)
|
assert_equal(len(block['tx']), 1)
|
||||||
assert_equal(block['tx'][0]['vout'][0]['scriptPubKey']['addresses'][0], address)
|
assert_equal(block['tx'][0]['vout'][0]['scriptPubKey']['address'], address)
|
||||||
|
|
||||||
self.log.info('Generate an empty block to a descriptor')
|
self.log.info('Generate an empty block to a descriptor')
|
||||||
hash = node.generateblock('addr(' + address + ')', [])['hash']
|
hash = node.generateblock('addr(' + address + ')', [])['hash']
|
||||||
block = node.getblock(hash, 2)
|
block = node.getblock(hash, 2)
|
||||||
assert_equal(len(block['tx']), 1)
|
assert_equal(len(block['tx']), 1)
|
||||||
assert_equal(block['tx'][0]['vout'][0]['scriptPubKey']['addresses'][0], address)
|
assert_equal(block['tx'][0]['vout'][0]['scriptPubKey']['address'], address)
|
||||||
|
|
||||||
self.log.info('Generate an empty block to a combo descriptor with compressed pubkey')
|
self.log.info('Generate an empty block to a combo descriptor with compressed pubkey')
|
||||||
combo_key = '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'
|
combo_key = '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'
|
||||||
@ -40,7 +40,7 @@ class GenerateBlockTest(BitcoinTestFramework):
|
|||||||
hash = node.generateblock('combo(' + combo_key + ')', [])['hash']
|
hash = node.generateblock('combo(' + combo_key + ')', [])['hash']
|
||||||
block = node.getblock(hash, 2)
|
block = node.getblock(hash, 2)
|
||||||
assert_equal(len(block['tx']), 1)
|
assert_equal(len(block['tx']), 1)
|
||||||
assert_equal(block['tx'][0]['vout'][0]['scriptPubKey']['addresses'][0], combo_address)
|
assert_equal(block['tx'][0]['vout'][0]['scriptPubKey']['address'], combo_address)
|
||||||
|
|
||||||
# Generate 110 blocks to spend
|
# Generate 110 blocks to spend
|
||||||
node.generatetoaddress(110, address)
|
node.generatetoaddress(110, address)
|
||||||
|
@ -89,9 +89,9 @@ class PSBTTest(BitcoinTestFramework):
|
|||||||
p2pkh_pos = -1
|
p2pkh_pos = -1
|
||||||
decoded = self.nodes[0].decoderawtransaction(signed_tx)
|
decoded = self.nodes[0].decoderawtransaction(signed_tx)
|
||||||
for out in decoded['vout']:
|
for out in decoded['vout']:
|
||||||
if out['scriptPubKey']['addresses'][0] == p2sh:
|
if out['scriptPubKey']['address'] == p2sh:
|
||||||
p2sh_pos = out['n']
|
p2sh_pos = out['n']
|
||||||
elif out['scriptPubKey']['addresses'][0] == p2pkh:
|
elif out['scriptPubKey']['address'] == p2pkh:
|
||||||
p2pkh_pos = out['n']
|
p2pkh_pos = out['n']
|
||||||
|
|
||||||
# spend single key from node 1
|
# spend single key from node 1
|
||||||
|
@ -608,6 +608,6 @@ def find_vout_for_address(node, txid, addr):
|
|||||||
"""
|
"""
|
||||||
tx = node.getrawtransaction(txid, True)
|
tx = node.getrawtransaction(txid, True)
|
||||||
for i in range(len(tx["vout"])):
|
for i in range(len(tx["vout"])):
|
||||||
if any([addr == a for a in tx["vout"][i]["scriptPubKey"]["addresses"]]):
|
if addr == tx["vout"][i]["scriptPubKey"]["address"]:
|
||||||
return i
|
return i
|
||||||
raise RuntimeError("Vout not found for address: txid=%s, addr=%s" % (txid, addr))
|
raise RuntimeError("Vout not found for address: txid=%s, addr=%s" % (txid, addr))
|
||||||
|
@ -344,6 +344,7 @@ BASE_SCRIPTS = [
|
|||||||
'feature_config_args.py',
|
'feature_config_args.py',
|
||||||
'feature_settings.py',
|
'feature_settings.py',
|
||||||
'rpc_getdescriptorinfo.py',
|
'rpc_getdescriptorinfo.py',
|
||||||
|
'rpc_addresses_deprecation.py',
|
||||||
'rpc_getpeerinfo_deprecation.py',
|
'rpc_getpeerinfo_deprecation.py',
|
||||||
'rpc_help.py',
|
'rpc_help.py',
|
||||||
'feature_help.py',
|
'feature_help.py',
|
||||||
|
@ -631,7 +631,7 @@ class WalletTest(BitcoinTestFramework):
|
|||||||
destination = self.nodes[1].getnewaddress()
|
destination = self.nodes[1].getnewaddress()
|
||||||
txid = self.nodes[0].sendtoaddress(destination, 0.123)
|
txid = self.nodes[0].sendtoaddress(destination, 0.123)
|
||||||
tx = self.nodes[0].decoderawtransaction(self.nodes[0].gettransaction(txid)['hex'])
|
tx = self.nodes[0].decoderawtransaction(self.nodes[0].gettransaction(txid)['hex'])
|
||||||
output_addresses = [vout['scriptPubKey']['addresses'][0] for vout in tx["vout"]]
|
output_addresses = [vout['scriptPubKey']['address'] for vout in tx["vout"]]
|
||||||
assert len(output_addresses) > 1
|
assert len(output_addresses) > 1
|
||||||
for address in output_addresses:
|
for address in output_addresses:
|
||||||
ischange = self.nodes[0].getaddressinfo(address)['ischange']
|
ischange = self.nodes[0].getaddressinfo(address)['ischange']
|
||||||
|
@ -30,7 +30,7 @@ class WalletChangeAddressTest(BitcoinTestFramework):
|
|||||||
def assert_change_index(self, node, tx, index):
|
def assert_change_index(self, node, tx, index):
|
||||||
change_index = None
|
change_index = None
|
||||||
for vout in tx["vout"]:
|
for vout in tx["vout"]:
|
||||||
info = node.getaddressinfo(vout["scriptPubKey"]["addresses"][0])
|
info = node.getaddressinfo(vout["scriptPubKey"]["address"])
|
||||||
if (info["ismine"] and info["ischange"]):
|
if (info["ismine"] and info["ischange"]):
|
||||||
change_index = int(re.findall(r'\d+', info["hdkeypath"])[-1])
|
change_index = int(re.findall(r'\d+', info["hdkeypath"])[-1])
|
||||||
break
|
break
|
||||||
|
@ -134,7 +134,7 @@ class WalletHDTest(BitcoinTestFramework):
|
|||||||
keypath = ""
|
keypath = ""
|
||||||
for out in outs:
|
for out in outs:
|
||||||
if out['value'] != 1:
|
if out['value'] != 1:
|
||||||
keypath = self.nodes[1].getaddressinfo(out['scriptPubKey']['addresses'][0])['hdkeypath']
|
keypath = self.nodes[1].getaddressinfo(out['scriptPubKey']['address'])['hdkeypath']
|
||||||
|
|
||||||
assert_equal(keypath[0:13], "m/44'/1'/0'/1")
|
assert_equal(keypath[0:13], "m/44'/1'/0'/1")
|
||||||
|
|
||||||
|
@ -324,10 +324,10 @@ class WalletSendTest(BitcoinTestFramework):
|
|||||||
assert res["complete"]
|
assert res["complete"]
|
||||||
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, add_to_wallet=False, change_address=change_address, change_position=0)
|
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, add_to_wallet=False, change_address=change_address, change_position=0)
|
||||||
assert res["complete"]
|
assert res["complete"]
|
||||||
assert_equal(self.nodes[0].decodepsbt(res["psbt"])["tx"]["vout"][0]["scriptPubKey"]["addresses"], [change_address])
|
assert_equal(self.nodes[0].decodepsbt(res["psbt"])["tx"]["vout"][0]["scriptPubKey"]["address"], change_address)
|
||||||
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, add_to_wallet=False, change_position=0)
|
res = self.test_send(from_wallet=w0, to_wallet=w1, amount=1, add_to_wallet=False, change_position=0)
|
||||||
assert res["complete"]
|
assert res["complete"]
|
||||||
change_address = self.nodes[0].decodepsbt(res["psbt"])["tx"]["vout"][0]["scriptPubKey"]["addresses"][0]
|
change_address = self.nodes[0].decodepsbt(res["psbt"])["tx"]["vout"][0]["scriptPubKey"]["address"]
|
||||||
assert change_address[0] == "y" or change_address[0] == "8" or change_address[0] == "9"
|
assert change_address[0] == "y" or change_address[0] == "8" or change_address[0] == "9"
|
||||||
|
|
||||||
self.log.info("Set lock time...")
|
self.log.info("Set lock time...")
|
||||||
|
@ -60,8 +60,8 @@ class TxnMallTest(BitcoinTestFramework):
|
|||||||
# Construct a clone of tx1, to be malleated
|
# Construct a clone of tx1, to be malleated
|
||||||
rawtx1 = self.nodes[0].getrawtransaction(txid1, 1)
|
rawtx1 = self.nodes[0].getrawtransaction(txid1, 1)
|
||||||
clone_inputs = [{"txid": rawtx1["vin"][0]["txid"], "vout": rawtx1["vin"][0]["vout"], "sequence": rawtx1["vin"][0]["sequence"]}]
|
clone_inputs = [{"txid": rawtx1["vin"][0]["txid"], "vout": rawtx1["vin"][0]["vout"], "sequence": rawtx1["vin"][0]["sequence"]}]
|
||||||
clone_outputs = {rawtx1["vout"][0]["scriptPubKey"]["addresses"][0]: rawtx1["vout"][0]["value"],
|
clone_outputs = {rawtx1["vout"][0]["scriptPubKey"]["address"]: rawtx1["vout"][0]["value"],
|
||||||
rawtx1["vout"][1]["scriptPubKey"]["addresses"][0]: rawtx1["vout"][1]["value"]}
|
rawtx1["vout"][1]["scriptPubKey"]["address"]: rawtx1["vout"][1]["value"]}
|
||||||
clone_locktime = rawtx1["locktime"]
|
clone_locktime = rawtx1["locktime"]
|
||||||
clone_raw = self.nodes[0].createrawtransaction(clone_inputs, clone_outputs, clone_locktime)
|
clone_raw = self.nodes[0].createrawtransaction(clone_inputs, clone_outputs, clone_locktime)
|
||||||
|
|
||||||
|
@ -58,10 +58,10 @@ class WalletUpgradeToHDTest(BitcoinTestFramework):
|
|||||||
outs = node.decoderawtransaction(node.gettransaction(txid)['hex'])['vout']
|
outs = node.decoderawtransaction(node.gettransaction(txid)['hex'])['vout']
|
||||||
for out in outs:
|
for out in outs:
|
||||||
if out['value'] == 1:
|
if out['value'] == 1:
|
||||||
keypath = node.getaddressinfo(out['scriptPubKey']['addresses'][0])['hdkeypath']
|
keypath = node.getaddressinfo(out['scriptPubKey']['address'])['hdkeypath']
|
||||||
assert_equal(keypath, "m/44'/1'/0'/0/%d" % i)
|
assert_equal(keypath, "m/44'/1'/0'/0/%d" % i)
|
||||||
else:
|
else:
|
||||||
keypath = node.getaddressinfo(out['scriptPubKey']['addresses'][0])['hdkeypath']
|
keypath = node.getaddressinfo(out['scriptPubKey']['address'])['hdkeypath']
|
||||||
assert_equal(keypath, "m/44'/1'/0'/1/%d" % i)
|
assert_equal(keypath, "m/44'/1'/0'/1/%d" % i)
|
||||||
|
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
|
@ -194,11 +194,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
|
"hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
|
||||||
"reqSigs": 1,
|
"address": "XooH6vpTCuVowS9vmJowNaNGcJQ3cQT7rs",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"XooH6vpTCuVowS9vmJowNaNGcJQ3cQT7rs"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -208,11 +205,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 6c772e9cf96371bba3da8cb733da70a2fcf20078 OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 6c772e9cf96371bba3da8cb733da70a2fcf20078 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a9146c772e9cf96371bba3da8cb733da70a2fcf2007888ac",
|
"hex": "76a9146c772e9cf96371bba3da8cb733da70a2fcf2007888ac",
|
||||||
"reqSigs": 1,
|
"address": "XkaMatRZjFxq1QbgUvdmqGzGRaPqSLvvS6",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"XkaMatRZjFxq1QbgUvdmqGzGRaPqSLvvS6"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -203,11 +203,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
|
"hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
|
||||||
"reqSigs": 1,
|
"address": "XooH6vpTCuVowS9vmJowNaNGcJQ3cQT7rs",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"XooH6vpTCuVowS9vmJowNaNGcJQ3cQT7rs"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -203,11 +203,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
|
"hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
|
||||||
"reqSigs": 1,
|
"address": "XooH6vpTCuVowS9vmJowNaNGcJQ3cQT7rs",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"XooH6vpTCuVowS9vmJowNaNGcJQ3cQT7rs"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -217,11 +214,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 6c772e9cf96371bba3da8cb733da70a2fcf20078 OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 6c772e9cf96371bba3da8cb733da70a2fcf20078 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a9146c772e9cf96371bba3da8cb733da70a2fcf2007888ac",
|
"hex": "76a9146c772e9cf96371bba3da8cb733da70a2fcf2007888ac",
|
||||||
"reqSigs": 1,
|
"address": "XkaMatRZjFxq1QbgUvdmqGzGRaPqSLvvS6",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"XkaMatRZjFxq1QbgUvdmqGzGRaPqSLvvS6"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -41,11 +41,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
||||||
"reqSigs": 1,
|
"address": "Xdak8YsJz8tm1iHFmycfTyKeUvHgfbdpyw",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"Xdak8YsJz8tm1iHFmycfTyKeUvHgfbdpyw"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -55,11 +52,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 f2d4db28cad6502226ee484ae24505c2885cb12d OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 f2d4db28cad6502226ee484ae24505c2885cb12d OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a914f2d4db28cad6502226ee484ae24505c2885cb12d88ac",
|
"hex": "76a914f2d4db28cad6502226ee484ae24505c2885cb12d88ac",
|
||||||
"reqSigs": 1,
|
"address": "XxppMBDQ6SiJrKcBrAy4WkkNdrxDBfzFdZ",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"XxppMBDQ6SiJrKcBrAy4WkkNdrxDBfzFdZ"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -23,11 +23,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
||||||
"reqSigs": 1,
|
"address": "Xdak8YsJz8tm1iHFmycfTyKeUvHgfbdpyw",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"Xdak8YsJz8tm1iHFmycfTyKeUvHgfbdpyw"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -23,11 +23,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
||||||
"reqSigs": 1,
|
"address": "Xdak8YsJz8tm1iHFmycfTyKeUvHgfbdpyw",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"Xdak8YsJz8tm1iHFmycfTyKeUvHgfbdpyw"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -23,11 +23,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
||||||
"reqSigs": 1,
|
"address": "Xdak8YsJz8tm1iHFmycfTyKeUvHgfbdpyw",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"Xdak8YsJz8tm1iHFmycfTyKeUvHgfbdpyw"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -32,11 +32,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
||||||
"reqSigs": 1,
|
"address": "Xdak8YsJz8tm1iHFmycfTyKeUvHgfbdpyw",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"Xdak8YsJz8tm1iHFmycfTyKeUvHgfbdpyw"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -14,13 +14,7 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "2 02a5613bd857b7048924264d1e70e08fb2a7e6527d32b7ab1bb993ac59964ff397 021ac43c7ff740014c3b33737ede99c967e4764553d1b2b83db77c83b8715fa72d 02df2089105c77f266fa11a9d33f05c735234075f2e8780824c6b709415f9fb485 3 OP_CHECKMULTISIG",
|
"asm": "2 02a5613bd857b7048924264d1e70e08fb2a7e6527d32b7ab1bb993ac59964ff397 021ac43c7ff740014c3b33737ede99c967e4764553d1b2b83db77c83b8715fa72d 02df2089105c77f266fa11a9d33f05c735234075f2e8780824c6b709415f9fb485 3 OP_CHECKMULTISIG",
|
||||||
"hex": "522102a5613bd857b7048924264d1e70e08fb2a7e6527d32b7ab1bb993ac59964ff39721021ac43c7ff740014c3b33737ede99c967e4764553d1b2b83db77c83b8715fa72d2102df2089105c77f266fa11a9d33f05c735234075f2e8780824c6b709415f9fb48553ae",
|
"hex": "522102a5613bd857b7048924264d1e70e08fb2a7e6527d32b7ab1bb993ac59964ff39721021ac43c7ff740014c3b33737ede99c967e4764553d1b2b83db77c83b8715fa72d2102df2089105c77f266fa11a9d33f05c735234075f2e8780824c6b709415f9fb48553ae",
|
||||||
"reqSigs": 2,
|
"type": "multisig"
|
||||||
"type": "multisig",
|
|
||||||
"addresses": [
|
|
||||||
"XqV6rHmzCyFUKF2jSVg8ZkZ7oRhGLVxifK",
|
|
||||||
"XqDjpPyN61bMZAZsVbYyvouVzgV59oSmWp",
|
|
||||||
"Xe2kRBG5ZEn8T34TqvvPKwQwHEzVL9WvxH"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -14,11 +14,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_HASH160 1c6fbaf46d64221e80cbae182c33ddf81b9294ac OP_EQUAL",
|
"asm": "OP_HASH160 1c6fbaf46d64221e80cbae182c33ddf81b9294ac OP_EQUAL",
|
||||||
"hex": "a9141c6fbaf46d64221e80cbae182c33ddf81b9294ac87",
|
"hex": "a9141c6fbaf46d64221e80cbae182c33ddf81b9294ac87",
|
||||||
"reqSigs": 1,
|
"address": "7V11XGPxzBWxkiuw15a1Vgk7XT74tyYtCY",
|
||||||
"type": "scripthash",
|
"type": "scripthash"
|
||||||
"addresses": [
|
|
||||||
"7V11XGPxzBWxkiuw15a1Vgk7XT74tyYtCY"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -14,11 +14,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_HASH160 71ed53322d470bb96657deb786b94f97dd46fb15 OP_EQUAL",
|
"asm": "OP_HASH160 71ed53322d470bb96657deb786b94f97dd46fb15 OP_EQUAL",
|
||||||
"hex": "a91471ed53322d470bb96657deb786b94f97dd46fb1587",
|
"hex": "a91471ed53322d470bb96657deb786b94f97dd46fb1587",
|
||||||
"reqSigs": 1,
|
"address": "7co3R3WSW8mHKMkFK2FrzQY2fLCBWsg56D",
|
||||||
"type": "scripthash",
|
"type": "scripthash"
|
||||||
"addresses": [
|
|
||||||
"7co3R3WSW8mHKMkFK2FrzQY2fLCBWsg56D"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
@ -23,11 +23,8 @@
|
|||||||
"scriptPubKey": {
|
"scriptPubKey": {
|
||||||
"asm": "OP_DUP OP_HASH160 5834479edbbe0539b31ffd3a8f8ebadc2165ed01 OP_EQUALVERIFY OP_CHECKSIG",
|
"asm": "OP_DUP OP_HASH160 5834479edbbe0539b31ffd3a8f8ebadc2165ed01 OP_EQUALVERIFY OP_CHECKSIG",
|
||||||
"hex": "76a9145834479edbbe0539b31ffd3a8f8ebadc2165ed0188ac",
|
"hex": "76a9145834479edbbe0539b31ffd3a8f8ebadc2165ed0188ac",
|
||||||
"reqSigs": 1,
|
"address": "XijDvbYpPmznwgpWD3DkdYNfGmRP2KoVSk",
|
||||||
"type": "pubkeyhash",
|
"type": "pubkeyhash"
|
||||||
"addresses": [
|
|
||||||
"XijDvbYpPmznwgpWD3DkdYNfGmRP2KoVSk"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
Loading…
Reference in New Issue
Block a user