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); }
public void returns_correct_validator_type(AuRaParameters.ValidatorType validatorType, Type expectedType) { IDb stateDb = Substitute.For <IDb>(); stateDb[Arg.Any <byte[]>()].Returns((byte[])null); AuRaValidatorFactory factory = new(Substitute.For <IAbiEncoder>(), Substitute.For <IStateProvider>(), Substitute.For <ITransactionProcessor>(), Substitute.For <IBlockTree>(), Substitute.For <IReadOnlyTxProcessorSource>(), Substitute.For <IReceiptStorage>(), Substitute.For <IValidatorStore>(), Substitute.For <IAuRaBlockFinalizationManager>(), Substitute.For <ITxSender>(), Substitute.For <ITxPool>(), new MiningConfig(), LimboLogs.Instance, Substitute.For <ISigner>(), Substitute.For <ISpecProvider>(), Substitute.For <IGasPriceOracle>(), new ReportingContractBasedValidator.Cache(), long.MaxValue); AuRaParameters.Validator validator = new() { ValidatorType = validatorType, Addresses = new[] { Address.Zero }, Validators = new Dictionary <long, AuRaParameters.Validator>() { { 0, new AuRaParameters.Validator() { ValidatorType = AuRaParameters.ValidatorType.List, Addresses = new[] { Address.SystemUser } } } } }; IAuRaValidator result = factory.CreateValidatorProcessor(validator); result.Should().BeOfType(expectedType); } }
private bool CanChangeImmediately(AuRaParameters.ValidatorType validatorType) => validatorType switch {
public static bool CanChangeImmediately(this AuRaParameters.ValidatorType validatorType) => validatorType switch {
private void LoadEngine(ChainSpecJson chainSpecJson, ChainSpec chainSpec) { AuRaParameters.Validator LoadValidator(ChainSpecJson.AuRaValidatorJson validatorJson, int level = 0) { AuRaParameters.ValidatorType validatorType = validatorJson.GetValidatorType(); AuRaParameters.Validator validator = new() { ValidatorType = validatorType }; switch (validator.ValidatorType) { case AuRaParameters.ValidatorType.List: validator.Addresses = validatorJson.List; break; case AuRaParameters.ValidatorType.Contract: validator.Addresses = new[] { validatorJson.SafeContract }; break; case AuRaParameters.ValidatorType.ReportingContract: validator.Addresses = new[] { validatorJson.Contract }; break; case AuRaParameters.ValidatorType.Multi: if (level != 0) { throw new ArgumentException("AuRa multi validator cannot be inner validator."); } validator.Validators = validatorJson.Multi .ToDictionary(kvp => kvp.Key, kvp => LoadValidator(kvp.Value, level + 1)) .ToImmutableSortedDictionary(); break; default: throw new ArgumentOutOfRangeException(); } return(validator); } if (chainSpecJson.Engine?.AuthorityRound != null) { chainSpec.SealEngineType = SealEngineType.AuRa; chainSpec.AuRa = new AuRaParameters { MaximumUncleCount = chainSpecJson.Engine.AuthorityRound.MaximumUncleCount, MaximumUncleCountTransition = chainSpecJson.Engine.AuthorityRound.MaximumUncleCountTransition, StepDuration = chainSpecJson.Engine.AuthorityRound.StepDuration, BlockReward = chainSpecJson.Engine.AuthorityRound.BlockReward, BlockRewardContractAddress = chainSpecJson.Engine.AuthorityRound.BlockRewardContractAddress, BlockRewardContractTransition = chainSpecJson.Engine.AuthorityRound.BlockRewardContractTransition, BlockRewardContractTransitions = chainSpecJson.Engine.AuthorityRound.BlockRewardContractTransitions, ValidateScoreTransition = chainSpecJson.Engine.AuthorityRound.ValidateScoreTransition, ValidateStepTransition = chainSpecJson.Engine.AuthorityRound.ValidateStepTransition, Validators = LoadValidator(chainSpecJson.Engine.AuthorityRound.Validator), RandomnessContractAddress = chainSpecJson.Engine.AuthorityRound.RandomnessContractAddress, BlockGasLimitContractTransitions = chainSpecJson.Engine.AuthorityRound.BlockGasLimitContractTransitions, TwoThirdsMajorityTransition = chainSpecJson.Engine.AuthorityRound.TwoThirdsMajorityTransition ?? AuRaParameters.TransitionDisabled, PosdaoTransition = chainSpecJson.Engine.AuthorityRound.PosdaoTransition ?? AuRaParameters.TransitionDisabled, }; } else if (chainSpecJson.Engine?.Clique != null) { chainSpec.SealEngineType = SealEngineType.Clique; chainSpec.Clique = new CliqueParameters { Epoch = chainSpecJson.Engine.Clique.Epoch, Period = chainSpecJson.Engine.Clique.Period, Reward = chainSpecJson.Engine.Clique.BlockReward ?? UInt256.Zero }; } else if (chainSpecJson.Engine?.Ethash != null) { chainSpec.SealEngineType = SealEngineType.Ethash; chainSpec.Ethash = new EthashParameters { MinimumDifficulty = chainSpecJson.Engine.Ethash.MinimumDifficulty ?? 0L, DifficultyBoundDivisor = chainSpecJson.Engine.Ethash.DifficultyBoundDivisor ?? 0x0800L, DurationLimit = chainSpecJson.Engine.Ethash.DurationLimit ?? 13L, HomesteadTransition = chainSpecJson.Engine.Ethash.HomesteadTransition ?? 0, DaoHardforkTransition = chainSpecJson.Engine.Ethash.DaoHardforkTransition, DaoHardforkBeneficiary = chainSpecJson.Engine.Ethash.DaoHardforkBeneficiary, DaoHardforkAccounts = chainSpecJson.Engine.Ethash.DaoHardforkAccounts ?? Array.Empty <Address>(), Eip100bTransition = chainSpecJson.Engine.Ethash.Eip100bTransition ?? 0L, FixedDifficulty = chainSpecJson.Engine.Ethash.FixedDifficulty, BlockRewards = new Dictionary <long, UInt256>() }; foreach (KeyValuePair <string, UInt256> reward in chainSpecJson.Engine.Ethash.BlockReward) { chainSpec.Ethash.BlockRewards.Add(LongConverter.FromString(reward.Key), reward.Value); } chainSpec.Ethash.DifficultyBombDelays = new Dictionary <long, long>(); if (chainSpecJson.Engine.Ethash.DifficultyBombDelays != null) { foreach (KeyValuePair <string, long> reward in chainSpecJson.Engine.Ethash.DifficultyBombDelays) { chainSpec.Ethash.DifficultyBombDelays.Add(LongConverter.FromString(reward.Key), reward.Value); } } } else if (chainSpecJson.Engine?.NethDev != null) { chainSpec.SealEngineType = SealEngineType.NethDev; } else { throw new NotSupportedException("unknown seal engine in chainspec"); } }