mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-20 14:05:23 +01:00
rpc: deprecate addresses
and reqSigs
from rpc outputs
1) add a new sane "address" field (for outputs that have an identifiable address, which doesn't include bare multisig) 2) with -deprecatedrpc: leave "reqSigs" and "addresses" intact (with all weird/wrong behavior they have now) 3) without -deprecatedrpc: drop "reqSigs" and "addresses" entirely, always.
This commit is contained in:
parent
3c87dbe95c
commit
085b3a7299
49 changed files with 198 additions and 183 deletions
|
@ -95,11 +95,8 @@ $ curl localhost:18332/rest/getutxos/checkmempool/b2cdfd7b89def827ff8af7cd9bff76
|
|||
"scriptPubKey" : {
|
||||
"asm" : "OP_DUP OP_HASH160 1c7cebb529b86a04c683dfa87be49de35bcf589e OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex" : "76a9141c7cebb529b86a04c683dfa87be49de35bcf589e88ac",
|
||||
"reqSigs" : 1,
|
||||
"type" : "pubkeyhash",
|
||||
"addresses" : [
|
||||
"mi7as51dvLJsizWnTMurtRmrP8hG2m1XvD"
|
||||
]
|
||||
"address" : "mi7as51dvLJsizWnTMurtRmrP8hG2m1XvD"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
|
@ -725,7 +725,7 @@ static void MutateTx(CMutableTransaction& tx, const std::string& command,
|
|||
static void OutputTxJSON(const CTransaction& tx)
|
||||
{
|
||||
UniValue entry(UniValue::VOBJ);
|
||||
TxToUniv(tx, uint256(), entry);
|
||||
TxToUniv(tx, uint256(), /* include_addresses */ false, entry);
|
||||
|
||||
std::string jsonOutput = entry.write(4);
|
||||
tfm::format(std::cout, "%s\n", jsonOutput);
|
||||
|
|
|
@ -44,8 +44,8 @@ UniValue ValueFromAmount(const CAmount amount);
|
|||
std::string FormatScript(const CScript& script);
|
||||
std::string EncodeHexTx(const CTransaction& tx, const int serializeFlags = 0);
|
||||
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 TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry, bool include_hex = true, int serialize_flags = 0, const CTxUndo* txundo = nullptr);
|
||||
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, bool include_addresses, UniValue& entry, bool include_hex = true, int serialize_flags = 0, const CTxUndo* txundo = nullptr);
|
||||
|
||||
#endif // BITCOIN_CORE_IO_H
|
||||
|
|
|
@ -156,10 +156,13 @@ void ScriptToUniv(const CScript& script, UniValue& out, bool include_address)
|
|||
}
|
||||
}
|
||||
|
||||
// TODO: from v23 ("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,
|
||||
UniValue& out, bool fIncludeHex)
|
||||
UniValue& out, bool fIncludeHex, bool include_addresses)
|
||||
{
|
||||
TxoutType type;
|
||||
CTxDestination address;
|
||||
std::vector<CTxDestination> addresses;
|
||||
int nRequired;
|
||||
|
||||
|
@ -172,17 +175,22 @@ void ScriptPubKeyToUniv(const CScript& scriptPubKey,
|
|||
return;
|
||||
}
|
||||
|
||||
out.pushKV("reqSigs", nRequired);
|
||||
if (ExtractDestination(scriptPubKey, address)) {
|
||||
out.pushKV("address", EncodeDestination(address));
|
||||
}
|
||||
out.pushKV("type", GetTxnOutputType(type));
|
||||
|
||||
UniValue a(UniValue::VARR);
|
||||
for (const CTxDestination& addr : addresses) {
|
||||
a.push_back(EncodeDestination(addr));
|
||||
if (include_addresses) {
|
||||
UniValue a(UniValue::VARR);
|
||||
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, int serialize_flags, const CTxUndo* txundo)
|
||||
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, bool include_addresses, UniValue& entry, bool include_hex, int serialize_flags, const CTxUndo* txundo)
|
||||
{
|
||||
entry.pushKV("txid", tx.GetHash().GetHex());
|
||||
entry.pushKV("hash", tx.GetWitnessHash().GetHex());
|
||||
|
@ -241,7 +249,7 @@ void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry,
|
|||
out.pushKV("n", (int64_t)i);
|
||||
|
||||
UniValue o(UniValue::VOBJ);
|
||||
ScriptPubKeyToUniv(txout.scriptPubKey, o, true);
|
||||
ScriptPubKeyToUniv(txout.scriptPubKey, o, true, include_addresses);
|
||||
out.pushKV("scriptPubKey", o);
|
||||
vout.push_back(out);
|
||||
|
||||
|
|
|
@ -1113,11 +1113,13 @@ static RPCHelpMan gettxout()
|
|||
{RPCResult::Type::NUM, "confirmations", "The number of confirmations"},
|
||||
{RPCResult::Type::STR_AMOUNT, "value", "The transaction value in " + CURRENCY_UNIT},
|
||||
{RPCResult::Type::OBJ, "scriptPubKey", "", {
|
||||
{RPCResult::Type::STR_HEX, "asm", ""},
|
||||
{RPCResult::Type::STR, "asm", ""},
|
||||
{RPCResult::Type::STR_HEX, "hex", ""},
|
||||
{RPCResult::Type::NUM, "reqSigs", "Number of required signatures"},
|
||||
{RPCResult::Type::STR_HEX, "type", "The type, eg pubkeyhash"},
|
||||
{RPCResult::Type::ARR, "addresses", "array of bitcoin addresses", {{RPCResult::Type::STR, "address", "bitcoin address"}}},
|
||||
{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, "address", /* optional */ true, "bitcoin 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 bitcoin addresses",
|
||||
{{RPCResult::Type::STR, "address", "bitcoin address"}}},
|
||||
}},
|
||||
{RPCResult::Type::BOOL, "coinbase", "Coinbase or not"},
|
||||
}},
|
||||
|
@ -1775,6 +1777,16 @@ void CalculatePercentilesByWeight(CAmount result[NUM_GETBLOCKSTATS_PERCENTILES],
|
|||
}
|
||||
}
|
||||
|
||||
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, int serialize_flags, const CTxUndo* txundo)
|
||||
{
|
||||
TxToUniv(tx, hashBlock, IsDeprecatedRPCEnabled("addresses"), entry, include_hex, serialize_flags, txundo);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static inline bool SetHasKeys(const std::set<T>& set) {return false;}
|
||||
template<typename T, typename Tk, typename... Args>
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#define BITCOIN_RPC_BLOCKCHAIN_H
|
||||
|
||||
#include <amount.h>
|
||||
#include <core_io.h>
|
||||
#include <streams.h>
|
||||
#include <sync.h>
|
||||
|
||||
|
@ -54,6 +55,9 @@ UniValue blockheaderToJSON(const CBlockIndex* tip, const CBlockIndex* blockindex
|
|||
/** Used by getblockstats to get feerates at different percentiles by weight */
|
||||
void CalculatePercentilesByWeight(CAmount result[NUM_GETBLOCKSTATS_PERCENTILES], std::vector<std::pair<CAmount, int64_t>>& scores, int64_t total_weight);
|
||||
|
||||
void ScriptPubKeyToUniv(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex);
|
||||
void TxToUniv(const CTransaction& tx, const uint256& hashBlock, UniValue& entry, bool include_hex = true, int serialize_flags = 0, const CTxUndo* txundo = nullptr);
|
||||
|
||||
NodeContext& EnsureNodeContext(const util::Ref& context);
|
||||
CTxMemPool& EnsureMemPool(const util::Ref& context);
|
||||
ChainstateManager& EnsureChainman(const util::Ref& context);
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
#include <validation.h>
|
||||
#include <validationinterface.h>
|
||||
|
||||
|
||||
#include <numeric>
|
||||
#include <stdint.h>
|
||||
|
||||
|
@ -132,9 +131,10 @@ static RPCHelpMan getrawtransaction()
|
|||
{
|
||||
{RPCResult::Type::STR, "asm", "the asm"},
|
||||
{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::ARR, "addresses", "",
|
||||
{RPCResult::Type::STR, "address", /* optional */ true, "bitcoin 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 bitcoin addresses",
|
||||
{
|
||||
{RPCResult::Type::STR, "address", "bitcoin address"},
|
||||
}},
|
||||
|
@ -490,9 +490,10 @@ static RPCHelpMan decoderawtransaction()
|
|||
{
|
||||
{RPCResult::Type::STR, "asm", "the asm"},
|
||||
{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::ARR, "addresses", "",
|
||||
{RPCResult::Type::STR, "address", /* optional */ true, "bitcoin 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 bitcoin addresses",
|
||||
{
|
||||
{RPCResult::Type::STR, "address", "bitcoin address"},
|
||||
}},
|
||||
|
@ -548,8 +549,9 @@ static RPCHelpMan decodescript()
|
|||
{
|
||||
{RPCResult::Type::STR, "asm", "Script public key"},
|
||||
{RPCResult::Type::STR, "type", "The output type (e.g. "+GetAllOutputTypes()+")"},
|
||||
{RPCResult::Type::NUM, "reqSigs", "The required signatures"},
|
||||
{RPCResult::Type::ARR, "addresses", "",
|
||||
{RPCResult::Type::STR, "address", /* optional */ true, "bitcoin address (only if a well-defined address exists)"},
|
||||
{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 bitcoin addresses",
|
||||
{
|
||||
{RPCResult::Type::STR, "address", "bitcoin address"},
|
||||
}},
|
||||
|
@ -559,8 +561,9 @@ static RPCHelpMan decodescript()
|
|||
{RPCResult::Type::STR, "asm", "String representation of the script public key"},
|
||||
{RPCResult::Type::STR_HEX, "hex", "Hex string of the script public key"},
|
||||
{RPCResult::Type::STR, "type", "The type of the script public key (e.g. witness_v0_keyhash or witness_v0_scripthash)"},
|
||||
{RPCResult::Type::NUM, "reqSigs", "The required signatures (always 1)"},
|
||||
{RPCResult::Type::ARR, "addresses", "(always length 1)",
|
||||
{RPCResult::Type::STR, "address", /* optional */ true, "bitcoin address (only if a well-defined address exists)"},
|
||||
{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 bitcoin addresses",
|
||||
{
|
||||
{RPCResult::Type::STR, "address", "segwit address"},
|
||||
}},
|
||||
|
|
|
@ -220,7 +220,6 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
|||
return true;
|
||||
}
|
||||
case TxoutType::MULTISIG:
|
||||
// Multisig txns have more than one address...
|
||||
case TxoutType::NULL_DATA:
|
||||
case TxoutType::NONSTANDARD:
|
||||
return false;
|
||||
|
@ -228,6 +227,7 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
|||
assert(false);
|
||||
}
|
||||
|
||||
// TODO: from v23 ("addresses" and "reqSigs" deprecated) "ExtractDestinations" should be removed
|
||||
bool ExtractDestinations(const CScript& scriptPubKey, TxoutType& typeRet, std::vector<CTxDestination>& addressRet, int& nRequiredRet)
|
||||
{
|
||||
addressRet.clear();
|
||||
|
|
|
@ -247,6 +247,8 @@ bool ExtractDestination(const CScript& scriptPubKey, CTxDestination& addressRet)
|
|||
* Note: this function confuses destinations (a subset of CScripts that are
|
||||
* encodable as an address) with key identifiers (of keys involved in a
|
||||
* CScript), and its use should be phased out.
|
||||
*
|
||||
* TODO: from v23 ("addresses" and "reqSigs" deprecated) "ExtractDestinations" should be removed
|
||||
*/
|
||||
bool ExtractDestinations(const CScript& scriptPubKey, TxoutType& typeRet, std::vector<CTxDestination>& addressRet, int& nRequiredRet);
|
||||
|
||||
|
|
|
@ -103,9 +103,11 @@ FUZZ_TARGET_INIT(script, initialize_script)
|
|||
(void)ScriptToAsmStr(script, true);
|
||||
|
||||
UniValue o1(UniValue::VOBJ);
|
||||
ScriptPubKeyToUniv(script, o1, true);
|
||||
ScriptPubKeyToUniv(script, o1, true, true);
|
||||
ScriptPubKeyToUniv(script, o1, true, false);
|
||||
UniValue o2(UniValue::VOBJ);
|
||||
ScriptPubKeyToUniv(script, o2, false);
|
||||
ScriptPubKeyToUniv(script, o2, false, true);
|
||||
ScriptPubKeyToUniv(script, o2, false, false);
|
||||
UniValue o3(UniValue::VOBJ);
|
||||
ScriptToUniv(script, o3, true);
|
||||
UniValue o4(UniValue::VOBJ);
|
||||
|
|
|
@ -100,7 +100,9 @@ FUZZ_TARGET_INIT(transaction, initialize_transaction)
|
|||
(void)IsWitnessStandard(tx, coins_view_cache);
|
||||
|
||||
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"));
|
||||
TxToUniv(tx, u256_max, u);
|
||||
TxToUniv(tx, u256_max, /* include_addresses */ true, u);
|
||||
TxToUniv(tx, u256_max, /* include_addresses */ false, u);
|
||||
}
|
||||
|
|
|
@ -1741,7 +1741,7 @@ static RPCHelpMan gettransaction()
|
|||
|
||||
if (verbose) {
|
||||
UniValue decoded(UniValue::VOBJ);
|
||||
TxToUniv(*wtx.tx, uint256(), decoded, false);
|
||||
TxToUniv(*wtx.tx, uint256(), pwallet->chain().rpcEnableDeprecated("addresses"), decoded, false);
|
||||
entry.pushKV("decoded", decoded);
|
||||
}
|
||||
|
||||
|
|
|
@ -33,12 +33,7 @@ def make_utxo(node, amount, confirmed=True, scriptPubKey=DUMMY_P2WPKH_SCRIPT):
|
|||
txid = node.sendtoaddress(new_addr, satoshi_round((amount+fee)/COIN))
|
||||
tx1 = node.getrawtransaction(txid, 1)
|
||||
txid = int(txid, 16)
|
||||
i = None
|
||||
|
||||
for i, txout in enumerate(tx1['vout']):
|
||||
if txout['scriptPubKey']['addresses'] == [new_addr]:
|
||||
break
|
||||
assert i is not None
|
||||
i, _ = next(filter(lambda vout: new_addr == vout[1]['scriptPubKey']['address'], enumerate(tx1['vout'])))
|
||||
|
||||
tx2 = CTransaction()
|
||||
tx2.vin = [CTxIn(COutPoint(txid, i))]
|
||||
|
|
|
@ -523,7 +523,7 @@ class SegWitTest(BitcoinTestFramework):
|
|||
v1_addr = program_to_witness(1, [3, 5])
|
||||
v1_tx = self.nodes[0].createrawtransaction([getutxo(spendable_txid[0])], {v1_addr: 1})
|
||||
v1_decoded = self.nodes[1].decoderawtransaction(v1_tx)
|
||||
assert_equal(v1_decoded['vout'][0]['scriptPubKey']['addresses'][0], v1_addr)
|
||||
assert_equal(v1_decoded['vout'][0]['scriptPubKey']['address'], v1_addr)
|
||||
assert_equal(v1_decoded['vout'][0]['scriptPubKey']['hex'], "51020305")
|
||||
|
||||
# Check that spendable outputs are really spendable
|
||||
|
|
|
@ -80,7 +80,7 @@ class MempoolPackagesTest(BitcoinTestFramework):
|
|||
self.chain_transaction(self.nodes[0], [second_chain], [0], second_chain_value, fee, 1)
|
||||
|
||||
# Make sure we can RBF the chain which used our carve-out rule
|
||||
second_tx_outputs = {self.nodes[0].getrawtransaction(replacable_txid, True)["vout"][0]['scriptPubKey']['addresses'][0]: replacable_orig_value - (Decimal(1) / Decimal(100))}
|
||||
second_tx_outputs = {self.nodes[0].getrawtransaction(replacable_txid, True)["vout"][0]['scriptPubKey']['address']: replacable_orig_value - (Decimal(1) / Decimal(100))}
|
||||
second_tx = self.nodes[0].createrawtransaction([{'txid': chain[0][0], 'vout': 1}], second_tx_outputs)
|
||||
signed_second_tx = self.nodes[0].signrawtransactionwithwallet(second_tx)
|
||||
self.nodes[0].sendrawtransaction(signed_second_tx['hex'])
|
||||
|
|
|
@ -130,7 +130,7 @@ class FilterTest(BitcoinTestFramework):
|
|||
filter_peer = P2PBloomFilter()
|
||||
|
||||
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)
|
||||
|
||||
self.log.debug("Send a mempool msg after connecting and check that the tx is received")
|
||||
|
@ -142,7 +142,7 @@ class FilterTest(BitcoinTestFramework):
|
|||
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")
|
||||
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)
|
||||
# Sync to make sure the reason filter_peer doesn't receive the tx is not p2p delays
|
||||
filter_peer.sync_with_ping()
|
||||
|
@ -156,7 +156,7 @@ class FilterTest(BitcoinTestFramework):
|
|||
filter_peer.send_and_ping(filter_peer.watch_filter_init)
|
||||
# If fRelay is not already True, sending filterload sets it to True
|
||||
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')
|
||||
block_hash = self.nodes[0].generatetoaddress(1, filter_address)[0]
|
||||
|
|
58
test/functional/rpc_addresses_deprecation.py
Normal file
58
test/functional/rpc_addresses_deprecation.py
Normal 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'], ['mvKDK6D54HU8wQumJBLHY95eq5iHFqXSBz', 'mv3rHCQSwKp2BLSuMHD8uCS32LW5xiNAA5', 'mirrsyhAQYzo5CwVhcaYJKwUJu1WJRCRJe'])
|
||||
assert_equal(script_pub_key['reqSigs'], 2)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
AddressesDeprecationTest().main()
|
|
@ -165,7 +165,7 @@ class RpcCreateMultiSigTest(BitcoinTestFramework):
|
|||
txid = node0.sendtoaddress(madd, 40)
|
||||
|
||||
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
|
||||
vout = vout[0]
|
||||
scriptPubKey = tx["vout"][vout]["scriptPubKey"]["hex"]
|
||||
|
|
|
@ -248,7 +248,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
rawtxfund = self.nodes[2].fundrawtransaction(rawtx, {'changeAddress': change, 'changePosition': 0})
|
||||
dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
|
||||
out = dec_tx['vout'][0]
|
||||
assert_equal(change, out['scriptPubKey']['addresses'][0])
|
||||
assert_equal(change, out['scriptPubKey']['address'])
|
||||
|
||||
def test_change_type(self):
|
||||
self.log.info("Test fundrawtxn with a provided change type")
|
||||
|
@ -288,7 +288,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
matchingOuts = 0
|
||||
for i, out in enumerate(dec_tx['vout']):
|
||||
totalOut += out['value']
|
||||
if out['scriptPubKey']['addresses'][0] in outputs:
|
||||
if out['scriptPubKey']['address'] in outputs:
|
||||
matchingOuts+=1
|
||||
else:
|
||||
assert_equal(i, rawtxfund['changepos'])
|
||||
|
@ -319,7 +319,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
matchingOuts = 0
|
||||
for out in dec_tx['vout']:
|
||||
totalOut += out['value']
|
||||
if out['scriptPubKey']['addresses'][0] in outputs:
|
||||
if out['scriptPubKey']['address'] in outputs:
|
||||
matchingOuts+=1
|
||||
|
||||
assert_equal(matchingOuts, 1)
|
||||
|
@ -353,7 +353,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
matchingOuts = 0
|
||||
for out in dec_tx['vout']:
|
||||
totalOut += out['value']
|
||||
if out['scriptPubKey']['addresses'][0] in outputs:
|
||||
if out['scriptPubKey']['address'] in outputs:
|
||||
matchingOuts+=1
|
||||
|
||||
assert_equal(matchingOuts, 2)
|
||||
|
@ -802,7 +802,7 @@ class RawTransactionsTest(BitcoinTestFramework):
|
|||
changeaddress = ""
|
||||
for out in res_dec['vout']:
|
||||
if out['value'] > 1.0:
|
||||
changeaddress += out['scriptPubKey']['addresses'][0]
|
||||
changeaddress += out['scriptPubKey']['address']
|
||||
assert changeaddress != ""
|
||||
nextaddr = self.nodes[3].getnewaddress()
|
||||
# Now the change address key should be removed from the keypool.
|
||||
|
|
|
@ -27,13 +27,13 @@ class GenerateBlockTest(BitcoinTestFramework):
|
|||
hash = node.generateblock(output=address, transactions=[])['hash']
|
||||
block = node.getblock(blockhash=hash, verbose=2)
|
||||
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')
|
||||
hash = node.generateblock('addr(' + address + ')', [])['hash']
|
||||
block = node.getblock(blockhash=hash, verbosity=2)
|
||||
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')
|
||||
combo_key = '0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'
|
||||
|
@ -41,7 +41,7 @@ class GenerateBlockTest(BitcoinTestFramework):
|
|||
hash = node.generateblock('combo(' + combo_key + ')', [])['hash']
|
||||
block = node.getblock(hash, 2)
|
||||
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)
|
||||
|
||||
self.log.info('Generate an empty block to a combo descriptor with uncompressed pubkey')
|
||||
combo_key = '0408ef68c46d20596cc3f6ddf7c8794f71913add807f1dc55949fa805d764d191c0b7ce6894c126fce0babc6663042f3dde9b0cf76467ea315514e5a6731149c67'
|
||||
|
@ -49,7 +49,7 @@ class GenerateBlockTest(BitcoinTestFramework):
|
|||
hash = node.generateblock('combo(' + combo_key + ')', [])['hash']
|
||||
block = node.getblock(hash, 2)
|
||||
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
|
||||
node.generatetoaddress(110, address)
|
||||
|
|
|
@ -158,17 +158,17 @@ class PSBTTest(BitcoinTestFramework):
|
|||
p2sh_p2wpkh_pos = -1
|
||||
decoded = self.nodes[0].decoderawtransaction(signed_tx)
|
||||
for out in decoded['vout']:
|
||||
if out['scriptPubKey']['addresses'][0] == p2sh:
|
||||
if out['scriptPubKey']['address'] == p2sh:
|
||||
p2sh_pos = out['n']
|
||||
elif out['scriptPubKey']['addresses'][0] == p2wsh:
|
||||
elif out['scriptPubKey']['address'] == p2wsh:
|
||||
p2wsh_pos = out['n']
|
||||
elif out['scriptPubKey']['addresses'][0] == p2wpkh:
|
||||
elif out['scriptPubKey']['address'] == p2wpkh:
|
||||
p2wpkh_pos = out['n']
|
||||
elif out['scriptPubKey']['addresses'][0] == p2sh_p2wsh:
|
||||
elif out['scriptPubKey']['address'] == p2sh_p2wsh:
|
||||
p2sh_p2wsh_pos = out['n']
|
||||
elif out['scriptPubKey']['addresses'][0] == p2sh_p2wpkh:
|
||||
elif out['scriptPubKey']['address'] == p2sh_p2wpkh:
|
||||
p2sh_p2wpkh_pos = out['n']
|
||||
elif out['scriptPubKey']['addresses'][0] == p2pkh:
|
||||
elif out['scriptPubKey']['address'] == p2pkh:
|
||||
p2pkh_pos = out['n']
|
||||
|
||||
inputs = [{"txid": txid, "vout": p2wpkh_pos}, {"txid": txid, "vout": p2sh_p2wpkh_pos}, {"txid": txid, "vout": p2pkh_pos}]
|
||||
|
|
|
@ -543,7 +543,7 @@ def find_vout_for_address(node, txid, addr):
|
|||
"""
|
||||
tx = node.getrawtransaction(txid, True)
|
||||
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
|
||||
raise RuntimeError("Vout not found for address: txid=%s, addr=%s" % (txid, addr))
|
||||
|
||||
|
|
|
@ -286,6 +286,7 @@ BASE_SCRIPTS = [
|
|||
'feature_config_args.py',
|
||||
'feature_settings.py',
|
||||
'rpc_getdescriptorinfo.py',
|
||||
'rpc_addresses_deprecation.py',
|
||||
'rpc_help.py',
|
||||
'feature_help.py',
|
||||
'feature_shutdown.py',
|
||||
|
|
|
@ -210,7 +210,7 @@ class AddressTypeTest(BitcoinTestFramework):
|
|||
assert_equal(len(tx["vout"]), len(destinations) + 1)
|
||||
|
||||
# Make sure the destinations are included, and remove them:
|
||||
output_addresses = [vout['scriptPubKey']['addresses'][0] for vout in tx["vout"]]
|
||||
output_addresses = [vout['scriptPubKey']['address'] for vout in tx["vout"]]
|
||||
change_addresses = [d for d in output_addresses if d not in destinations]
|
||||
assert_equal(len(change_addresses), 1)
|
||||
|
||||
|
|
|
@ -253,7 +253,7 @@ class AvoidReuseTest(BitcoinTestFramework):
|
|||
if second_addr_type == "p2sh-segwit":
|
||||
new_fundaddr = fund_decoded["segwit"]["p2sh-segwit"]
|
||||
elif second_addr_type == "bech32":
|
||||
new_fundaddr = fund_decoded["segwit"]["addresses"][0]
|
||||
new_fundaddr = fund_decoded["segwit"]["address"]
|
||||
else:
|
||||
new_fundaddr = fundaddr
|
||||
assert_equal(second_addr_type, "legacy")
|
||||
|
|
|
@ -600,7 +600,7 @@ class WalletTest(BitcoinTestFramework):
|
|||
destination = self.nodes[1].getnewaddress()
|
||||
txid = self.nodes[0].sendtoaddress(destination, 0.123)
|
||||
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
|
||||
for address in output_addresses:
|
||||
ischange = self.nodes[0].getaddressinfo(address)['ischange']
|
||||
|
|
|
@ -535,7 +535,7 @@ def test_change_script_match(self, rbf_node, dest_address):
|
|||
|
||||
def get_change_address(tx):
|
||||
tx_details = rbf_node.getrawtransaction(tx, 1)
|
||||
txout_addresses = [txout['scriptPubKey']['addresses'][0] for txout in tx_details["vout"]]
|
||||
txout_addresses = [txout['scriptPubKey']['address'] for txout in tx_details["vout"]]
|
||||
return [address for address in txout_addresses if rbf_node.getaddressinfo(address)["ischange"]]
|
||||
|
||||
# Check that there is only one change output
|
||||
|
|
|
@ -132,7 +132,7 @@ class WalletHDTest(BitcoinTestFramework):
|
|||
keypath = ""
|
||||
for out in outs:
|
||||
if out['value'] != 1:
|
||||
keypath = self.nodes[1].getaddressinfo(out['scriptPubKey']['addresses'][0])['hdkeypath']
|
||||
keypath = self.nodes[1].getaddressinfo(out['scriptPubKey']['address'])['hdkeypath']
|
||||
|
||||
if self.options.descriptors:
|
||||
assert_equal(keypath[0:14], "m/84'/1'/0'/1/")
|
||||
|
|
|
@ -389,10 +389,10 @@ class WalletSendTest(BitcoinTestFramework):
|
|||
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)
|
||||
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_type="legacy", change_position=0)
|
||||
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] == "m" or change_address[0] == "n"
|
||||
|
||||
self.log.info("Set lock time...")
|
||||
|
|
|
@ -65,8 +65,8 @@ class TxnMallTest(BitcoinTestFramework):
|
|||
# Construct a clone of tx1, to be malleated
|
||||
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_outputs = {rawtx1["vout"][0]["scriptPubKey"]["addresses"][0]: rawtx1["vout"][0]["value"],
|
||||
rawtx1["vout"][1]["scriptPubKey"]["addresses"][0]: rawtx1["vout"][1]["value"]}
|
||||
clone_outputs = {rawtx1["vout"][0]["scriptPubKey"]["address"]: rawtx1["vout"][0]["value"],
|
||||
rawtx1["vout"][1]["scriptPubKey"]["address"]: rawtx1["vout"][1]["value"]}
|
||||
clone_locktime = rawtx1["locktime"]
|
||||
clone_raw = self.nodes[0].createrawtransaction(clone_inputs, clone_outputs, clone_locktime)
|
||||
|
||||
|
|
|
@ -195,11 +195,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o"
|
||||
]
|
||||
"address": "1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -208,11 +205,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 6c772e9cf96371bba3da8cb733da70a2fcf20078 OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a9146c772e9cf96371bba3da8cb733da70a2fcf2007888ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"1AtWkdmfmYkErU16d3KYykJUbEp9MAj9Sb"
|
||||
]
|
||||
"address": "1AtWkdmfmYkErU16d3KYykJUbEp9MAj9Sb",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -204,11 +204,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o"
|
||||
]
|
||||
"address": "1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -204,11 +204,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 8fd139bb39ced713f231c58a4d07bf6954d1c201 OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a9148fd139bb39ced713f231c58a4d07bf6954d1c20188ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o"
|
||||
]
|
||||
"address": "1E7SGgAZFCHDnVZLuRViX3gUmxpMfdvd2o",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -217,11 +214,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 6c772e9cf96371bba3da8cb733da70a2fcf20078 OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a9146c772e9cf96371bba3da8cb733da70a2fcf2007888ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"1AtWkdmfmYkErU16d3KYykJUbEp9MAj9Sb"
|
||||
]
|
||||
"address": "1AtWkdmfmYkErU16d3KYykJUbEp9MAj9Sb",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -42,11 +42,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
|
||||
]
|
||||
"address": "13tuJJDR2RgArmgfv6JScSdreahzgc4T6o",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -55,11 +52,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 f2d4db28cad6502226ee484ae24505c2885cb12d OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a914f2d4db28cad6502226ee484ae24505c2885cb12d88ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"1P8yWvZW8jVihP1bzHeqfE4aoXNX8AVa46"
|
||||
]
|
||||
"address": "1P8yWvZW8jVihP1bzHeqfE4aoXNX8AVa46",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -24,11 +24,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
|
||||
]
|
||||
"address": "13tuJJDR2RgArmgfv6JScSdreahzgc4T6o",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -24,11 +24,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
|
||||
]
|
||||
"address": "13tuJJDR2RgArmgfv6JScSdreahzgc4T6o",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -24,11 +24,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
|
||||
]
|
||||
"address": "13tuJJDR2RgArmgfv6JScSdreahzgc4T6o",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -33,11 +33,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 1fc11f39be1729bf973a7ab6a615ca4729d64574 OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a9141fc11f39be1729bf973a7ab6a615ca4729d6457488ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"13tuJJDR2RgArmgfv6JScSdreahzgc4T6o"
|
||||
]
|
||||
"address": "13tuJJDR2RgArmgfv6JScSdreahzgc4T6o",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -15,13 +15,7 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "2 02a5613bd857b7048924264d1e70e08fb2a7e6527d32b7ab1bb993ac59964ff397 021ac43c7ff740014c3b33737ede99c967e4764553d1b2b83db77c83b8715fa72d 02df2089105c77f266fa11a9d33f05c735234075f2e8780824c6b709415f9fb485 3 OP_CHECKMULTISIG",
|
||||
"hex": "522102a5613bd857b7048924264d1e70e08fb2a7e6527d32b7ab1bb993ac59964ff39721021ac43c7ff740014c3b33737ede99c967e4764553d1b2b83db77c83b8715fa72d2102df2089105c77f266fa11a9d33f05c735234075f2e8780824c6b709415f9fb48553ae",
|
||||
"reqSigs": 2,
|
||||
"type": "multisig",
|
||||
"addresses": [
|
||||
"1FoG2386FG2tAJS9acMuiDsKy67aGg9MKz",
|
||||
"1FXtz9KU8JNmQDyHdiEm5HDiALuP3zdHvV",
|
||||
"14LuavcBbXZYJ6Tsz3cAUQj9SuQoL2xCQX"
|
||||
]
|
||||
"type": "multisig"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -15,11 +15,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_HASH160 1c6fbaf46d64221e80cbae182c33ddf81b9294ac OP_EQUAL",
|
||||
"hex": "a9141c6fbaf46d64221e80cbae182c33ddf81b9294ac87",
|
||||
"reqSigs": 1,
|
||||
"type": "scripthash",
|
||||
"addresses": [
|
||||
"34HNh57oBCRKkxNyjTuWAJkTbuGh6jg2Ms"
|
||||
]
|
||||
"address": "34HNh57oBCRKkxNyjTuWAJkTbuGh6jg2Ms",
|
||||
"type": "scripthash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -15,11 +15,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "0 e15a86a23178f433d514dbbce042e87d72662b8b5edcacfd2e37ab7a2d135f05",
|
||||
"hex": "0020e15a86a23178f433d514dbbce042e87d72662b8b5edcacfd2e37ab7a2d135f05",
|
||||
"reqSigs": 1,
|
||||
"type": "witness_v0_scripthash",
|
||||
"addresses": [
|
||||
"bc1qu9dgdg330r6r84g5mw7wqshg04exv2uttmw2elfwx74h5tgntuzs44gyfg"
|
||||
]
|
||||
"address": "bc1qu9dgdg330r6r84g5mw7wqshg04exv2uttmw2elfwx74h5tgntuzs44gyfg",
|
||||
"type": "witness_v0_scripthash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -15,11 +15,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_HASH160 6edf12858999f0dae74f9c692e6694ee3621b2ac OP_EQUAL",
|
||||
"hex": "a9146edf12858999f0dae74f9c692e6694ee3621b2ac87",
|
||||
"reqSigs": 1,
|
||||
"type": "scripthash",
|
||||
"addresses": [
|
||||
"3BoFUz1StqcNcgUTZE5cC1eFhuYFzj3fGH"
|
||||
]
|
||||
"address": "3BoFUz1StqcNcgUTZE5cC1eFhuYFzj3fGH",
|
||||
"type": "scripthash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -15,11 +15,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_HASH160 a4051c02398868af83f28f083208fae99a769263 OP_EQUAL",
|
||||
"hex": "a914a4051c02398868af83f28f083208fae99a76926387",
|
||||
"reqSigs": 1,
|
||||
"type": "scripthash",
|
||||
"addresses": [
|
||||
"3GeGs1eHUxPz5YyuFe9WPpXid2UsUb5Jos"
|
||||
]
|
||||
"address": "3GeGs1eHUxPz5YyuFe9WPpXid2UsUb5Jos",
|
||||
"type": "scripthash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -15,11 +15,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "0 a2516e770582864a6a56ed21a102044e388c62e3",
|
||||
"hex": "0014a2516e770582864a6a56ed21a102044e388c62e3",
|
||||
"reqSigs": 1,
|
||||
"type": "witness_v0_keyhash",
|
||||
"addresses": [
|
||||
"bc1q5fgkuac9s2ry56jka5s6zqsyfcugcchry5cwu0"
|
||||
]
|
||||
"address": "bc1q5fgkuac9s2ry56jka5s6zqsyfcugcchry5cwu0",
|
||||
"type": "witness_v0_keyhash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -15,11 +15,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_HASH160 a5ab14c9804d0d8bf02f1aea4e82780733ad0a83 OP_EQUAL",
|
||||
"hex": "a914a5ab14c9804d0d8bf02f1aea4e82780733ad0a8387",
|
||||
"reqSigs": 1,
|
||||
"type": "scripthash",
|
||||
"addresses": [
|
||||
"3GnzN8FqgvYGYdhj8NW6UNxxVv3Uj1ApQn"
|
||||
]
|
||||
"address": "3GnzN8FqgvYGYdhj8NW6UNxxVv3Uj1ApQn",
|
||||
"type": "scripthash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -15,11 +15,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_HASH160 71ed53322d470bb96657deb786b94f97dd46fb15 OP_EQUAL",
|
||||
"hex": "a91471ed53322d470bb96657deb786b94f97dd46fb1587",
|
||||
"reqSigs": 1,
|
||||
"type": "scripthash",
|
||||
"addresses": [
|
||||
"3C5QarEGh9feKbDJ3QbMf2YNjnMoiPDhNp"
|
||||
]
|
||||
"address": "3C5QarEGh9feKbDJ3QbMf2YNjnMoiPDhNp",
|
||||
"type": "scripthash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -15,11 +15,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "0 0bfe935e70c321c7ca3afc75ce0d0ca2f98b5422e008bb31c00c6d7f1f1c0ad6",
|
||||
"hex": "00200bfe935e70c321c7ca3afc75ce0d0ca2f98b5422e008bb31c00c6d7f1f1c0ad6",
|
||||
"reqSigs": 1,
|
||||
"type": "witness_v0_scripthash",
|
||||
"addresses": [
|
||||
"bc1qp0lfxhnscvsu0j36l36uurgv5tuck4pzuqytkvwqp3kh78cupttqyf705v"
|
||||
]
|
||||
"address": "bc1qp0lfxhnscvsu0j36l36uurgv5tuck4pzuqytkvwqp3kh78cupttqyf705v",
|
||||
"type": "witness_v0_scripthash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -15,11 +15,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_HASH160 6a2c482f4985f57e702f325816c90e3723ca81ae OP_EQUAL",
|
||||
"hex": "a9146a2c482f4985f57e702f325816c90e3723ca81ae87",
|
||||
"reqSigs": 1,
|
||||
"type": "scripthash",
|
||||
"addresses": [
|
||||
"3BNQbeFeJJGMAyDxPwWPuqxPMrjsFLjk3f"
|
||||
]
|
||||
"address": "3BNQbeFeJJGMAyDxPwWPuqxPMrjsFLjk3f",
|
||||
"type": "scripthash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -24,11 +24,8 @@
|
|||
"scriptPubKey": {
|
||||
"asm": "OP_DUP OP_HASH160 5834479edbbe0539b31ffd3a8f8ebadc2165ed01 OP_EQUALVERIFY OP_CHECKSIG",
|
||||
"hex": "76a9145834479edbbe0539b31ffd3a8f8ebadc2165ed0188ac",
|
||||
"reqSigs": 1,
|
||||
"type": "pubkeyhash",
|
||||
"addresses": [
|
||||
"193P6LtvS4nCnkDvM9uXn1gsSRqh4aDAz7"
|
||||
]
|
||||
"address": "193P6LtvS4nCnkDvM9uXn1gsSRqh4aDAz7",
|
||||
"type": "pubkeyhash"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
Loading…
Add table
Reference in a new issue