public CompareTxByPermissionOnSpecifiedBlock( IContractDataStore <Address> sendersWhitelist, IDictionaryContractDataStore <TxPriorityContract.Destination> priorities, BlockHeader blockHeader) : base(sendersWhitelist, priorities) { BlockHeader = blockHeader; }
private static ITxFilter CreateBaseAuRaTxFilter( IMiningConfig miningConfig, AuRaNethermindApi api, IReadOnlyTxProcessorSource readOnlyTxProcessorSource, IDictionaryContractDataStore <TxPriorityContract.Destination>?minGasPricesContractDataStore, ISpecProvider specProvider) { IMinGasPriceTxFilter minGasPriceTxFilter = CreateStandardMinGasPriceTxFilter(miningConfig, specProvider); ITxFilter gasPriceTxFilter = minGasPriceTxFilter; if (minGasPricesContractDataStore != null) { gasPriceTxFilter = new MinGasPriceContractTxFilter(minGasPriceTxFilter, minGasPricesContractDataStore); } Address?registrar = api.ChainSpec?.Parameters.Registrar; if (registrar != null) { RegisterContract registerContract = new(api.AbiEncoder, registrar, readOnlyTxProcessorSource); CertifierContract certifierContract = new(api.AbiEncoder, registerContract, readOnlyTxProcessorSource); return(new TxCertifierFilter(certifierContract, gasPriceTxFilter, specProvider, api.LogManager)); } return(gasPriceTxFilter); }
public PermissionTxPoolOrderingStrategy( IContractDataStore <Address> sendersWhitelist, // expected HashSet based IDictionaryContractDataStore <TxPriorityContract.Destination> priorities) // expected SortedList based { _sendersWhitelist = sendersWhitelist ?? throw new ArgumentNullException(nameof(sendersWhitelist)); _priorities = priorities ?? throw new ArgumentNullException(nameof(priorities)); }
public CompareTxByPermissionOnHead( IContractDataStore <Address> sendersWhitelist, // expected HashSet based IDictionaryContractDataStore <TxPriorityContract.Destination> priorities, // expected SortedList based IBlockTree blockTree) : base(sendersWhitelist, priorities) { _blockTree = blockTree ?? throw new ArgumentNullException(nameof(blockTree)); }
public TxPriorityTxSource( ITxPool transactionPool, IStateReader stateReader, ILogManager logManager, ITxFilter minGasPriceFilter, IContractDataStore <Address> sendersWhitelist, // expected HashSet based IDictionaryContractDataStore <TxPriorityContract.Destination> priorities) // expected SortedList based : base(transactionPool, stateReader, logManager, minGasPriceFilter) { _sendersWhitelist = sendersWhitelist ?? throw new ArgumentNullException(nameof(sendersWhitelist)); _priorities = priorities ?? throw new ArgumentNullException(nameof(priorities)); }
public static ITxFilter CreateAuRaTxFilter( IMiningConfig miningConfig, AuRaNethermindApi api, IReadOnlyTxProcessorSource readOnlyTxProcessorSource, IDictionaryContractDataStore <TxPriorityContract.Destination>?minGasPricesContractDataStore) { ITxFilter baseAuRaTxFilter = CreateBaseAuRaTxFilter(miningConfig, api, readOnlyTxProcessorSource, minGasPricesContractDataStore); ITxFilter?txPermissionFilter = CreateTxPermissionFilter(api, readOnlyTxProcessorSource); return(txPermissionFilter != null ? new CompositeTxFilter(baseAuRaTxFilter, txPermissionFilter) : baseAuRaTxFilter); }
private static void SetPriority( IDictionaryContractDataStore <TxPriorityContract.Destination> priorities, BlockHeader blockHeader, Address target, byte[] prioritizedFnSignature, UInt256 value) { priorities.TryGetValue(blockHeader, Arg.Is <TxPriorityContract.Destination>(d => d.Target == target && Bytes.AreEqual(d.FnSignature, prioritizedFnSignature)), out Arg.Any <TxPriorityContract.Destination>()) .Returns(x => { x[2] = new TxPriorityContract.Destination(target, prioritizedFnSignature, value); return(true); }); }
public bool is_allowed_returns_correct(Address address, ulong gasLimit) { ITxFilter minGasPriceFilter = new MinGasPriceTxFilter(UInt256.One); IDictionaryContractDataStore <TxPriorityContract.Destination> dictionaryContractDataStore = Substitute.For <IDictionaryContractDataStore <TxPriorityContract.Destination> >(); dictionaryContractDataStore.TryGetValue( Arg.Any <BlockHeader>(), Arg.Is <TxPriorityContract.Destination>(d => d.Target == TestItem.AddressA), out Arg.Any <TxPriorityContract.Destination>()) .Returns(x => { x[2] = new TxPriorityContract.Destination(TestItem.AddressA, Array.Empty <byte>(), 5); return(true); }); var txFilter = new MinGasPriceContractTxFilter(minGasPriceFilter, dictionaryContractDataStore); var tx = Build.A.Transaction.WithTo(address).WithGasPrice(gasLimit).TestObject; return(txFilter.IsAllowed(tx, Build.A.BlockHeader.TestObject)); }
public void order_is_correct(Func <IEnumerable <Transaction>, IEnumerable <Transaction> > transactionSelect) { IContractDataStore <Address> sendersWhitelist = Substitute.For <IContractDataStore <Address> >(); IDictionaryContractDataStore <TxPriorityContract.Destination> priorities = Substitute.For <IDictionaryContractDataStore <TxPriorityContract.Destination> >(); BlockHeader blockHeader = Build.A.BlockHeader.TestObject; byte[] p5Signature = { 0, 1, 2, 3 }; byte[] p6Signature = { 0, 0, 0, 2 }; byte[] p0signature = { 0, 0, 0, 1 }; sendersWhitelist.GetItemsFromContractAtBlock(blockHeader).Returns(WhitelistedSenders); SetPriority(priorities, blockHeader, TestItem.AddressB, p5Signature, 5); SetPriority(priorities, blockHeader, TestItem.AddressB, p6Signature, 6); Transaction A_B_0_10_10_P6 = Build.A.NamedTransaction(nameof(A_B_0_10_10_P6)) .WithSenderAddress(TestItem.AddressA) .To(TestItem.AddressB) .WithNonce(0) .WithGasPrice(10) .WithGasLimit(10) .WithData(p6Signature) .TestObject; Transaction A_B_0_10_20_P6 = Build.A.NamedTransaction(nameof(A_B_0_10_20_P6)) .WithSenderAddress(TestItem.AddressA) .To(TestItem.AddressB) .WithNonce(0) .WithGasPrice(10) .WithGasLimit(20) .WithData(p6Signature) .TestObject; Transaction A_B_0_10_5_P6 = Build.A.NamedTransaction(nameof(A_B_0_10_5_P6)) .WithSenderAddress(TestItem.AddressA) .To(TestItem.AddressB) .WithNonce(0) .WithGasPrice(10) .WithGasLimit(5) .WithData(p6Signature) .TestObject; Transaction A_B_0_10_10_P5 = Build.A.NamedTransaction(nameof(A_B_0_10_10_P5)) .WithSenderAddress(TestItem.AddressA) .To(TestItem.AddressB) .WithNonce(0) .WithGasPrice(10) .WithGasLimit(10) .WithData(p5Signature) .TestObject; Transaction A_B_0_20_10_P5 = Build.A.NamedTransaction(nameof(A_B_0_20_10_P5)) .WithSenderAddress(TestItem.AddressA) .To(TestItem.AddressB) .WithNonce(0) .WithGasPrice(20) .WithGasLimit(10) .WithData(p5Signature) .TestObject; Transaction A_B_1_20_10_P5 = Build.A.NamedTransaction(nameof(A_B_1_20_10_P5)) .WithSenderAddress(TestItem.AddressA) .To(TestItem.AddressB) .WithNonce(1) .WithGasPrice(20) .WithGasLimit(10) .WithData(p5Signature) .TestObject; Transaction A_B_1_200_10_P0 = Build.A.NamedTransaction(nameof(A_B_1_200_10_P0)) .WithSenderAddress(TestItem.AddressA) .To(TestItem.AddressB) .WithNonce(1) .WithGasPrice(200) .WithGasLimit(10) .WithData(p0signature) .TestObject; Transaction A_A_0_100_100_P0 = Build.A.NamedTransaction(nameof(A_A_0_100_100_P0)) .WithSenderAddress(TestItem.AddressA) .To(TestItem.AddressA) .WithNonce(0) .WithGasPrice(100) .WithGasLimit(100) .WithData(p5Signature) .TestObject; Transaction A_A_1_100_100_P0 = Build.A.NamedTransaction(nameof(A_A_1_100_100_P0)) .WithSenderAddress(TestItem.AddressA) .To(TestItem.AddressA) .WithNonce(1) .WithGasPrice(100) .WithGasLimit(100) .WithData(p5Signature) .TestObject; Transaction A_A_1_1000_1000_P0 = Build.A.NamedTransaction(nameof(A_A_1_1000_1000_P0)) .WithSenderAddress(TestItem.AddressA) .To(TestItem.AddressA) .WithNonce(1) .WithGasPrice(1000) .WithGasLimit(1000) .WithData(p5Signature) .TestObject; Transaction A_A_2_1000_1_P0 = Build.A.NamedTransaction(nameof(A_A_2_1000_1_P0)) .WithSenderAddress(TestItem.AddressA) .To(TestItem.AddressA) .WithNonce(2) .WithGasPrice(1000) .WithGasLimit(1) .WithData(p5Signature) .TestObject; Transaction B_B_2_1000_1_P6 = Build.A.NamedTransaction(nameof(B_B_2_1000_1_P6)) .WithSenderAddress(TestItem.AddressB) .To(TestItem.AddressB) .WithNonce(2) .WithGasPrice(1000) .WithGasLimit(1) .WithData(p6Signature) .TestObject; Transaction B_B_2_15_1_P5 = Build.A.NamedTransaction(nameof(B_B_2_15_1_P5)) .WithSenderAddress(TestItem.AddressB) .To(TestItem.AddressB) .WithNonce(2) .WithGasPrice(15) .WithGasLimit(1) .WithData(p5Signature) .TestObject; Transaction B_B_3_15_1_P6 = Build.A.NamedTransaction(nameof(B_B_3_15_1_P6)) .WithSenderAddress(TestItem.AddressB) .To(TestItem.AddressB) .WithNonce(3) .WithGasPrice(15) .WithGasLimit(1) .WithData(p6Signature) .TestObject; Transaction C_B_3_10_1_P6_W = Build.A.NamedTransaction(nameof(C_B_3_10_1_P6_W)) .WithSenderAddress(TestItem.AddressC) .To(TestItem.AddressB) .WithNonce(3) .WithGasPrice(10) .WithGasLimit(1) .WithData(p6Signature) .TestObject; Transaction C_B_4_10_1_P0_W = Build.A.NamedTransaction(nameof(C_B_4_10_1_P0_W)) .WithSenderAddress(TestItem.AddressC) .To(TestItem.AddressB) .WithNonce(4) .WithGasPrice(10) .WithGasLimit(1) .TestObject; Transaction D_B_4_100_1_P0_W = Build.A.NamedTransaction(nameof(D_B_4_100_1_P0_W)) .WithSenderAddress(TestItem.AddressD) .To(TestItem.AddressB) .WithNonce(4) .WithGasPrice(100) .WithGasLimit(1) .TestObject; IEnumerable <Transaction> transactions = new [] { A_B_1_200_10_P0, A_A_2_1000_1_P0, A_A_1_1000_1000_P0, C_B_4_10_1_P0_W, A_A_1_100_100_P0, A_A_0_100_100_P0, A_B_0_10_10_P5, D_B_4_100_1_P0_W, C_B_3_10_1_P6_W, A_B_0_10_10_P6, A_B_0_20_10_P5, B_B_2_15_1_P5, A_B_0_10_5_P6, B_B_3_15_1_P6, A_B_0_10_20_P6, A_B_1_20_10_P5, B_B_2_1000_1_P6 }; IEnumerable <Transaction> expectation = new [] { C_B_3_10_1_P6_W, D_B_4_100_1_P0_W, C_B_4_10_1_P0_W, B_B_2_1000_1_P6, A_B_0_10_5_P6, A_B_0_10_10_P6, A_B_0_10_20_P6, A_B_0_20_10_P5, B_B_2_15_1_P5, B_B_3_15_1_P6, A_B_0_10_10_P5, A_A_0_100_100_P0, A_B_1_20_10_P5, A_A_1_1000_1000_P0, A_B_1_200_10_P0, A_A_1_100_100_P0, A_A_2_1000_1_P0 }; transactions = transactionSelect?.Invoke(transactions) ?? transactions; expectation = transactionSelect?.Invoke(expectation) ?? expectation; IBlockTree blockTree = Substitute.For <IBlockTree>(); Block block = Build.A.Block.WithNumber(0).TestObject; blockTree.Head.Returns(block); ISpecProvider specProvider = Substitute.For <ISpecProvider>(); specProvider.GetSpec(Arg.Any <long>()).Returns(new ReleaseSpec() { IsEip1559Enabled = false }); TransactionComparerProvider transactionComparerProvider = new(specProvider, blockTree); IComparer <Transaction> defaultComparer = transactionComparerProvider.GetDefaultComparer(); IComparer <Transaction> comparer = new CompareTxByPriorityOnSpecifiedBlock(sendersWhitelist, priorities, blockHeader) .ThenBy(defaultComparer); Dictionary <Address?, Transaction[]> txBySender = transactions.GroupBy(t => t.SenderAddress) .ToDictionary( g => g.Key, g => g.OrderBy(t => t, // to simulate order coming from TxPool comparer.GetPoolUniqueTxComparerByNonce()).ToArray()); Transaction[] orderedTransactions = TxPoolTxSource.Order(txBySender, comparer).ToArray(); orderedTransactions.Should().BeEquivalentTo(expectation, o => o.WithStrictOrdering()); }
public MinGasPriceContractTxFilter(ITxFilter minGasPriceFilter, IDictionaryContractDataStore <TxPriorityContract.Destination> minGasPrices) { _minGasPriceFilter = minGasPriceFilter; _minGasPrices = minGasPrices ?? throw new ArgumentNullException(nameof(minGasPrices)); }
public CompareTxByPriorityBase(IContractDataStore <Address> sendersWhitelist, // expected HashSet based IDictionaryContractDataStore <TxPriorityContract.Destination> priorities) // expected SortedList based) { _sendersWhitelist = sendersWhitelist ?? throw new ArgumentNullException(nameof(sendersWhitelist)); _priorities = priorities ?? throw new ArgumentNullException(nameof(priorities)); }