예제 #1
0
        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();
        }
예제 #2
0
        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);
        }
예제 #3
0
        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();
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
        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));
        }
예제 #7
0
        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);
        }