public void loads_initial_validators_from_contract(long blockNumber, bool producingBlock) { var initialValidator = TestItem.AddressA; SetupInitialValidators(initialValidator); var startBlockNumber = 1; IAuRaValidatorProcessor validator = new ContractValidator(_validator, new MemDb(), _stateProvider, _abiEncoder, _transactionProcessor, _blockTree, _receiptsStorage, _logManager, startBlockNumber); _block.Number = blockNumber; _block.Beneficiary = initialValidator; validator.PreProcess(_block, producingBlock ? ProcessingOptions.ProducingBlock : ProcessingOptions.None); // getValidators should have been called _transactionProcessor.Received(1) .Execute( Arg.Is <Transaction>(t => CheckTransaction(t, _getValidatorsData)), _block.Header, Arg.Is <ITxTracer>(t => t is CallOutputTracer)); if (blockNumber == startBlockNumber) { // finalizeChange should be called _transactionProcessor.Received(1) .Execute(Arg.Is <Transaction>(t => CheckTransaction(t, _finalizeChangeData)), _block.Header, Arg.Is <ITxTracer>(t => t is CallOutputTracer)); } // initial validator should be true validator.IsValidSealer(initialValidator, 5).Should().BeTrue(); }
public void loads_initial_validators_from_contract(InitializeValidatorsTestParameters test) { var initialValidators = Enumerable.Range(1, test.InitialValidatorsCount).Select(i => Address.FromNumber((UInt256)i)).ToArray(); SetupInitialValidators(initialValidators); var validator = new ContractValidator(_validator, _stateProvider, _abiEncoder, _transactionProcessor, _logManager, test.StartBlockNumber); for (int i = 0; i < test.NumberOfSteps; i++) { _block.Number = test.BlockNumber + i; _block.Beneficiary = initialValidators[i % initialValidators.Length]; validator.PreProcess(_block); } // getValidators should have been called _transactionProcessor.Received(1) .Execute( Arg.Is <Transaction>(t => CheckTransaction(t, _getValidatorsData)), _block.Header, Arg.Is <ITxTracer>(t => t is CallOutputTracer)); // finalizeChange should be called or not based on test spec _transactionProcessor.Received(test.ExpectedFinalizationCount) .Execute(Arg.Is <Transaction>(t => CheckTransaction(t, _finalizeChangeData)), _block.Header, Arg.Is <ITxTracer>(t => t is CallOutputTracer)); // all initial validators should be true initialValidators.Select(a => validator.IsValidSealer(a)).Should().AllBeEquivalentTo(true); }
public void loads_initial_validators_from_contract() { var initialValidator = TestItem.AddressA; SetupInitialValidators(initialValidator); IAuRaValidatorProcessor validator = new ContractValidator(_validator, new MemDb(), _stateProvider, _abiEncoder, _transactionProcessor, _blockTree, _logManager, 1); _block.Number = 1; _block.Beneficiary = initialValidator; validator.PreProcess(_block); // getValidators should have been called _transactionProcessor.Received(1) .Execute( Arg.Is <Transaction>(t => CheckTransaction(t, _getValidatorsData)), _block.Header, Arg.Is <ITxTracer>(t => t is CallOutputTracer)); // finalizeChange should be called _transactionProcessor.Received(1) .Execute(Arg.Is <Transaction>(t => CheckTransaction(t, _finalizeChangeData)), _block.Header, Arg.Is <ITxTracer>(t => t is CallOutputTracer)); // initial validator should be true validator.IsValidSealer(initialValidator).Should().BeTrue(); }
public void nonconsecutive_non_producing_preProcess_loads_pending_validators_from_receipts(int lastLevelFinalized, int initialValidatorsIndex, int?expectedBlockValidators) { IEnumerable <Block> GetAllBlocks(BlockTree bt) { var block = bt.FindBlock(bt.Head.Hash, BlockTreeLookupOptions.None); while (block != null) { yield return(block); block = bt.FindBlock(block.ParentHash, BlockTreeLookupOptions.None); } } var validators = TestItem.Addresses[initialValidatorsIndex * 10]; var inMemoryReceiptStorage = new InMemoryReceiptStorage(); var blockTreeBuilder = Build.A.BlockTree().WithTransactions(inMemoryReceiptStorage, RopstenSpecProvider.Instance, delegate(Block block, Transaction transaction) { byte i = 0; return(new[] { Build.A.LogEntry.WithAddress(_contractAddress) .WithData(new[] { (byte)(block.Number * 10 + i++) }) .WithTopics(ValidatorContract.Definition.initiateChangeEventHash, block.ParentHash) .TestObject }); }) .OfChainLength(9, 0, 0, validators); var blockTree = blockTreeBuilder.TestObject; SetupInitialValidators(blockTree.Head, validators); IAuRaValidatorProcessor validator = new ContractValidator(_validator, _db, _stateProvider, _abiEncoder, _transactionProcessor, blockTree, inMemoryReceiptStorage, _logManager, 1); validator.SetFinalizationManager(_blockFinalizationManager); _abiEncoder.Decode(ValidatorContract.Definition.addressArrayResult, Arg.Any <byte[]>()) .Returns(c => { var addressIndex = c.Arg <byte[]>()[0]; return(new object[] { new Address[] { TestItem.Addresses[addressIndex] } }); }); _blockFinalizationManager.GetLastLevelFinalizedBy(blockTree.Head.ParentHash).Returns(lastLevelFinalized); validator.PreProcess(blockTree.FindBlock(blockTree.Head.Hash, BlockTreeLookupOptions.None)); byte[] expectedPendingValidatorsBytes = Rlp.OfEmptySequence.Bytes; if (expectedBlockValidators.HasValue) { var block = GetAllBlocks(blockTree).First(b => b.Number == expectedBlockValidators.Value); var pendingValidators = new ContractValidator.PendingValidators(block.Number, block.Hash, new [] { TestItem.Addresses[block.Number * 10] }); expectedPendingValidatorsBytes = Rlp.Encode(pendingValidators).Bytes; } _db.Received()[ContractValidator.PendingValidatorsKey.Bytes] = Arg.Is <byte[]>(r => r.SequenceEqual(expectedPendingValidatorsBytes)); }
public void creates_system_account_on_start_block() { SetupInitialValidators(Address.FromNumber(2000)); var validator = new ContractValidator(_validator, _stateProvider, _abiEncoder, _transactionProcessor, _logManager, 1); validator.PreProcess(_block); _stateProvider.Received(1).CreateAccount(Address.SystemUser, UInt256.Zero); _stateProvider.Received(1).Commit(Homestead.Instance); }
public void consecutive_initiate_change_gets_finalized_and_switch_validators(ConsecutiveInitiateChangeTestParameters test) { var currentValidators = GenerateValidators(1); SetupInitialValidators(currentValidators); IAuRaValidatorProcessor validator = new ContractValidator(_validator, new MemDb(), _stateProvider, _abiEncoder, _transactionProcessor, _blockTree, _receiptsStorage, _logManager, test.StartBlockNumber); validator.SetFinalizationManager(_blockFinalizationManager); test.TryDoReorganisations(test.StartBlockNumber, out _); for (int i = 0; i < test.Current.NumberOfSteps; i++) { var blockNumber = test.Current.BlockNumber + i; if (test.TryDoReorganisations(blockNumber, out var lastChain)) { ValidateFinalizationForChain(lastChain); i = 0; blockNumber = test.Current.BlockNumber + i; } _block.Number = blockNumber; _block.Beneficiary = currentValidators[blockNumber % currentValidators.Length]; _block.Header.AuRaStep = blockNumber; _block.Hash = Keccak.Compute(blockNumber.ToString()); var txReceipts = test.GetReceipts(_block, _contractAddress, _abiEncoder, SetupAbiAddresses); _block.Bloom = new Bloom(txReceipts.SelectMany(r => r.Logs).ToArray()); Action preProcess = () => validator.PreProcess(_block); preProcess.Should().NotThrow <InvalidOperationException>(test.TestName); validator.PostProcess(_block, txReceipts); var finalizedNumber = blockNumber - validator.MinSealersForFinalization + 1; _blockFinalizationManager.BlocksFinalized += Raise.EventWith( new FinalizeEventArgs(_block.Header, Build.A.BlockHeader.WithNumber(finalizedNumber) .WithHash(Keccak.Compute(finalizedNumber.ToString())).TestObject)); currentValidators = test.GetCurrentValidators(blockNumber); var nextValidators = test.GetNextValidators(blockNumber); currentValidators.Select((a, index) => validator.IsValidSealer(a, index)).Should().AllBeEquivalentTo(true, $"Validator address is not recognized in block {blockNumber}"); nextValidators?.Except(currentValidators).Select((a, index) => validator.IsValidSealer(a, index)).Should().AllBeEquivalentTo(false); } ValidateFinalizationForChain(test.Current); }
public void consecutive_initiate_change_gets_finalized_and_switch_validators(ConsecutiveInitiateChangeTestParameters test) { var currentValidators = GenerateValidators(1); SetupInitialValidators(currentValidators); var validator = new ContractValidator(_validator, _stateProvider, _abiEncoder, _transactionProcessor, _logManager, test.StartBlockNumber); test.TryDoReorganisations(test.StartBlockNumber, out _); for (int i = 0; i < test.Current.NumberOfSteps; i++) { var blockNumber = test.Current.BlockNumber + i; if (test.TryDoReorganisations(blockNumber, out var lastChain)) { ValidateFinalizationForChain(lastChain); i = 0; blockNumber = test.Current.BlockNumber + i; } _block.Number = blockNumber; _block.Beneficiary = currentValidators[i % currentValidators.Length]; var txReceipts = test.GetReceipts(_block, _contractAddress, _abiEncoder, SetupAbiAddresses); _block.Bloom = new Bloom(txReceipts.SelectMany(r => r.Logs).ToArray()); validator.PreProcess(_block); validator.PostProcess(_block, txReceipts); currentValidators = test.GetCurrentValidators(blockNumber); var nextValidators = test.GetNextValidators(blockNumber); currentValidators.Select(a => validator.IsValidSealer(a)).Should().AllBeEquivalentTo(true, $"Validator address is not recognized in block {blockNumber}"); nextValidators?.Except(currentValidators).Select(a => validator.IsValidSealer(a)).Should().AllBeEquivalentTo(false); } ValidateFinalizationForChain(test.Current); }