diff --git a/qa/rpc-tests/finalsaplingroot.py b/qa/rpc-tests/finalsaplingroot.py index e95b6c68a..789012284 100755 --- a/qa/rpc-tests/finalsaplingroot.py +++ b/qa/rpc-tests/finalsaplingroot.py @@ -6,9 +6,11 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.util import ( + NU5_BRANCH_ID, assert_equal, connect_nodes_bi, get_coinbase_address, + nuparams, start_nodes, wait_and_assert_operationid_status, ) @@ -17,6 +19,7 @@ from decimal import Decimal SPROUT_TREE_EMPTY_ROOT = "59d2cde5e65c1414c32ba54f0fe4bdb3d67618125286e6a191317917c812c6d7" SAPLING_TREE_EMPTY_ROOT = "3e49b5f954aa9d3545bc6c37744661eea48d7c34e3000d82b7f0010c30f4c2fb" +ORCHARD_TREE_EMPTY_ROOT = "2fd8e51a03d9bbe2dd809831b1497aeb68a6e37ddf707ced4aa2d8dff13529ae" NULL_FIELD = "0000000000000000000000000000000000000000000000000000000000000000" # Verify block header field 'hashFinalSaplingRoot' (returned in rpc as 'finalsaplingroot') @@ -25,17 +28,16 @@ class FinalSaplingRootTest(BitcoinTestFramework): def __init__(self): super().__init__() - self.num_nodes = 4 + self.num_nodes = 2 self.setup_clean_chain = True def setup_network(self, split=False): self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, extra_args=[[ - '-txindex' # Avoid JSONRPC error: No information available about transaction + '-txindex', # Avoid JSONRPC error: No information available about transaction + nuparams(NU5_BRANCH_ID, 210), + '-debug', ]] * self.num_nodes) connect_nodes_bi(self.nodes,0,1) - connect_nodes_bi(self.nodes,1,2) - connect_nodes_bi(self.nodes,0,2) - connect_nodes_bi(self.nodes,0,3) self.is_network_split=False self.sync_all() @@ -52,13 +54,19 @@ class FinalSaplingRootTest(BitcoinTestFramework): assert_equal(treestate["sprout"]["commitments"]["finalRoot"], SPROUT_TREE_EMPTY_ROOT) assert_equal(treestate["sprout"]["commitments"]["finalState"], "000000") - assert("skipHash" not in treestate["sprout"]) + assert "skipHash" not in treestate["sprout"] assert_equal(treestate["sapling"]["commitments"]["finalRoot"], NULL_FIELD) # There is no sapling state tree yet, and trying to find it in an earlier # block won't succeed (we're at genesis block), so skipHash is absent. - assert("finalState" not in treestate["sapling"]) - assert("skipHash" not in treestate["sapling"]) + assert "finalState" not in treestate["sapling"] + assert "skipHash" not in treestate["sapling"] + + assert_equal(treestate["orchard"]["commitments"]["finalRoot"], NULL_FIELD) + # There is no orchard state tree yet, and trying to find it in an earlier + # block won't succeed (we're at genesis block), so skipHash is absent. + assert "finalState" not in treestate["orchard"] + assert "skipHash" not in treestate["orchard"] # Verify all generated blocks contain the empty root of the Sapling tree. blockcount = self.nodes[0].getblockcount() @@ -70,14 +78,18 @@ class FinalSaplingRootTest(BitcoinTestFramework): assert_equal(treestate["height"], height) assert_equal(treestate["hash"], self.nodes[0].getblockhash(height)) - assert("skipHash" not in treestate["sprout"]) + assert "skipHash" not in treestate["sprout"] assert_equal(treestate["sprout"]["commitments"]["finalRoot"], SPROUT_TREE_EMPTY_ROOT) assert_equal(treestate["sprout"]["commitments"]["finalState"], "000000") - assert("skipHash" not in treestate["sapling"]) + + assert "skipHash" not in treestate["sapling"] assert_equal(treestate["sapling"]["commitments"]["finalRoot"], SAPLING_TREE_EMPTY_ROOT) assert_equal(treestate["sapling"]["commitments"]["finalState"], "000000") + assert "skipHash" not in treestate["orchard"] + assert_equal(treestate["orchard"]["commitments"]["finalRoot"], NULL_FIELD) + # Node 0 shields some funds taddr0 = get_coinbase_address(self.nodes[0]) saplingAddr0 = self.nodes[0].z_getnewaddress('sapling') @@ -93,8 +105,8 @@ class FinalSaplingRootTest(BitcoinTestFramework): # Verify the final Sapling root has changed blk = self.nodes[0].getblock("201") root = blk["finalsaplingroot"] - assert(root is not SAPLING_TREE_EMPTY_ROOT) - assert(root is not NULL_FIELD) + assert root is not SAPLING_TREE_EMPTY_ROOT + assert root is not NULL_FIELD # Verify there is a Sapling output description (its commitment was added to tree) result = self.nodes[0].getrawtransaction(mytxid, 1) @@ -105,8 +117,8 @@ class FinalSaplingRootTest(BitcoinTestFramework): new_treestate = self.nodes[0].z_gettreestate(str(-1)) assert_equal(new_treestate["sapling"]["commitments"]["finalRoot"], root) assert_equal(new_treestate["sprout"], treestate["sprout"]) - assert(new_treestate["sapling"]["commitments"]["finalRoot"] != treestate["sapling"]["commitments"]["finalRoot"]) - assert(new_treestate["sapling"]["commitments"]["finalState"] != treestate["sapling"]["commitments"]["finalState"]) + assert new_treestate["sapling"]["commitments"]["finalRoot"] != treestate["sapling"]["commitments"]["finalRoot"] + assert new_treestate["sapling"]["commitments"]["finalState"] != treestate["sapling"]["commitments"]["finalState"] assert_equal(len(new_treestate["sapling"]["commitments"]["finalRoot"]), 64) assert_equal(len(new_treestate["sapling"]["commitments"]["finalState"]), 70) treestate = new_treestate @@ -145,8 +157,8 @@ class FinalSaplingRootTest(BitcoinTestFramework): new_treestate = self.nodes[0].z_gettreestate(str(-1)) assert_equal(new_treestate["sapling"]["commitments"]["finalRoot"], root) assert_equal(new_treestate["sapling"], treestate["sapling"]) - assert(new_treestate["sprout"]["commitments"]["finalRoot"] != treestate["sprout"]["commitments"]["finalRoot"]) - assert(new_treestate["sprout"]["commitments"]["finalState"] != treestate["sprout"]["commitments"]["finalState"]) + assert new_treestate["sprout"]["commitments"]["finalRoot"] != treestate["sprout"]["commitments"]["finalRoot"] + assert new_treestate["sprout"]["commitments"]["finalState"] != treestate["sprout"]["commitments"]["finalState"] assert_equal(len(new_treestate["sprout"]["commitments"]["finalRoot"]), 64) assert_equal(len(new_treestate["sprout"]["commitments"]["finalState"]), 134) treestate = new_treestate @@ -164,7 +176,7 @@ class FinalSaplingRootTest(BitcoinTestFramework): assert_equal(len(self.nodes[0].getblock("205")["tx"]), 2) assert_equal(self.nodes[1].z_getbalance(saplingAddr1), Decimal("12.34")) - assert(root is not self.nodes[0].getblock("205")["finalsaplingroot"]) + assert root is not self.nodes[0].getblock("205")["finalsaplingroot"] # Verify there is a Sapling output description (its commitment was added to tree) result = self.nodes[0].getrawtransaction(mytxid, 1) @@ -172,8 +184,8 @@ class FinalSaplingRootTest(BitcoinTestFramework): new_treestate = self.nodes[0].z_gettreestate(str(-1)) assert_equal(new_treestate["sprout"], treestate["sprout"]) - assert(new_treestate["sapling"]["commitments"]["finalRoot"] != treestate["sapling"]["commitments"]["finalRoot"]) - assert(new_treestate["sapling"]["commitments"]["finalState"] != treestate["sapling"]["commitments"]["finalState"]) + assert new_treestate["sapling"]["commitments"]["finalRoot"] != treestate["sapling"]["commitments"]["finalRoot"] + assert new_treestate["sapling"]["commitments"]["finalState"] != treestate["sapling"]["commitments"]["finalState"] assert_equal(len(new_treestate["sapling"]["commitments"]["finalRoot"]), 64) assert_equal(len(new_treestate["sapling"]["commitments"]["finalState"]), 136) treestate = new_treestate @@ -200,6 +212,21 @@ class FinalSaplingRootTest(BitcoinTestFramework): assert_equal(new_treestate["sprout"], treestate["sprout"]) assert_equal(new_treestate["sapling"], treestate["sapling"]) + # Activate NU5; more testing should be added once we can mine orchard transactions. + self.sync_all() + self.nodes[0].generate(4) + self.sync_all() + new_treestate = self.nodes[0].z_gettreestate(str(-1)) + + # sprout and sapling results should not change + assert_equal(new_treestate["sprout"], treestate["sprout"]) + assert_equal(new_treestate["sapling"], treestate["sapling"]) + + assert "skipHash" not in treestate["orchard"] + assert_equal(new_treestate["orchard"]["commitments"]["finalRoot"], ORCHARD_TREE_EMPTY_ROOT) + assert_equal(new_treestate["orchard"]["commitments"]["finalState"], "00") + pass + if __name__ == '__main__': FinalSaplingRootTest().main()