コード例 #1
0
 public AuRaValidatorFactory(IStateProvider stateProvider,
                             IAbiEncoder abiEncoder,
                             ITransactionProcessor transactionProcessor,
                             IReadOnlyTransactionProcessorSource readOnlyTransactionProcessorSource,
                             IBlockTree blockTree,
                             IReceiptFinder receiptFinder,
                             IValidatorStore validatorStore,
                             IBlockFinalizationManager finalizationManager,
                             ITxSender txSender,
                             ITxPool txPool,
                             ILogManager logManager,
                             ISigner signer,
                             ReportingContractBasedValidator.Cache reportingValidatorCache,
                             long posdaoTransition,
                             bool forSealing = false)
 {
     _stateProvider        = stateProvider;
     _abiEncoder           = abiEncoder;
     _transactionProcessor = transactionProcessor;
     _readOnlyTransactionProcessorSource = readOnlyTransactionProcessorSource;
     _blockTree           = blockTree;
     _receiptFinder       = receiptFinder;
     _validatorStore      = validatorStore;
     _finalizationManager = finalizationManager;
     _txSender            = txSender;
     _txPool     = txPool;
     _logManager = logManager;
     _signer     = signer;
     _reportingValidatorCache = reportingValidatorCache;
     _posdaoTransition        = posdaoTransition;
     _forSealing = forSealing;
 }
コード例 #2
0
            public TestContext(bool forSealing, ReportingContractBasedValidator.Cache cache = null, Address[] initialValidators = null)
            {
                BlockHeader        parentHeader      = Build.A.BlockHeader.TestObject;
                IValidatorContract validatorContract = Substitute.For <IValidatorContract>();

                Address[] validators = initialValidators ?? new[] { MaliciousMinerAddress, NodeAddress };
                validatorContract.GetValidators(parentHeader).Returns(validators);

                ContractBasedValidator = new ContractBasedValidator(
                    validatorContract,
                    Substitute.For <IBlockTree>(),
                    Substitute.For <IReceiptFinder>(),
                    Substitute.For <IValidatorStore>(),
                    Substitute.For <IValidSealerStrategy>(),
                    Substitute.For <IAuRaBlockFinalizationManager>(),
                    parentHeader,
                    LimboLogs.Instance,
                    0,
                    PosdaoTransition,
                    forSealing);

                ContractBasedValidator.Validators ??= validators;

                ReportingValidatorContract = Substitute.For <IReportingValidatorContract>();
                ReportingValidatorContract.NodeAddress.Returns(NodeAddress);

                TxSender = Substitute.For <ITxSender>();
                ITxPool        txPool        = Substitute.For <ITxPool>();
                IStateProvider stateProvider = Substitute.For <IStateProvider>();
                ISpecProvider  specProvider  = Substitute.For <ISpecProvider>();

                stateProvider.GetNonce(ReportingValidatorContract.NodeAddress).Returns(UInt256.One);

                Validator = new ReportingContractBasedValidator(
                    ContractBasedValidator,
                    ReportingValidatorContract,
                    PosdaoTransition,
                    TxSender,
                    txPool,
                    new MiningConfig(),
                    stateProvider,
                    cache ?? new ReportingContractBasedValidator.Cache(),
                    specProvider,
                    Substitute.For <IGasPriceOracle>(),
                    LimboLogs.Instance);
            }
コード例 #3
0
        public void Resend_malicious_transactions([Values(0, 5, 15)] int validatorsToReport, [Values(1, 4)] long blockNumber)
        {
            var cache       = new ReportingContractBasedValidator.Cache();
            var proof       = TestItem.KeccakA.Bytes;
            var transaction = Build.A.Transaction.TestObject;
            var context     = new TestContext(false, cache);

            for (ulong i = 5; i < 20; i++)
            {
                context.ReportingValidatorContract.ReportMalicious(MaliciousMinerAddress, i, proof).Returns(transaction);
                context.Validator.ReportMalicious(MaliciousMinerAddress, (long)i, proof, IReportingValidator.MaliciousCause.DuplicateStep);
            }

            context = new TestContext(false, cache);
            for (ulong i = 5; i < 20; i++)
            {
                context.ReportingValidatorContract.ReportMalicious(MaliciousMinerAddress, i, proof).Returns(transaction);
            }

            var block = Build.A.Block.WithNumber(blockNumber).TestObject;

            context.ContractBasedValidator.ValidatorContract
            .ShouldValidatorReport(NodeAddress, MaliciousMinerAddress, Arg.Any <UInt256>(), Arg.Is <BlockHeader>(h => h.Number == blockNumber - 1))
            .Returns(0 < validatorsToReport, Enumerable.Range(1, 15).Select(i => i < validatorsToReport).ToArray());

            context.ContractBasedValidator.BlockTree.FindHeader(Arg.Any <Keccak>(), BlockTreeLookupOptions.None)
            .Returns(Build.A.BlockHeader.WithNumber(blockNumber - 1).TestObject);

            bool isPosDao = blockNumber >= context.PosdaoTransition;

            // resend transactions
            context.Validator.OnBlockProcessingEnd(block, Array.Empty <TxReceipt>());

            // not resending on next block!
            var childBlock = Build.A.Block.WithParent(block).TestObject;

            context.Validator.OnBlockProcessingEnd(childBlock, Array.Empty <TxReceipt>());

            context.TxSender.Received(isPosDao ? Math.Min(ReportingContractBasedValidator.MaxQueuedReports, validatorsToReport) : 0)
            .SendTransaction(Arg.Any <Transaction>(), TxHandlingOptions.ManagedNonce | TxHandlingOptions.PersistentBroadcast);
        }