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();
        }
Example #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);
        }
Example #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();
        }
        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));
        }
Example #5
0
        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);
        }
Example #7
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);
        }