示例#1
0
    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)
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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)