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); }
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() });
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)); }
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)); }
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) { }
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)); }
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; }
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) { }
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() });
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(); }
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) { }
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); }
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)); }
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) { }
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); }
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(); } }
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); }
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; }
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)); }
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."); } } } } }