def run_test(self): getcontext().prec = 6 self.nodes[0].generate(101) self.sync_all() zcoin_denoms = [1, 10, 25, 50, 100] # make confirmed mints and spends for denom in zcoin_denoms: self.nodes[0].mintzerocoin(denom) self.nodes[0].mintzerocoin(denom) self.nodes[0].mintzerocoin(denom) self.nodes[0].generate(6) for denom in zcoin_denoms: self.nodes[0].spendzerocoin(denom) self.nodes[0].generate(1) #get list of unspent mints and spends, mints zcoin_mints = self.nodes[0].listmintzerocoins().sort( key=lambda x: x['id'], reverse=False) zcoin_unspentmints = self.nodes[0].listunspentmintzerocoins().sort( key=lambda x: x['txid'], reverse=False) zcoin_spendzcoins = self.nodes[0].listspendzerocoins(100).sort( key=lambda x: x['txid'], reverse=False) tmpdir = self.options.tmpdir try: self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.unencrypted.dump") except Exception as ex: key = get_dumpwallet_otp(ex.error['message']) self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.unencrypted.dump", key) stop_node(self.nodes[0], 0) os.remove(self.options.tmpdir + "/node0/regtest/wallet.dat") start_node(0, self.options.tmpdir) self.nodes[0].importwallet(tmpdir + "/node0/wallet.unencrypted.dump") exp_zcoin_mints = self.nodes[0].listmintzerocoins().sort( key=lambda x: x['id'], reverse=False) exp_zcoin_unspentmints = self.nodes[0].listunspentmintzerocoins().sort( key=lambda x: x['txid'], reverse=False) exp_zcoin_spendzcoins = self.nodes[0].listspendzerocoins(100).sort( key=lambda x: x['txid'], reverse=False) assert_equal(exp_zcoin_mints, zcoin_mints) assert_equal(exp_zcoin_unspentmints, zcoin_unspentmints) assert_equal(exp_zcoin_spendzcoins, zcoin_spendzcoins)
def run_test(self): getcontext().prec = 6 self.nodes[0].generate(201) self.sync_all() sigma_denoms = [0.05, 0.1, 0.5, 1, 10, 25, 100] # make confirmed mints and spends denom_sum = sum(sigma_denoms) # mint, full confirmation self.nodes[0].mint("{0:.2f}".format(3 * denom_sum)) self.nodes[0].generate(6) # spend, single confirmation self.nodes[0].spendmany( "", {'THAYjKnnCsN5xspnEcb1Ztvw4mSPBuwxzU': denom_sum}) self.nodes[0].generate(1) #get list of unspent mints and spends, mints sigma_mints = self.nodes[0].listsigmamints(True) sigma_unspentmints = self.nodes[0].listunspentsigmamints(1) sigma_spendsigmas = self.nodes[0].listsigmaspends(100) tmpdir = self.options.tmpdir try: self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.unencrypted.dump") except Exception as ex: key = get_dumpwallet_otp(ex.error['message']) self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.unencrypted.dump", key) last_block_height = self.nodes[0].getinfo()["blocks"] stop_node(self.nodes[0], 0) os.remove(self.options.tmpdir + "/node0/regtest/wallet.dat") start_node(0, self.options.tmpdir) while self.nodes[0].getinfo()["blocks"] != last_block_height: time.sleep(1) self.nodes[0].importwallet(tmpdir + "/node0/wallet.unencrypted.dump") exp_sigma_mints = self.nodes[0].listsigmamints(True) exp_sigma_unspentmints = self.nodes[0].listunspentsigmamints(1) exp_sigma_spendsigmas = self.nodes[0].listsigmaspends(100) assert_equal(exp_sigma_mints, sigma_mints) assert_equal(exp_sigma_unspentmints, sigma_unspentmints) assert_equal(exp_sigma_spendsigmas, sigma_spendsigmas)
def run_test(self): logging.info("Generating initial blockchain") self.nodes[0].generate(1) sync_blocks(self.nodes) self.nodes[1].generate(1) sync_blocks(self.nodes) self.nodes[2].generate(1) sync_blocks(self.nodes) self.nodes[3].generate(100) sync_blocks(self.nodes) assert_equal(self.nodes[0].getbalance(), 40) assert_equal(self.nodes[1].getbalance(), 40) assert_equal(self.nodes[2].getbalance(), 40) assert_equal(self.nodes[3].getbalance(), 0) logging.info("Creating transactions") # Five rounds of sending each other transactions. for i in range(5): self.do_one_round() logging.info("Backing up") tmpdir = self.options.tmpdir self.nodes[0].backupwallet(tmpdir + "/node0/wallet.bak") key = None try: self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.dump") except Exception as ex: key = get_dumpwallet_otp(ex.error['message']) self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.dump", key) assert key, 'Import wallet did not raise exception when was called first time without one-time code.' self.nodes[1].backupwallet(tmpdir + "/node1/wallet.bak") key = None try: self.nodes[1].dumpwallet(tmpdir + "/node1/wallet.dump") except Exception as ex: key = get_dumpwallet_otp(ex.error['message']) self.nodes[1].dumpwallet(tmpdir + "/node1/wallet.dump", key) assert key, 'Import wallet did not raise exception when was called first time without one-time code.' self.nodes[2].backupwallet(tmpdir + "/node2/wallet.bak") key = None try: self.nodes[2].dumpwallet(tmpdir + "/node2/wallet.dump") except Exception as ex: key = get_dumpwallet_otp(ex.error['message']) self.nodes[2].dumpwallet(tmpdir + "/node2/wallet.dump", key) assert key, 'Import wallet did not raise exception when was called first time without one-time code.' logging.info("More transactions") for i in range(5): self.do_one_round() # Generate 101 more blocks, so any fees paid mature self.nodes[3].generate(101) self.sync_all() balance0 = self.nodes[0].getbalance() balance1 = self.nodes[1].getbalance() balance2 = self.nodes[2].getbalance() balance3 = self.nodes[3].getbalance() total = balance0 + balance1 + balance2 + balance3 # At this point, there are 214 blocks (103 for setup, then 10 rounds, then 101.) # 114 are mature, so the sum of all wallets should be 114 * 40 = 4560. assert_equal(total, 4560) ## # Test restoring spender wallets from backups ## logging.info("Restoring using wallet.dat") self.stop_three() self.erase_three() # Start node2 with no chain shutil.rmtree(self.options.tmpdir + "/node2/regtest/blocks") shutil.rmtree(self.options.tmpdir + "/node2/regtest/chainstate") # Restore wallets from backup shutil.copyfile(tmpdir + "/node0/wallet.bak", tmpdir + "/node0/regtest/wallet.dat") shutil.copyfile(tmpdir + "/node1/wallet.bak", tmpdir + "/node1/regtest/wallet.dat") shutil.copyfile(tmpdir + "/node2/wallet.bak", tmpdir + "/node2/regtest/wallet.dat") logging.info("Re-starting nodes") self.start_three() sync_blocks(self.nodes) assert_equal(self.nodes[0].getbalance(), balance0) assert_equal(self.nodes[1].getbalance(), balance1) assert_equal(self.nodes[2].getbalance(), balance2) logging.info("Restoring using dumped wallet") self.stop_three() self.erase_three() #start node2 with no chain shutil.rmtree(self.options.tmpdir + "/node2/regtest/blocks") shutil.rmtree(self.options.tmpdir + "/node2/regtest/chainstate") self.start_three() assert_equal(self.nodes[0].getbalance(), 0) assert_equal(self.nodes[1].getbalance(), 0) assert_equal(self.nodes[2].getbalance(), 0) self.nodes[0].importwallet(tmpdir + "/node0/wallet.dump") self.nodes[1].importwallet(tmpdir + "/node1/wallet.dump") self.nodes[2].importwallet(tmpdir + "/node2/wallet.dump") sync_blocks(self.nodes) assert_equal(self.nodes[0].getbalance(), balance0) assert_equal(self.nodes[1].getbalance(), balance1) assert_equal(self.nodes[2].getbalance(), balance2)
def run_test(self): tmpdir = self.options.tmpdir # Make sure we use hd, keep masterkeyid masterkeyid = self.nodes[1].getwalletinfo()['hdmasterkeyid'] assert_equal(len(masterkeyid), 40) # Import a non-HD private key in the HD wallet non_hd_add = self.nodes[0].getnewaddress() key = None try: self.nodes[1].importprivkey(self.nodes[0].dumpprivkey(non_hd_add)) except Exception as ex: key = get_dumpwallet_otp(ex.error['message']) self.nodes[1].importprivkey(self.nodes[0].dumpprivkey( non_hd_add, key)) assert key, 'Import wallet did not raise exception when was called first time without one-time code.' # This should be enough to keep the master key and the non-HD key self.nodes[1].backupwallet(tmpdir + "/hd.bak") #self.nodes[1].dumpwallet(tmpdir + "/hd.dump") # Derive some HD addresses and remember the last # Also send funds to each add self.nodes[0].generate(101) hd_add = None num_hd_adds = 300 for i in range(num_hd_adds): hd_add = self.nodes[1].getnewaddress() hd_info = self.nodes[1].validateaddress(hd_add) assert_equal(hd_info["hdkeypath"], "m/44'/1'/0'/0/" + str(i + 1)) assert_equal(hd_info["hdmasterkeyid"], masterkeyid) self.nodes[0].sendtoaddress(hd_add, 1) self.nodes[0].generate(1) self.nodes[0].sendtoaddress(non_hd_add, 1) self.nodes[0].generate(1) self.sync_all() assert_equal(self.nodes[1].getbalance(), num_hd_adds + 1) print("Restore backup ...") self.stop_node(1) # we need to delete the complete regtest directory # otherwise node1 would auto-recover all funds in flag the keypool keys as used shutil.rmtree(tmpdir + "/node1/regtest/blocks") shutil.rmtree(tmpdir + "/node1/regtest/chainstate") shutil.copyfile(tmpdir + "/hd.bak", tmpdir + "/node1/regtest/wallet.dat") self.nodes[1] = start_node(1, self.options.tmpdir, self.node_args[1]) # Assert that derivation is deterministic hd_add_2 = None for _ in range(num_hd_adds): hd_add_2 = self.nodes[1].getnewaddress() hd_info_2 = self.nodes[1].validateaddress(hd_add_2) assert_equal(hd_info_2["hdkeypath"], "m/44'/1'/0'/0/" + str(_ + 1)) assert_equal(hd_info_2["hdmasterkeyid"], masterkeyid) assert_equal(hd_add, hd_add_2) connect_nodes_bi(self.nodes, 0, 1) self.sync_all() # Needs rescan self.stop_node(1) self.nodes[1] = start_node(1, self.options.tmpdir, self.node_args[1] + ['-rescan']) #connect_nodes_bi(self.nodes, 0, 1) assert_equal(self.nodes[1].getbalance(), num_hd_adds + 1)
def run_test(self): tmpdir = self.options.tmpdir # 21 hdmint keys generated initially (0-20) hdmint_key_count = 21 # generate 20 addresses to compare against the dump test_addr_count = 20 addrs = [] for i in range(0, test_addr_count): addr = self.nodes[0].getnewaddress() vaddr = self.nodes[0].validateaddress( addr) #required to get hd keypath addrs.append(vaddr) # Should be a no-op: self.nodes[0].keypoolrefill() # dump unencrypted wallet key = None try: self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.unencrypted.dump") except Exception as ex: key = get_dumpwallet_otp(ex.error['message']) self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.unencrypted.dump", key) assert key, 'Import wallet did not raise exception when was called first time without one-time code.' found_addr, found_addr_chg, found_addr_rsv, found_addr_sigma, hd_master_addr_unenc = \ read_dump(tmpdir + "/node0/wallet.unencrypted.dump", addrs, None) assert_equal(found_addr, test_addr_count) # all keys must be in the dump assert_equal(found_addr_chg, 50) # 50 block were mined assert_equal(found_addr_sigma, hdmint_key_count) # hdmint keys assert_equal(found_addr_rsv, 90 + 1) # keypool size (TODO: fix off-by-one) #encrypt wallet, restart, unlock and dump self.nodes[0].encryptwallet('test') bitcoind_processes[0].wait() self.nodes[0] = start_node(0, self.options.tmpdir, self.extra_args[0]) self.nodes[0].walletpassphrase('test', 10) # Should be a no-op: self.nodes[0].keypoolrefill() key = None try: self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.encrypted.dump") except Exception as ex: key = get_dumpwallet_otp(ex.error['message']) self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.encrypted.dump", key) assert key, 'Import wallet did not raise exception when was called first time without one-time code.' found_addr, found_addr_chg, found_addr_rsv, found_addr_sigma, hd_master_addr_enc = \ read_dump(tmpdir + "/node0/wallet.encrypted.dump", addrs, hd_master_addr_unenc) assert_equal(found_addr, test_addr_count) # old reserve keys are marked as change now assert_equal(found_addr_chg, 90 + 1 + 50) # As wallet encryption creates a new master seed, it adds another set of hdmint keys. assert_equal(found_addr_sigma, hdmint_key_count * 2) assert_equal(found_addr_rsv, 90 + 1) # keypool size (TODO: fix off-by-one)