Use cached sprout addresses rather than funding

This commit is contained in:
Greg Pfeil 2022-08-24 11:21:36 -06:00
parent 1951a1fc46
commit 1c2a406f32
No known key found for this signature in database
GPG Key ID: 1193ACD196ED61F2
2 changed files with 42 additions and 74 deletions

View File

@ -52,7 +52,7 @@ class TurnstileTest (BitcoinTestFramework):
def __init__(self):
super().__init__()
self.num_nodes = 3
self.cache_behavior = 'clean'
self.cache_behavior = 'sprout'
def setup_network(self, split=False):
self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, extra_args=[BASE_ARGS] * self.num_nodes)
@ -86,39 +86,38 @@ class TurnstileTest (BitcoinTestFramework):
def run_test(self):
# Sanity-check the test harness
self.nodes[0].generate(101)
assert_equal(self.nodes[0].getblockcount(), 101)
assert_equal(self.nodes[0].getblockcount(), 200)
self.sync_all()
# Node 0 shields some funds
dest_addr = self.nodes[0].z_getnewaddress(POOL_NAME.lower())
taddr0 = get_coinbase_address(self.nodes[0])
if (POOL_NAME == "SPROUT"):
myopid = self.nodes[0].z_shieldcoinbase(taddr0, dest_addr, 0, 1)['opid']
dest_addr = self.nodes[0].listaddresses()[0]['sprout']['addresses'][0]
elif (POOL_NAME == "SAPLING"):
# Node 0 shields some funds
dest_addr = self.nodes[0].z_getnewaddress('sapling')
recipients = []
recipients.append({"address": dest_addr, "amount": Decimal('10')})
recipients.append({"address": dest_addr, "amount": Decimal('50')})
myopid = self.nodes[0].z_sendmany(taddr0, recipients, 1, 0)
wait_and_assert_operationid_status(self.nodes[0], myopid)
else:
fail("Unrecognized pool name: " + POOL_NAME)
wait_and_assert_operationid_status(self.nodes[0], myopid)
self.sync_all()
self.nodes[0].generate(1)
self.sync_all()
assert_equal(self.nodes[0].z_getbalance(dest_addr), Decimal('10'))
assert_equal(self.nodes[0].z_getbalance(dest_addr), Decimal('50'))
# Verify size of shielded pool
self.assert_pool_balance(self.nodes[0], POOL_NAME.lower(), Decimal('10'))
self.assert_pool_balance(self.nodes[1], POOL_NAME.lower(), Decimal('10'))
self.assert_pool_balance(self.nodes[2], POOL_NAME.lower(), Decimal('10'))
self.assert_pool_balance(self.nodes[0], POOL_NAME.lower(), Decimal('200'))
self.assert_pool_balance(self.nodes[1], POOL_NAME.lower(), Decimal('200'))
self.assert_pool_balance(self.nodes[2], POOL_NAME.lower(), Decimal('200'))
# Relaunch node 0 with in-memory size of value pools set to zero.
self.restart_and_sync_node(0, TURNSTILE_ARGS)
# Verify size of shielded pool
self.assert_pool_balance(self.nodes[0], POOL_NAME.lower(), Decimal('0'))
self.assert_pool_balance(self.nodes[1], POOL_NAME.lower(), Decimal('10'))
self.assert_pool_balance(self.nodes[2], POOL_NAME.lower(), Decimal('10'))
self.assert_pool_balance(self.nodes[1], POOL_NAME.lower(), Decimal('200'))
self.assert_pool_balance(self.nodes[2], POOL_NAME.lower(), Decimal('200'))
# Node 0 creates an unshielding transaction
recipients = []
@ -170,8 +169,8 @@ class TurnstileTest (BitcoinTestFramework):
# Verify size of shielded pool
self.assert_pool_balance(self.nodes[0], POOL_NAME.lower(), Decimal('0'))
self.assert_pool_balance(self.nodes[1], POOL_NAME.lower(), Decimal('9'))
self.assert_pool_balance(self.nodes[2], POOL_NAME.lower(), Decimal('9'))
self.assert_pool_balance(self.nodes[1], POOL_NAME.lower(), Decimal('199'))
self.assert_pool_balance(self.nodes[2], POOL_NAME.lower(), Decimal('199'))
# Stop node 0 and check logs to verify the block was rejected as a turnstile violation
string_to_find1 = "ConnectBlock(): turnstile violation in " + POOL_NAME.capitalize() + " shielded value pool"

View File

@ -19,60 +19,29 @@ from decimal import Decimal
# Test wallet z_listunspent behaviour across network upgrades
class WalletListNotes(BitcoinTestFramework):
def __init__(self):
super().__init__()
self.cache_behavior = 'sprout'
def setup_nodes(self):
return start_nodes(4, self.options.tmpdir, [[
nuparams(NU5_BRANCH_ID, 215),
'-allowdeprecated=z_getnewaddress',
'-allowdeprecated=z_getbalance',
'-allowdeprecated=z_gettotalbalance',
]] * 4)
def run_test(self):
# Current height = 200 -> Sapling
assert_equal(200, self.nodes[0].getblockcount())
sproutzaddr = self.nodes[0].z_getnewaddress('sprout')
# we've got lots of coinbase (taddr) but no shielded funds yet
assert_equal(0, Decimal(self.nodes[0].z_gettotalbalance()['private']))
sproutzaddr = self.nodes[0].listaddresses()[0]['sprout']['addresses'][0]
receive_amount_1 = self.nodes[0].z_getbalance(sproutzaddr)
# Set current height to 201
self.nodes[0].generate(1)
self.sync_all()
assert_equal(201, self.nodes[0].getblockcount())
# Shield one coinbase output
receive_amount_1 = Decimal('10.0') - DEFAULT_FEE
result = self.nodes[0].z_shieldcoinbase('*', sproutzaddr, DEFAULT_FEE, 1)
txid_1 = wait_and_assert_operationid_status(self.nodes[0], result['opid'])
self.sync_all()
# No funds (with (default) one or more confirmations) in sproutzaddr yet
assert_equal(0, len(self.nodes[0].z_listunspent()))
assert_equal(0, len(self.nodes[0].z_listunspent(1)))
# no private balance because no confirmations yet
assert_equal(0, Decimal(self.nodes[0].z_gettotalbalance()['private']))
# list private unspent, this time allowing 0 confirmations
unspent_cb = self.nodes[0].z_listunspent(0)
assert_equal(1, len(unspent_cb))
assert_equal(False, unspent_cb[0]['change'])
assert_equal(txid_1, unspent_cb[0]['txid'])
assert_equal('sprout', unspent_cb[0]['pool'])
assert_equal(True, unspent_cb[0]['spendable'])
assert_equal(sproutzaddr, unspent_cb[0]['address'])
assert_equal(receive_amount_1, unspent_cb[0]['amount'])
# list unspent, filtering by address, should produce same result
unspent_cb_filter = self.nodes[0].z_listunspent(0, 9999, False, [sproutzaddr])
assert_equal(unspent_cb, unspent_cb_filter)
# Generate a block to confirm shield coinbase tx
self.nodes[0].generate(1)
self.sync_all()
# Current height = 202
assert_equal(202, self.nodes[0].getblockcount())
# Send 1.0 minus default fee from sproutzaddr to a new Sapling zaddr
saplingzaddr = self.nodes[0].z_getnewaddress('sapling')
receive_amount_2 = Decimal('1.0')
@ -88,19 +57,19 @@ class WalletListNotes(BitcoinTestFramework):
assert_equal(len(unspent_tx), 2)
# sort low-to-high by amount (order of returned entries is not guaranteed)
unspent_tx = sorted(unspent_tx, key=lambda k: k['amount'])
assert_equal(False, unspent_tx[0]['change'])
assert_equal(txid_2, unspent_tx[0]['txid'])
assert_equal('sapling', unspent_tx[0]['pool'])
assert_equal(True, unspent_tx[0]['spendable'])
assert_equal(saplingzaddr, unspent_tx[0]['address'])
assert_equal(receive_amount_2, unspent_tx[0]['amount'])
assert_equal(False, unspent_tx[0]['change'])
assert_equal(True, unspent_tx[1]['change'])
assert_equal(txid_2, unspent_tx[1]['txid'])
assert_equal('sprout', unspent_tx[1]['pool'])
assert_equal(True, unspent_tx[1]['spendable'])
assert_equal(sproutzaddr, unspent_tx[1]['address'])
assert_equal(change_amount_2, unspent_tx[1]['amount'])
assert_equal(True, unspent_tx[1]['change'])
unspent_tx_filter = self.nodes[0].z_listunspent(0, 9999, False, [saplingzaddr])
assert_equal(1, len(unspent_tx_filter))
@ -127,26 +96,26 @@ class WalletListNotes(BitcoinTestFramework):
# low-to-high in amount
unspent_tx = sorted(unspent_tx, key=lambda k: k['amount'])
assert_equal(False, unspent_tx[0]['change'])
assert_equal(txid_2, unspent_tx[0]['txid'])
assert_equal('sapling', unspent_tx[0]['pool'])
assert_equal(True, unspent_tx[0]['spendable'])
assert_equal(saplingzaddr, unspent_tx[0]['address'])
assert_equal(receive_amount_2, unspent_tx[0]['amount'])
assert_equal(False, unspent_tx[0]['change'])
assert_equal(False, unspent_tx[1]['change'])
assert_equal(txid_3, unspent_tx[1]['txid'])
assert_equal('sapling', unspent_tx[1]['pool'])
assert_equal(True, unspent_tx[1]['spendable'])
assert_equal(saplingzaddr2, unspent_tx[1]['address'])
assert_equal(receive_amount_3, unspent_tx[1]['amount'])
assert_equal(False, unspent_tx[1]['change'])
assert_equal(True, unspent_tx[2]['change'])
assert_equal(txid_3, unspent_tx[2]['txid'])
assert_equal('sprout', unspent_tx[2]['pool'])
assert_equal(True, unspent_tx[2]['spendable'])
assert_equal(sproutzaddr, unspent_tx[2]['address'])
assert_equal(change_amount_3, unspent_tx[2]['amount'])
assert_equal(True, unspent_tx[2]['change'])
unspent_tx_filter = self.nodes[0].z_listunspent(0, 9999, False, [saplingzaddr])
assert_equal(1, len(unspent_tx_filter))
@ -169,7 +138,7 @@ class WalletListNotes(BitcoinTestFramework):
# but this requires Sapling support for those RPCs
# Set current height to 215 -> NU5
self.nodes[0].generate(12)
self.nodes[0].generate(13)
self.sync_all()
assert_equal(215, self.nodes[0].getblockcount())
@ -187,37 +156,37 @@ class WalletListNotes(BitcoinTestFramework):
# low-to-high in amount
unspent_tx = sorted(unspent_tx, key=lambda k: k['amount'])
assert_equal(False, unspent_tx[0]['change'])
assert_equal(txid_2, unspent_tx[0]['txid'])
assert_equal('sapling', unspent_tx[0]['pool'])
assert_equal(True, unspent_tx[0]['spendable'])
assert_true('account' not in unspent_tx[0])
assert_equal(saplingzaddr, unspent_tx[0]['address'])
assert_equal(receive_amount_2, unspent_tx[0]['amount'])
assert_equal(False, unspent_tx[0]['change'])
assert_equal(False, unspent_tx[1]['change'])
assert_equal(txid_3, unspent_tx[1]['txid'])
assert_equal('sapling', unspent_tx[1]['pool'])
assert_equal(True, unspent_tx[1]['spendable'])
assert_true('account' not in unspent_tx[1])
assert_equal(saplingzaddr2, unspent_tx[1]['address'])
assert_equal(receive_amount_3, unspent_tx[1]['amount'])
assert_equal(False, unspent_tx[1]['change'])
assert_equal(True, unspent_tx[2]['change'])
assert_equal(txid_3, unspent_tx[2]['txid'])
assert_equal('sprout', unspent_tx[2]['pool'])
assert_equal(txid_4, unspent_tx[2]['txid'])
assert_equal('orchard', unspent_tx[2]['pool'])
assert_equal(True, unspent_tx[2]['spendable'])
assert_true('account' not in unspent_tx[2])
assert_equal(sproutzaddr, unspent_tx[2]['address'])
assert_equal(change_amount_3, unspent_tx[2]['amount'])
assert_equal(account0, unspent_tx[2]['account'])
assert_equal(ua0, unspent_tx[2]['address'])
assert_equal(receive_amount_4, unspent_tx[2]['amount'])
assert_equal(False, unspent_tx[2]['change'])
assert_equal(False, unspent_tx[3]['change'])
assert_equal(txid_4, unspent_tx[3]['txid'])
assert_equal('orchard', unspent_tx[3]['pool'])
assert_equal(txid_3, unspent_tx[3]['txid'])
assert_equal('sprout', unspent_tx[3]['pool'])
assert_equal(True, unspent_tx[3]['spendable'])
assert_equal(account0, unspent_tx[3]['account'])
assert_equal(ua0, unspent_tx[3]['address'])
assert_equal(receive_amount_4, unspent_tx[3]['amount'])
assert_true('account' not in unspent_tx[3])
assert_equal(sproutzaddr, unspent_tx[3]['address'])
assert_equal(change_amount_3, unspent_tx[3]['amount'])
assert_equal(True, unspent_tx[3]['change'])
if __name__ == '__main__':
WalletListNotes().main()