public void SetUp()
        {
            _db = Substitute.For <IDb>();
            _db[ContractValidator.PendingValidatorsKey.Bytes].Returns((byte[])null);
            _stateProvider            = Substitute.For <IStateProvider>();
            _abiEncoder               = Substitute.For <IAbiEncoder>();
            _logManager               = Substitute.For <ILogManager>();
            _blockTree                = Substitute.For <IBlockTree>();
            _blockFinalizationManager = Substitute.For <IBlockFinalizationManager>();
            _receiptsStorage          = Substitute.For <IReceiptStorage>();
            _validator                = new AuRaParameters.Validator()
            {
                Addresses     = new[] { _contractAddress },
                ValidatorType = AuRaParameters.ValidatorType.Contract
            };

            _block = new Block(Prepare.A.BlockHeader().WithNumber(1).WithAura(1, Bytes.Empty).TestObject, new BlockBody());

            _transactionProcessor = Substitute.For <ITransactionProcessor>();

            _abiEncoder
            .Encode(AbiEncodingStyle.IncludeSignature, Arg.Is <AbiSignature>(s => s.Name == "getValidators"), Arg.Any <object[]>())
            .Returns(_getValidatorsData);

            _abiEncoder
            .Encode(AbiEncodingStyle.IncludeSignature, Arg.Is <AbiSignature>(s => s.Name == "finalizeChange"), Arg.Any <object[]>())
            .Returns(_finalizeChangeData);
        }
Esempio n. 2
0
        public MultiValidator(
            AuRaParameters.Validator validator,
            IAuRaValidatorFactory validatorFactory,
            IBlockTree blockTree,
            IValidatorStore validatorStore,
            IAuRaBlockFinalizationManager finalizationManager,
            BlockHeader parentHeader,
            ILogManager logManager,
            bool forSealing = false)
        {
            if (validator == null)
            {
                throw new ArgumentNullException(nameof(validator));
            }
            if (validator.ValidatorType != AuRaParameters.ValidatorType.Multi)
            {
                throw new ArgumentException("Wrong validator type.", nameof(validator));
            }
            _validatorFactory = validatorFactory ?? throw new ArgumentNullException(nameof(validatorFactory));
            _blockTree        = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
            _validatorStore   = validatorStore ?? throw new ArgumentNullException(nameof(validatorStore));
            _forSealing       = forSealing;
            _logger           = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));

            _validators = validator.Validators?.Count > 0
                ? validator.Validators
                : throw new ArgumentException("Multi validator cannot be empty.", nameof(validator.Validators));

            SetFinalizationManager(finalizationManager, parentHeader);
        }
        public IAuRaValidator CreateValidatorProcessor(AuRaParameters.Validator validator, BlockHeader parentHeader = null, long?startBlock = null)
        {
            IValidatorContract GetValidatorContract() => new ValidatorContract(_transactionProcessor, _abiEncoder, validator.GetContractAddress(), _stateProvider, _readOnlyTxProcessorSource, _signer);
            IReportingValidatorContract GetReportingValidatorContract() => new ReportingValidatorContract(_abiEncoder, validator.GetContractAddress(), _signer);

            var  validSealerStrategy = new ValidSealerStrategy();
            long startBlockNumber    = startBlock ?? AuRaValidatorBase.DefaultStartBlockNumber;

            ContractBasedValidator GetContractBasedValidator() =>
            new ContractBasedValidator(
                GetValidatorContract(),
                _blockTree,
                _receiptFinder,
                _validatorStore,
                validSealerStrategy,
                _finalizationManager,
                parentHeader,
                _logManager,
                startBlockNumber,
                _posdaoTransition,
                _forSealing);

            return(validator.ValidatorType switch
            {
                AuRaParameters.ValidatorType.List =>
                new ListBasedValidator(
                    validator,
                    validSealerStrategy,
                    _validatorStore,
                    _logManager,
                    startBlockNumber,
                    _forSealing),

                AuRaParameters.ValidatorType.Contract => GetContractBasedValidator(),

                AuRaParameters.ValidatorType.ReportingContract =>
                new ReportingContractBasedValidator(
                    GetContractBasedValidator(),
                    GetReportingValidatorContract(),
                    _posdaoTransition,
                    _txSender,
                    _txPool,
                    _miningConfig,
                    _stateProvider,
                    _reportingValidatorCache,
                    _logManager),

                AuRaParameters.ValidatorType.Multi =>
                new MultiValidator(
                    validator,
                    this,
                    _blockTree,
                    _validatorStore,
                    _finalizationManager,
                    parentHeader,
                    _logManager,
                    _forSealing),

                _ => throw new ArgumentOutOfRangeException()
            });
Esempio n. 4
0
            protected override BlockProcessor CreateBlockProcessor()
            {
                var validator = new AuRaParameters.Validator()
                {
                    Addresses     = TestItem.Addresses,
                    ValidatorType = AuRaParameters.ValidatorType.List
                };

                var blockGasLimitContractTransition = this.ChainSpec.AuRa.BlockGasLimitContractTransitions.First();
                var gasLimitContract = new BlockGasLimitContract(new AbiEncoder(), blockGasLimitContractTransition.Value, blockGasLimitContractTransition.Key,
                                                                 new ReadOnlyTransactionProcessorSource(DbProvider, BlockTree, SpecProvider, LimboLogs.Instance));

                GasLimitOverrideCache = new IGasLimitOverride.Cache();
                GasLimitOverride      = new AuRaContractGasLimitOverride(new[] { gasLimitContract }, GasLimitOverrideCache, false, LimboLogs.Instance);

                return(new AuRaBlockProcessor(
                           SpecProvider,
                           Always.Valid,
                           new RewardCalculator(SpecProvider),
                           TxProcessor,
                           StateDb,
                           CodeDb,
                           State,
                           Storage,
                           TxPool,
                           ReceiptStorage,
                           LimboLogs.Instance,
                           BlockTree,
                           null,
                           GasLimitOverride));
            }
Esempio n. 5
0
 public ListBasedValidator(AuRaParameters.Validator validator, IValidSealerStrategy validSealerStrategy, IValidatorStore validatorStore, ILogManager logManager, long startBlockNumber)
     : base(validator, validSealerStrategy, validatorStore, logManager, startBlockNumber)
 {
     Validators = validator.Addresses?.Length > 0
         ? validator.Addresses
         : throw new ArgumentException("Empty validator Addresses.", nameof(validator.Addresses));
 }
Esempio n. 6
0
 public ContractBasedValidator(
     AuRaParameters.Validator validator,
     IStateProvider stateProvider,
     IAbiEncoder abiEncoder,
     ITransactionProcessor transactionProcessor,
     IReadOnlyTransactionProcessorSource readOnlyTransactionProcessorSource,
     IBlockTree blockTree,
     IReceiptFinder receiptFinder,
     IValidatorStore validatorStore,
     IValidSealerStrategy validSealerStrategy,
     IBlockFinalizationManager finalizationManager,
     BlockHeader parentHeader,
     ILogManager logManager,
     long startBlockNumber,
     bool forSealing = false) : base(validator, validSealerStrategy, validatorStore, logManager, startBlockNumber, forSealing)
 {
     _blockTree            = blockTree ?? throw new ArgumentNullException(nameof(blockTree));
     ContractAddress       = validator.Addresses?.FirstOrDefault() ?? throw new ArgumentException("Missing contract address for AuRa validator.", nameof(validator.Addresses));
     _stateProvider        = stateProvider ?? throw new ArgumentNullException(nameof(stateProvider));
     _transactionProcessor = transactionProcessor ?? throw new ArgumentNullException(nameof(transactionProcessor));
     _readOnlyReadOnlyTransactionProcessorSource = readOnlyTransactionProcessorSource ?? throw new ArgumentNullException(nameof(readOnlyTransactionProcessorSource));
     _receiptFinder = receiptFinder ?? throw new ArgumentNullException(nameof(receiptFinder));
     _logger        = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
     AbiEncoder     = abiEncoder ?? throw new ArgumentNullException(nameof(abiEncoder));
     SetPendingValidators(LoadPendingValidators());
     SetFinalizationManager(finalizationManager, parentHeader ?? _blockTree.Head?.Header);
 }
        public void returns_correct_validator_type(AuRaParameters.ValidatorType validatorType, Type expectedType)
        {
            var stateDb = Substitute.For <IDb>();

            stateDb[Arg.Any <byte[]>()].Returns((byte[])null);

            var factory = new AuRaAdditionalBlockProcessorFactory(
                stateDb,
                Substitute.For <IStateProvider>(),
                Substitute.For <IAbiEncoder>(),
                Substitute.For <ITransactionProcessor>(),
                Substitute.For <IBlockTree>(),
                Substitute.For <IReceiptStorage>(),
                Substitute.For <ILogManager>());

            var validator = new AuRaParameters.Validator()
            {
                ValidatorType = validatorType,
                Addresses     = new[] { Address.Zero },
                Validators    = new Dictionary <long, AuRaParameters.Validator>()
                {
                    {
                        0, new AuRaParameters.Validator()
                        {
                            ValidatorType = AuRaParameters.ValidatorType.List, Addresses = new[] { Address.SystemUser }
                        }
                    }
                }
            };

            var result = factory.CreateValidatorProcessor(validator);

            result.Should().BeOfType(expectedType);
        }
            protected override BlockProcessor CreateBlockProcessor()
            {
                var validator = new AuRaParameters.Validator()
                {
                    Addresses     = TestItem.Addresses,
                    ValidatorType = AuRaParameters.ValidatorType.List
                };

                TransactionPermissionContractVersions =
                    new LruCache <Keccak, UInt256>(PermissionBasedTxFilter.Cache.MaxCacheSize, nameof(TransactionPermissionContract));
                var transactionPermissionContract = new VersionedTransactionPermissionContract(new AbiEncoder(), _contractAddress, 1,
                                                                                               new ReadOnlyTxProcessorSource(DbProvider, BlockTree, SpecProvider, LimboLogs.Instance), TransactionPermissionContractVersions);

                TxPermissionFilterCache = new PermissionBasedTxFilter.Cache();
                PermissionBasedTxFilter = new PermissionBasedTxFilter(transactionPermissionContract, TxPermissionFilterCache, State, LimboLogs.Instance);

                return(new AuRaBlockProcessor(
                           SpecProvider,
                           Always.Valid,
                           new RewardCalculator(SpecProvider),
                           TxProcessor,
                           StateDb,
                           CodeDb,
                           State,
                           Storage,
                           TxPool,
                           ReceiptStorage,
                           LimboLogs.Instance,
                           BlockTree,
                           PermissionBasedTxFilter));
            }
 protected AuRaValidatorProcessorBase(AuRaParameters.Validator validator, ILogManager logManager)
 {
     if (validator == null)
     {
         throw new ArgumentNullException(nameof(validator));
     }
     _logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
 }
 public ReportingContractValidator(AuRaParameters.Validator validator,
                                   IStateProvider stateProvider,
                                   IAbiEncoder abiEncoder,
                                   ITransactionProcessor transactionProcessor,
                                   ILogManager logManager,
                                   long startBlockNumber) : base(validator, stateProvider, abiEncoder, transactionProcessor, logManager, startBlockNumber)
 {
 }
Esempio n. 11
0
        public void SetUp()
        {
            _validator            = GetValidator();
            _innerValidators      = new SortedList <long, IAuRaValidatorProcessor>();
            _factory              = Substitute.For <IAuRaAdditionalBlockProcessorFactory>();
            _logManager           = Substitute.For <ILogManager>();
            _transactionProcessor = Substitute.For <ITransactionProcessor>();

            _factory.CreateValidatorProcessor(default, default)
 protected AuRaValidatorProcessorExtension(AuRaParameters.Validator validator, IValidSealerStrategy validSealerStrategy, ILogManager logManager)
 {
     if (validator == null)
     {
         throw new ArgumentNullException(nameof(validator));
     }
     _validSealerStrategy = validSealerStrategy ?? throw new ArgumentNullException(nameof(validSealerStrategy));
     _logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
 }
Esempio n. 13
0
        public void SetUp()
        {
            _validator           = GetValidator();
            _innerValidators     = new SortedList <long, IAuRaValidatorProcessor>();
            _factory             = Substitute.For <IAuRaAdditionalBlockProcessorFactory>();
            _logManager          = Substitute.For <ILogManager>();
            _finalizationManager = Substitute.For <IBlockFinalizationManager>();
            _finalizationManager.LastFinalizedBlockLevel.Returns(-1);

            _factory.CreateValidatorProcessor(default, default)
 protected AuRaValidatorProcessorExtension(AuRaParameters.Validator validator, IValidSealerStrategy validSealerStrategy, IValidatorStore validatorStore, ILogManager logManager, long startBlockNumber)
 {
     if (validator == null)
     {
         throw new ArgumentNullException(nameof(validator));
     }
     ValidatorStore       = validatorStore ?? throw new ArgumentNullException(nameof(validatorStore));
     _validSealerStrategy = validSealerStrategy ?? throw new ArgumentNullException(nameof(validSealerStrategy));
     _logger         = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
     InitBlockNumber = startBlockNumber;
 }
Esempio n. 15
0
 public ReportingContractValidator(AuRaParameters.Validator validator,
                                   IDb stateDb,
                                   IStateProvider stateProvider,
                                   IAbiEncoder abiEncoder,
                                   ITransactionProcessor transactionProcessor,
                                   IBlockTree blockTree,
                                   IReceiptStorage receiptStorage,
                                   ILogManager logManager,
                                   long startBlockNumber)
     : base(validator, stateDb, stateProvider, abiEncoder, transactionProcessor, blockTree, receiptStorage, logManager, startBlockNumber)
 {
 }
Esempio n. 16
0
        public void SetUp()
        {
            _validator           = GetValidator(AuRaParameters.ValidatorType.List);
            _innerValidators     = new SortedList <long, IAuRaValidator>();
            _factory             = Substitute.For <IAuRaValidatorFactory>();
            _logManager          = LimboLogs.Instance;
            _finalizationManager = Substitute.For <IBlockFinalizationManager>();
            _blockTree           = Substitute.For <IBlockTree>();
            _validatorStore      = Substitute.For <IValidatorStore>();
            _finalizationManager.LastFinalizedBlockLevel.Returns(0);

            _factory.CreateValidatorProcessor(default, default, default)
        public IAuRaValidatorProcessorExtension CreateValidatorProcessor(AuRaParameters.Validator validator, long?startBlock = null)
        {
            var  auRaSealerValidator = new ValidSealerStrategy();
            long startBlockNumber    = startBlock ?? DefaultStartBlockNumber;

            return(validator.ValidatorType switch
            {
                AuRaParameters.ValidatorType.List => (IAuRaValidatorProcessorExtension) new ListBasedValidator(validator, auRaSealerValidator, _logManager),
                AuRaParameters.ValidatorType.Contract => new ContractBasedValidator(validator, _stateProvider, _abiEncoder, _transactionProcessor, _readOnlyReadOnlyTransactionProcessorSource, _blockTree, _receiptStorage, _validatorStore, auRaSealerValidator, _logManager, startBlockNumber),
                AuRaParameters.ValidatorType.ReportingContract => new ReportingContractBasedValidator(validator, _stateProvider, _abiEncoder, _transactionProcessor, _readOnlyReadOnlyTransactionProcessorSource, _blockTree, _receiptStorage, _validatorStore, auRaSealerValidator, _logManager, startBlockNumber),
                AuRaParameters.ValidatorType.Multi => new MultiValidator(validator, this, _blockTree, _validatorStore, _logManager),
                _ => throw new ArgumentOutOfRangeException()
            });
Esempio n. 18
0
        public ListBasedValidator(AuRaParameters.Validator validator, IValidSealerStrategy validSealerStrategy, IValidatorStore validatorStore, ILogManager logManager, long startBlockNumber, bool forSealing = false)
            : base(validSealerStrategy, validatorStore, logManager, startBlockNumber, forSealing)
        {
            if (validator == null)
            {
                throw new ArgumentNullException(nameof(validator));
            }

            Validators = validator.Addresses?.Length > 0
                ? validator.Addresses
                : throw new ArgumentException("Empty validator Addresses.", nameof(validator.Addresses));

            InitValidatorStore();
        }
Esempio n. 19
0
 public ReportingContractBasedValidator(AuRaParameters.Validator validator,
                                        IStateProvider stateProvider,
                                        IAbiEncoder abiEncoder,
                                        ITransactionProcessor transactionProcessor,
                                        IReadOnlyTransactionProcessorSource readOnlyTransactionProcessorSource,
                                        IBlockTree blockTree,
                                        IReceiptStorage receiptStorage,
                                        IValidatorStore validatorStore,
                                        IValidSealerStrategy validSealerStrategy,
                                        ILogManager logManager,
                                        long startBlockNumber)
     : base(validator, stateProvider, abiEncoder, transactionProcessor, readOnlyTransactionProcessorSource, blockTree, receiptStorage, validatorStore, validSealerStrategy, logManager, startBlockNumber)
 {
 }
Esempio n. 20
0
        public void PreProcess(Block block, ProcessingOptions options = ProcessingOptions.None)
        {
            bool isProducingBlock = options.IsProducingBlock();

            if (isProducingBlock && TryGetLastValidator(block.Number - 1, out var validatorInfo))
            {
                AuRaParameters.Validator validator = validatorInfo?.Value;
                if (CanChangeImmediately(validator.ValidatorType))
                {
                    SetCurrentValidator(block.Number, validator);
                }
            }

            _currentValidator?.PreProcess(block, options);
        }
Esempio n. 21
0
        public ListValidator(AuRaParameters.Validator validator)
        {
            if (validator == null)
            {
                throw new ArgumentNullException(nameof(validator));
            }
            if (validator.ValidatorType != AuRaParameters.ValidatorType.List)
            {
                throw new ArgumentException("Wrong validator type.", nameof(validator));
            }

            _validatorAddresses = validator.Addresses?.Length > 0
                ? validator.Addresses.ToHashSet()
                : throw new ArgumentException("Empty validator Addresses.", nameof(validator.Addresses));
        }
            protected override BlockProcessor CreateBlockProcessor()
            {
                var validator = new AuRaParameters.Validator()
                {
                    Addresses     = TestItem.Addresses,
                    ValidatorType = AuRaParameters.ValidatorType.List
                };

                var transactionPermissionContract = new VersionedTransactionPermissionContract(TxProcessor, new AbiEncoder(), _contractAddress, 1,
                                                                                               new ReadOnlyTransactionProcessorSource(DbProvider, BlockTree, SpecProvider, LimboLogs.Instance));

                TxPermissionFilterCache = new ITxPermissionFilter.Cache();
                TxPermissionFilter      = new TxPermissionFilter(transactionPermissionContract, TxPermissionFilterCache, State, LimboLogs.Instance);

                return(new AuRaBlockProcessor(SpecProvider, Always.Valid, new RewardCalculator(SpecProvider), TxProcessor, StateDb, CodeDb, State, Storage, TxPool, ReceiptStorage, LimboLogs.Instance, BlockTree, TxPermissionFilter));
            }
Esempio n. 23
0
        public MultiValidator(AuRaParameters.Validator validator, IAuRaAdditionalBlockProcessorFactory validatorFactory, ILogManager logManager)
        {
            if (validator == null)
            {
                throw new ArgumentNullException(nameof(validator));
            }
            if (validator.ValidatorType != AuRaParameters.ValidatorType.Multi)
            {
                throw new ArgumentException("Wrong validator type.", nameof(validator));
            }
            _validatorFactory = validatorFactory ?? throw new ArgumentNullException(nameof(validatorFactory));
            _logger           = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));

            _validators = validator.Validators?.Count > 0
                ? validator.Validators
                : throw new ArgumentException("Multi validator cannot be empty.", nameof(validator.Validators));
        }
 public ReportingContractBasedValidator(AuRaParameters.Validator validator,
                                        IStateProvider stateProvider,
                                        IAbiEncoder abiEncoder,
                                        ITransactionProcessor transactionProcessor,
                                        IReadOnlyTransactionProcessorSource readOnlyTransactionProcessorSource,
                                        IBlockTree blockTree,
                                        IReceiptFinder receiptFinder,
                                        IValidatorStore validatorStore,
                                        IValidSealerStrategy validSealerStrategy,
                                        IBlockFinalizationManager finalizationManager,
                                        BlockHeader parentHeader,
                                        ILogManager logManager,
                                        long startBlockNumber,
                                        bool forSealing = false)
     : base(validator, stateProvider, abiEncoder, transactionProcessor, readOnlyTransactionProcessorSource, blockTree, receiptFinder, validatorStore, validSealerStrategy, finalizationManager, parentHeader, logManager, startBlockNumber, forSealing)
 {
 }
Esempio n. 25
0
        public void returns_correct_validator_type(AuRaParameters.ValidatorType validatorType, Type expectedType)
        {
            var stateDb = Substitute.For <IDb>();

            stateDb[Arg.Any <byte[]>()].Returns((byte[])null);

            var factory = new AuRaValidatorFactory(Substitute.For <IStateProvider>(),
                                                   Substitute.For <IAbiEncoder>(),
                                                   Substitute.For <ITransactionProcessor>(),
                                                   Substitute.For <IReadOnlyTxProcessorSource>(),
                                                   Substitute.For <IBlockTree>(),
                                                   Substitute.For <IReceiptStorage>(),
                                                   Substitute.For <IValidatorStore>(),
                                                   Substitute.For <IBlockFinalizationManager>(),
                                                   Substitute.For <ITxSender>(),
                                                   Substitute.For <ITxPool>(),
                                                   new MiningConfig(),
                                                   LimboLogs.Instance,
                                                   Substitute.For <ISigner>(),
                                                   Substitute.For <ISpecProvider>(),
                                                   new ReportingContractBasedValidator.Cache(),
                                                   long.MaxValue);

            var validator = new AuRaParameters.Validator()
            {
                ValidatorType = validatorType,
                Addresses     = new[] { Address.Zero },
                Validators    = new Dictionary <long, AuRaParameters.Validator>()
                {
                    {
                        0, new AuRaParameters.Validator()
                        {
                            ValidatorType = AuRaParameters.ValidatorType.List, Addresses = new[] { Address.SystemUser }
                        }
                    }
                }
            };

            var result = factory.CreateValidatorProcessor(validator);

            result.Should().BeOfType(expectedType);
        }
Esempio n. 26
0
        public IAuRaValidatorProcessor CreateValidatorProcessor(AuRaParameters.Validator validator, long?startBlock = null)
        {
            long startBlockNumber = startBlock ?? DefaultStartBlockNumber;

            switch (validator.ValidatorType)
            {
            case AuRaParameters.ValidatorType.List:
                return(new ListValidator(validator));

            case AuRaParameters.ValidatorType.Contract:
                return(new ContractValidator(validator, _stateDb, _stateProvider, _abiEncoder, _transactionProcessor, _blockTree, _logManager, startBlockNumber));

            case AuRaParameters.ValidatorType.ReportingContract:
                return(new ReportingContractValidator(validator, _stateDb, _stateProvider, _abiEncoder, _transactionProcessor, _blockTree, _logManager, startBlockNumber));

            case AuRaParameters.ValidatorType.Multi:
                return(new MultiValidator(validator, this, _logManager));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Esempio n. 27
0
        public void SetUp()
        {
            _stateProvider = Substitute.For <IStateProvider>();
            _abiEncoder    = Substitute.For <IAbiEncoder>();
            _logManager    = Substitute.For <ILogManager>();
            _validator     = new AuRaParameters.Validator()
            {
                Addresses     = new[] { _contractAddress },
                ValidatorType = AuRaParameters.ValidatorType.Contract
            };

            _block = new Block(Prepare.A.BlockHeader().WithNumber(1).TestObject, new BlockBody());

            _transactionProcessor = Substitute.For <ITransactionProcessor>();

            _abiEncoder
            .Encode(AbiEncodingStyle.IncludeSignature, Arg.Is <AbiSignature>(s => s.Name == "getValidators"), Arg.Any <object[]>())
            .Returns(_getValidatorsData);

            _abiEncoder
            .Encode(AbiEncodingStyle.IncludeSignature, Arg.Is <AbiSignature>(s => s.Name == "finalizeChange"), Arg.Any <object[]>())
            .Returns(_finalizeChangeData);
        }
Esempio n. 28
0
        public ContractValidator(
            AuRaParameters.Validator validator,
            IStateProvider stateProvider,
            IAbiEncoder abiEncoder,
            ITransactionProcessor transactionProcessor,
            ILogManager logManager,
            long startBlockNumber)
        {
            if (validator == null)
            {
                throw new ArgumentNullException(nameof(validator));
            }
            if (validator.ValidatorType != Type)
            {
                throw new ArgumentException("Wrong validator type.", nameof(validator));
            }

            ContractAddress       = validator.Addresses?.FirstOrDefault() ?? throw new ArgumentException("Missing contract address for AuRa validator.", nameof(validator.Addresses));
            _stateProvider        = stateProvider ?? throw new ArgumentNullException(nameof(stateProvider));
            _transactionProcessor = transactionProcessor ?? throw new ArgumentNullException(nameof(transactionProcessor));
            _logger          = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
            AbiEncoder       = abiEncoder ?? throw new ArgumentNullException(nameof(abiEncoder));
            StartBlockNumber = startBlockNumber;
        }
Esempio n. 29
0
        public MultiValidator(AuRaParameters.Validator validator, IAuRaAdditionalBlockProcessorFactory validatorFactory, ILogManager logManager)
        {
            if (validator == null)
            {
                throw new ArgumentNullException(nameof(validator));
            }
            if (validatorFactory == null)
            {
                throw new ArgumentNullException(nameof(validatorFactory));
            }
            if (validator.ValidatorType != AuRaParameters.ValidatorType.Multi)
            {
                throw new ArgumentException("Wrong validator type.", nameof(validator));
            }

            _validators = validator.Validators?.Count > 0
                ? validator.Validators
                          .Select(kvp => new KeyValuePair <long, IAuRaValidatorProcessor>(kvp.Key,
                                                                                          validatorFactory.CreateValidatorProcessor(kvp.Value, Math.Max(1, kvp.Key)))) // we need to make init block at least 1 as 0 is genesis.
                          .ToArray()
                : throw new ArgumentException("Multi validator cannot be empty.", nameof(validator.Validators));

            _logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager));
        }
Esempio n. 30
0
        private void SetCurrentValidator(long finalizedAtBlockNumber, AuRaParameters.Validator validatorPrototype, BlockHeader parentHeader)
        {
            if (validatorPrototype != _currentValidatorPrototype)
            {
                (_currentValidator as IDisposable)?.Dispose();
                _currentValidator          = CreateValidator(finalizedAtBlockNumber, validatorPrototype, parentHeader);
                _currentValidatorPrototype = validatorPrototype;

                if (!_forSealing)
                {
                    if (_currentValidator.Validators != null)
                    {
                        _validatorStore.SetValidators(finalizedAtBlockNumber, _currentValidator.Validators);
                    }
                    else if (_blockTree.Head != null)
                    {
                        if (_logger.IsWarn)
                        {
                            _logger.Warn($"Validators not found in validator initialized at block {finalizedAtBlockNumber}, even after genesis block loaded.");
                        }
                    }
                }
            }
        }