merge bitcoin#20286: deprecate addresses and reqSigs from rpc outputs

This commit is contained in:
Kittywhiskers Van Gogh 2024-06-23 15:51:21 +00:00
parent 7cddf70c58
commit 169dce7e50
No known key found for this signature in database
GPG Key ID: 30CD0C065E5C4AAD
41 changed files with 193 additions and 136 deletions

View File

@ -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"
]
} }
} }
] ]

View 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.

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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);

View File

@ -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"},
}}, }},

View File

@ -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();

View File

@ -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);

View File

@ -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);

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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"]

View File

@ -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:

View File

@ -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]

View 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()

View File

@ -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"]

View File

@ -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.

View File

@ -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)

View File

@ -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

View File

@ -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))

View File

@ -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',

View File

@ -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']

View File

@ -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

View File

@ -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")

View File

@ -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...")

View File

@ -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)

View File

@ -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)

View File

@ -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"
]
} }
} }
], ],

View File

@ -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"
]
} }
} }
], ],

View File

@ -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"
]
} }
} }
], ],

View File

@ -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"
]
} }
} }
], ],

View File

@ -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"
]
} }
}, },
{ {

View File

@ -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"
]
} }
}, },
{ {

View File

@ -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"
]
} }
} }
], ],

View File

@ -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"
]
} }
} }
], ],

View File

@ -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"
]
} }
} }
], ],

View File

@ -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"
]
} }
} }
], ],

View File

@ -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"
]
} }
} }
], ],

View File

@ -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"
]
} }
} }
], ],