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 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); }
public void loads_initial_validators_from_contract_on_demand() { var validator = new ContractValidator(_validator, _db, _stateProvider, _abiEncoder, _transactionProcessor, _blockTree, _receiptsStorage, _logManager, 1); var initialValidator = TestItem.AddressA; SetupInitialValidators(initialValidator); _block.Number = 3; _blockTree.Head.Returns(_block.Header); validator.IsValidSealer(initialValidator, 10); // 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)); }
public void initializes_pendingValidators_from_db() { var blockNumber = 10; var validators = TestItem.Addresses.Take(10).ToArray(); var blockHash = Keccak.Compute("Test"); var pendingValidators = new ContractValidator.PendingValidators(blockNumber, blockHash, validators); var rlp = Rlp.Encode(pendingValidators); _db[ContractValidator.PendingValidatorsKey.Bytes].Returns(rlp.Bytes); IAuRaValidatorProcessor validator = new ContractValidator(_validator, _db, _stateProvider, _abiEncoder, _transactionProcessor, _blockTree, _receiptsStorage, _logManager, 1); validator.SetFinalizationManager(_blockFinalizationManager); _blockFinalizationManager.BlocksFinalized += Raise.EventWith(new FinalizeEventArgs(_block.Header, Build.A.BlockHeader.WithNumber(blockNumber).WithHash(blockHash).TestObject)); validators.Select((v, i) => validator.IsValidSealer(v, i)).Should().AllBeEquivalentTo(true); }