mirror of https://github.com/bitcoin/bitcoin
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
5.1 KiB
135 lines
5.1 KiB
6 years ago
|
#!/usr/bin/env python3
|
||
|
# Copyright (c) 2018 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 the behavior of RPC importprivkey on set and unset labels of
|
||
|
addresses.
|
||
|
|
||
|
It tests different cases in which an address is imported with importaddress
|
||
|
with or without a label and then its private key is imported with importprivkey
|
||
|
with and without a label.
|
||
|
"""
|
||
|
|
||
|
from test_framework.test_framework import BitcoinTestFramework
|
||
|
from test_framework.util import assert_equal
|
||
|
|
||
|
|
||
|
class ImportWithLabel(BitcoinTestFramework):
|
||
|
def set_test_params(self):
|
||
|
self.num_nodes = 2
|
||
|
self.setup_clean_chain = True
|
||
|
|
||
|
def skip_test_if_missing_module(self):
|
||
|
self.skip_if_no_wallet()
|
||
|
|
||
|
def run_test(self):
|
||
|
"""Main test logic"""
|
||
|
|
||
|
self.log.info(
|
||
|
"Test importaddress with label and importprivkey without label."
|
||
|
)
|
||
|
self.log.info("Import a watch-only address with a label.")
|
||
|
address = self.nodes[0].getnewaddress()
|
||
|
label = "Test Label"
|
||
|
self.nodes[1].importaddress(address, label)
|
||
|
address_assert = self.nodes[1].getaddressinfo(address)
|
||
|
|
||
|
assert_equal(address_assert["iswatchonly"], True)
|
||
|
assert_equal(address_assert["ismine"], False)
|
||
|
assert_equal(address_assert["label"], label)
|
||
|
|
||
|
self.log.info(
|
||
|
"Import the watch-only address's private key without a "
|
||
|
"label and the address should keep its label."
|
||
|
)
|
||
|
priv_key = self.nodes[0].dumpprivkey(address)
|
||
|
self.nodes[1].importprivkey(priv_key)
|
||
|
|
||
|
assert_equal(label, self.nodes[1].getaddressinfo(address)["label"])
|
||
|
|
||
|
self.log.info(
|
||
|
"Test importaddress without label and importprivkey with label."
|
||
|
)
|
||
|
self.log.info("Import a watch-only address without a label.")
|
||
|
address2 = self.nodes[0].getnewaddress()
|
||
|
self.nodes[1].importaddress(address2)
|
||
|
address_assert2 = self.nodes[1].getaddressinfo(address2)
|
||
|
|
||
|
assert_equal(address_assert2["iswatchonly"], True)
|
||
|
assert_equal(address_assert2["ismine"], False)
|
||
|
assert_equal(address_assert2["label"], "")
|
||
|
|
||
|
self.log.info(
|
||
|
"Import the watch-only address's private key with a "
|
||
|
"label and the address should have its label updated."
|
||
|
)
|
||
|
priv_key2 = self.nodes[0].dumpprivkey(address2)
|
||
|
label2 = "Test Label 2"
|
||
|
self.nodes[1].importprivkey(priv_key2, label2)
|
||
|
|
||
|
assert_equal(label2, self.nodes[1].getaddressinfo(address2)["label"])
|
||
|
|
||
|
self.log.info("Test importaddress with label and importprivkey with label.")
|
||
|
self.log.info("Import a watch-only address with a label.")
|
||
|
address3 = self.nodes[0].getnewaddress()
|
||
|
label3_addr = "Test Label 3 for importaddress"
|
||
|
self.nodes[1].importaddress(address3, label3_addr)
|
||
|
address_assert3 = self.nodes[1].getaddressinfo(address3)
|
||
|
|
||
|
assert_equal(address_assert3["iswatchonly"], True)
|
||
|
assert_equal(address_assert3["ismine"], False)
|
||
|
assert_equal(address_assert3["label"], label3_addr)
|
||
|
|
||
|
self.log.info(
|
||
|
"Import the watch-only address's private key with a "
|
||
|
"label and the address should have its label updated."
|
||
|
)
|
||
|
priv_key3 = self.nodes[0].dumpprivkey(address3)
|
||
|
label3_priv = "Test Label 3 for importprivkey"
|
||
|
self.nodes[1].importprivkey(priv_key3, label3_priv)
|
||
|
|
||
|
assert_equal(label3_priv, self.nodes[1].getaddressinfo(address3)["label"])
|
||
|
|
||
|
self.log.info(
|
||
|
"Test importprivkey won't label new dests with the same "
|
||
|
"label as others labeled dests for the same key."
|
||
|
)
|
||
|
self.log.info("Import a watch-only legacy address with a label.")
|
||
|
address4 = self.nodes[0].getnewaddress()
|
||
|
label4_addr = "Test Label 4 for importaddress"
|
||
|
self.nodes[1].importaddress(address4, label4_addr)
|
||
|
address_assert4 = self.nodes[1].getaddressinfo(address4)
|
||
|
|
||
|
assert_equal(address_assert4["iswatchonly"], True)
|
||
|
assert_equal(address_assert4["ismine"], False)
|
||
|
assert_equal(address_assert4["label"], label4_addr)
|
||
|
|
||
|
self.log.info("Asserts address has no embedded field with dests.")
|
||
|
|
||
|
assert_equal(address_assert4.get("embedded"), None)
|
||
|
|
||
|
self.log.info(
|
||
|
"Import the watch-only address's private key without a "
|
||
|
"label and new destinations for the key should have an "
|
||
|
"empty label while the 'old' destination should keep "
|
||
|
"its label."
|
||
|
)
|
||
|
priv_key4 = self.nodes[0].dumpprivkey(address4)
|
||
|
self.nodes[1].importprivkey(priv_key4)
|
||
|
address_assert4 = self.nodes[1].getaddressinfo(address4)
|
||
|
|
||
|
assert address_assert4.get("embedded")
|
||
|
|
||
|
bcaddress_assert = self.nodes[1].getaddressinfo(
|
||
|
address_assert4["embedded"]["address"]
|
||
|
)
|
||
|
|
||
|
assert_equal(address_assert4["label"], label4_addr)
|
||
|
assert_equal(bcaddress_assert["label"], "")
|
||
|
|
||
|
self.stop_nodes()
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
ImportWithLabel().main()
|