Update sprout_sapling_migration test to use persisted sprout chains.

This commit is contained in:
Kris Nuttycombe 2022-06-30 10:43:56 -06:00
parent afea5c386d
commit b2fc56c24a
1 changed files with 22 additions and 47 deletions

View File

@ -5,8 +5,8 @@
from decimal import Decimal
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import assert_equal, assert_true, get_coinbase_address, \
start_nodes, wait_and_assert_operationid_status, \
from test_framework.util import assert_equal, assert_true, \
start_nodes, \
wait_and_assert_operationid_status_result, DEFAULT_FEE
SAPLING_ADDR = 'zregtestsapling1ssqj3f3majnl270985gqcdqedd9t4nlttjqskccwevj2v20sc25deqspv3masufnwcdy67cydyy'
@ -52,7 +52,7 @@ class SproutSaplingMigration(BitcoinTestFramework):
def __init__(self):
super().__init__()
self.num_nodes = 4
self.setup_clean_chain = True
self.cache_behavior = 'sprout'
def setup_nodes(self):
extra_args = [[
@ -67,17 +67,17 @@ class SproutSaplingMigration(BitcoinTestFramework):
assert_equal(0, len(extra_args[1]))
return start_nodes(self.num_nodes, self.options.tmpdir, extra_args)
def run_migration_test(self, node, sproutAddr, saplingAddr, target_height):
def run_migration_test(self, node, sproutAddr, saplingAddr, target_height, sprout_initial_balance):
# Make sure we are in a good state to run the test
assert_equal(102, node.getblockcount() % 500, "Should be at block 102 % 500")
assert_equal(node.z_getbalance(sproutAddr), Decimal('10'))
assert_equal(200, node.getblockcount() % 500, "Should be at block 200 % 500")
assert_equal(node.z_getbalance(sproutAddr), sprout_initial_balance)
assert_equal(node.z_getbalance(saplingAddr), Decimal('0'))
check_migration_status(node, saplingAddr, DISABLED_BEFORE_MIGRATION)
# Migrate
node.z_setmigration(True)
print("Mining to block 494 % 500...")
node.generate(392) # 102 % 500 -> 494 % 500
node.generate(294) # 200 % 500 -> 494 % 500
self.sync_all()
# At 494 % 500 we should have no async operations
@ -90,7 +90,7 @@ class SproutSaplingMigration(BitcoinTestFramework):
# At 495 % 500 we should have an async operation
operationstatus = node.z_getoperationstatus()
print("migration operation: {}".format(operationstatus))
assert_equal(1, len(operationstatus), "num async operations at 495 % 500")
assert_equal(1, len(operationstatus), "num async operations at 495 % 500")
assert_equal('saplingmigration', operationstatus[0]['method'])
assert_equal(target_height, operationstatus[0]['target_height'])
@ -109,7 +109,7 @@ class SproutSaplingMigration(BitcoinTestFramework):
# At 498 % 500 the mempool will be empty and no funds will have moved
assert_equal(0, len(node.getrawmempool()), "mempool size at 498 % 500")
assert_equal(node.z_getbalance(sproutAddr), Decimal('10'))
assert_equal(node.z_getbalance(sproutAddr), sprout_initial_balance)
assert_equal(node.z_getbalance(saplingAddr), Decimal('0'))
node.generate(1)
@ -125,7 +125,7 @@ class SproutSaplingMigration(BitcoinTestFramework):
# Check that unmigrated amount + unfinalized = starting balance - fee
status = node.z_getmigrationstatus()
print("status: {}".format(status))
assert_equal(Decimal('10.0') - DEFAULT_FEE, Decimal(status['unmigrated_amount']) + Decimal(status['unfinalized_migrated_amount']))
assert_equal(sprout_initial_balance - DEFAULT_FEE, Decimal(status['unmigrated_amount']) + Decimal(status['unfinalized_migrated_amount']))
# The transaction in the mempool should be the one listed in migration_txids,
# and it should expire at the next 450 % 500.
@ -142,9 +142,9 @@ class SproutSaplingMigration(BitcoinTestFramework):
sprout_balance = node.z_getbalance(sproutAddr)
sapling_balance = node.z_getbalance(saplingAddr)
print("sprout balance: {}, sapling balance: {}".format(sprout_balance, sapling_balance))
assert_true(sprout_balance < Decimal('10'), "Should have less Sprout funds")
assert_true(sprout_balance < sprout_initial_balance, "Should have less Sprout funds")
assert_true(sapling_balance > Decimal('0'), "Should have more Sapling funds")
assert_true(sprout_balance + sapling_balance, Decimal('10.0') - DEFAULT_FEE)
assert_true(sprout_balance + sapling_balance, sprout_initial_balance - DEFAULT_FEE)
check_migration_status(node, saplingAddr, DURING_MIGRATION)
# At 10 % 500 the transactions will be considered 'finalized'
@ -156,59 +156,34 @@ class SproutSaplingMigration(BitcoinTestFramework):
assert_equal(sprout_balance, Decimal(status['unmigrated_amount']))
assert_equal(sapling_balance, Decimal(status['finalized_migrated_amount']))
def send_to_sprout_zaddr(self, tAddr, sproutAddr):
# Send some ZEC to a Sprout address
result = self.nodes[0].z_shieldcoinbase(tAddr, sproutAddr, 0, 1)
wait_and_assert_operationid_status(self.nodes[0], result['opid'])
self.nodes[0].generate(1)
self.sync_all()
def run_test(self):
# Wallet RPCs that depend on accurate chain state are blocked while in IBD. This
# test starts from a clean chain state, so we need to mine a single block first to
# ensure that the chain tip's block time is within 24 hours of the current time.
#
# We mine 2 blocks because we need to make two transparent->Sprout spends below
# (to load Sprout addresses with funds), and `get_coinbase_address` only selects
# a coinbase address with spendable coins. If we only mined one block here and 100
# below, the selected coinbase address would only have one coin (due to the way
# the `generate` RPC uses one address per call).
print("Mining blocks...")
self.nodes[0].generate(2)
self.sync_all()
# Check enabling via '-migration' and disabling via rpc
check_migration_status(self.nodes[0], SAPLING_ADDR, ENABLED_NO_FUNDS)
check_migration_status(self.nodes[0], SAPLING_ADDR, ENABLED_BEFORE_MIGRATION)
self.nodes[0].z_setmigration(False)
check_migration_status(self.nodes[0], SAPLING_ADDR, DISABLED_NO_FUNDS)
check_migration_status(self.nodes[0], SAPLING_ADDR, DISABLED_BEFORE_MIGRATION)
print("Running test using '-migrationdestaddress'...")
# 1. Test using self.nodes[0] which has the parameter
print("Running test using '-migrationdestaddress'...")
self.nodes[0].generate(99)
self.sync_all()
tAddr = get_coinbase_address(self.nodes[0])
# Import a previously generated key to test '-migrationdestaddress'
self.nodes[0].z_importkey(SAPLING_KEY)
sproutAddr0 = self.nodes[0].z_getnewaddress('sprout')
sproutAddr0 = self.nodes[0].listaddresses()[0]['sprout']['addresses'][0]
self.send_to_sprout_zaddr(tAddr, sproutAddr0)
self.run_migration_test(self.nodes[0], sproutAddr0, SAPLING_ADDR, 500)
self.run_migration_test(self.nodes[0], sproutAddr0, SAPLING_ADDR, 500, Decimal('50'))
# Disable migration so only self.nodes[1] has a transaction in the mempool at block 999
self.nodes[0].z_setmigration(False)
# 2. Test using self.nodes[1] which will use the default Sapling address
print("Running test using default Sapling address...")
# Mine more blocks so we start at 102 % 500
# Mine more blocks so we start at 200 % 500
print("Mining blocks...")
self.nodes[1].generate(91) # 511 -> 602
self.nodes[1].generate(190) # 510 -> 700
self.sync_all()
sproutAddr1 = self.nodes[1].z_getnewaddress('sprout')
sproutAddr1 = self.nodes[1].listaddresses()[0]['sprout']['addresses'][0]
saplingAddr1 = self.nodes[1].z_getnewaddress('sapling')
self.send_to_sprout_zaddr(tAddr, sproutAddr1)
self.run_migration_test(self.nodes[1], sproutAddr1, saplingAddr1, 1000)
self.run_migration_test(self.nodes[1], sproutAddr1, saplingAddr1, 1000, Decimal('50'))
if __name__ == '__main__':