public async Task Tree_tracker_insert_leaves([ValueSource(nameof(InsertLeavesTestCases))] InsertLeavesTest test) { var address = TestItem.Addresses[0]; var result = await InitializeTestRpc(address); var testRpc = result.TestRpc; BaselineTree baselineTree = BuildATree(); var fromContractAdress = ContractAddress.From(address, 0); var baselineTreeHelper = new BaselineTreeHelper(testRpc.LogFinder, _baselineDb, _metadataBaselineDb, LimboNoErrorLogger.Instance); new BaselineTreeTracker(fromContractAdress, baselineTree, testRpc.BlockProcessor, baselineTreeHelper, testRpc.BlockFinder, LimboNoErrorLogger.Instance); var contract = new MerkleTreeSHAContract(_abiEncoder, fromContractAdress); UInt256 nonce = 1L; for (int i = 0; i < test.ExpectedTreeCounts.Length; i++) { nonce = await InsertLeavesFromArray(test.LeavesInTransactionsAndBlocks[i], nonce, testRpc, contract, address); await testRpc.AddBlock(); Assert.AreEqual(test.ExpectedTreeCounts[i], baselineTree.Count); } }
public async Task Tree_tracker_reorganization([ValueSource(nameof(ReorganizationTestCases))] ReorganizedInsertLeafTest test) { Address address = TestItem.Addresses[0]; (TestRpcBlockchain TestRpc, BaselineModule BaselineModule)result = await InitializeTestRpc(address); TestRpcBlockchain testRpc = result.TestRpc; BaselineTree baselineTree = BuildATree(); Address contractAddress = ContractAddress.From(address, 0L); BaselineTreeHelper baselineTreeHelper = new BaselineTreeHelper(testRpc.LogFinder, _baselineDb, _metadataBaselineDb, LimboNoErrorLogger.Instance); new BaselineTreeTracker(contractAddress, baselineTree, testRpc.BlockProcessor, baselineTreeHelper, testRpc.BlockFinder, LimboNoErrorLogger.Instance); MerkleTreeSHAContract contract = new MerkleTreeSHAContract(_abiEncoder, contractAddress); UInt256 nonce = 1L; for (int i = 0; i < test.LeavesInBlocksCounts.Length; i++) { nonce = await InsertLeafFromArray(test.LeavesInTransactionsAndBlocks[i], nonce, testRpc, contract, address); await testRpc.AddBlock(); Assert.AreEqual(test.LeavesInBlocksCounts[i], baselineTree.Count); } int initBlocksCount = 4; int allBlocksCount = initBlocksCount + test.LeavesInBlocksCounts.Length; TestBlockProducer testRpcBlockProducer = (TestBlockProducer)testRpc.BlockProducer; testRpcBlockProducer.BlockParent = testRpc.BlockTree.FindHeader(allBlocksCount); nonce = 1L; nonce = await InsertLeafFromArray(test.LeavesInMiddleOfReorganization, nonce, testRpc, contract, address); await testRpc.AddBlock(false); testRpcBlockProducer.BlockParent = testRpcBlockProducer.LastProducedBlock.Header; await InsertLeafFromArray(test.LeavesInAfterReorganization, nonce, testRpc, contract, address); await testRpc.AddBlock(); Assert.AreEqual(test.FinalLeavesCount, baselineTree.Count); }
public async Task Tree_tracker_start_stop_tracking([ValueSource(nameof(InsertLeafTestCases))] InsertLeafTest test) { Address address = TestItem.Addresses[0]; (TestRpcBlockchain TestRpc, BaselineModule BaselineModule)result = await InitializeTestRpc(address); TestRpcBlockchain testRpc = result.TestRpc; BaselineTree baselineTree = BuildATree(); Address fromContractAdress = ContractAddress.From(address, 0L); BaselineTreeHelper baselineTreeHelper = new BaselineTreeHelper(testRpc.LogFinder, _baselineDb, _metadataBaselineDb, LimboNoErrorLogger.Instance); MerkleTreeSHAContract contract = new MerkleTreeSHAContract(_abiEncoder, fromContractAdress); UInt256 nonce = 1L; for (int i = 0; i < test.ExpectedTreeCounts.Length; i++) { nonce = await InsertLeafFromArray(test.LeavesInTransactionsAndBlocks[i], nonce, testRpc, contract, address); await testRpc.AddBlock(); } BaselineTreeTracker tracker = new BaselineTreeTracker(fromContractAdress, baselineTree, testRpc.BlockProcessor, baselineTreeHelper, testRpc.BlockFinder, LimboNoErrorLogger.Instance); Assert.AreEqual(test.ExpectedTreeCounts[test.ExpectedTreeCounts.Length - 1], baselineTree.Count); uint afterStartTrackingCount = baselineTree.Count; for (int i = 0; i < test.ExpectedTreeCounts.Length; i++) { tracker.StopTracking(); nonce = await InsertLeafFromArray(test.LeavesInTransactionsAndBlocks[i], nonce, testRpc, contract, address); await testRpc.AddBlock(); tracker.StartTracking(); Assert.AreEqual(test.ExpectedTreeCounts[i] + afterStartTrackingCount, baselineTree.Count); } }
private async Task <UInt256> InsertLeavesFromArray(Keccak[][] transactions, UInt256 startingNonce, TestRpcBlockchain testRpc, MerkleTreeSHAContract contract, Address address) { UInt256 nonce = startingNonce; for (int j = 0; j < transactions.Length; j++) { Keccak[] hashes = transactions[j]; Transaction transaction = contract.InsertLeaves(address, hashes); transaction.Nonce = nonce; ++nonce; await testRpc.TxSender.SendTransaction(transaction, TxPool.TxHandlingOptions.None); } return(nonce); }