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);
        }
Пример #2
0
        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);
        }
    }
Пример #3
0
 private bool CanChangeImmediately(AuRaParameters.ValidatorType validatorType) =>
 validatorType switch
 {
Пример #4
0
 public static bool CanChangeImmediately(this AuRaParameters.ValidatorType validatorType) =>
 validatorType switch
 {
Пример #5
0
        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");
            }
        }