Skip to content

Commit 403e729

Browse files
committed
allowing tx sender recovery on JSON RPC requests asking for transactions
1 parent 793d9dc commit 403e729

File tree

10 files changed

+60
-19
lines changed

10 files changed

+60
-19
lines changed

src/Nethermind/Nethermind.DataMarketplace.Infrastructure/NdmModule.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ public static IServices Init(RequiredServices services)
7777
filterStore,
7878
filterManager,
7979
services.Wallet,
80-
state.TransactionProcessor);
80+
state.TransactionProcessor,
81+
services.Ecdsa);
8182
var dataHeaderRlpDecoder = new DataHeaderDecoder();
8283
var encoder = new AbiEncoder();
8384
var depositService = new DepositService(blockchainBridge, encoder, services.Wallet, config,
@@ -167,7 +168,7 @@ public class RequiredServices
167168
public IReceiptStorage ReceiptStorage { get; }
168169
public IWallet Wallet { get; }
169170
public ITimestamp Timestamp { get; }
170-
public IEcdsa Ecdsa { get; }
171+
public IEthereumEcdsa Ecdsa { get; }
171172
public IKeyStore KeyStore { get; }
172173
public IRpcModuleProvider RpcModuleProvider { get; }
173174
public IJsonSerializer JsonSerializer { get; }
@@ -183,7 +184,7 @@ public RequiredServices(IConfigProvider configProvider, IConfigManager configMan
183184
string baseDbPath, IDbProvider rocksProvider, IMongoProvider mongoProvider, ILogManager logManager,
184185
IBlockProcessor blockProcessor, IBlockTree blockTree, ITxPool transactionPool,
185186
ITxPoolInfoProvider transactionPoolInfoProvider, ISpecProvider specProvider,
186-
IReceiptStorage receiptStorage, IWallet wallet, ITimestamp timestamp, IEcdsa ecdsa,
187+
IReceiptStorage receiptStorage, IWallet wallet, ITimestamp timestamp, IEthereumEcdsa ecdsa,
187188
IKeyStore keyStore, IRpcModuleProvider rpcModuleProvider, IJsonSerializer jsonSerializer,
188189
ICryptoRandom cryptoRandom, IEnode enode, INdmConsumerChannelManager ndmConsumerChannelManager,
189190
INdmDataPublisher ndmDataPublisher, IGrpcService grpcService, EthRequestService ethRequestService,

src/Nethermind/Nethermind.DataMarketplace.Initializers/INdmInitializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public interface INdmInitializer
4242
Task<INdmCapabilityConnector> InitAsync(IConfigProvider configProvider, IDbProvider dbProvider,
4343
string baseDbPath, IBlockProcessor blockProcessor, IBlockTree blockTree, ITxPool txPool,
4444
ITxPoolInfoProvider txPoolInfoProvider, ISpecProvider specProvider, IReceiptStorage receiptStorage,
45-
IWallet wallet, ITimestamp timestamp, IEcdsa ecdsa, IRpcModuleProvider rpcModuleProvider,
45+
IWallet wallet, ITimestamp timestamp, IEthereumEcdsa ecdsa, IRpcModuleProvider rpcModuleProvider,
4646
IKeyStore keyStore, IJsonSerializer jsonSerializer, ICryptoRandom cryptoRandom, IEnode enode,
4747
INdmConsumerChannelManager consumerChannelManager, INdmDataPublisher dataPublisher,
4848
IGrpcService grpcService, INodeStatsManager nodeStatsManager, IProtocolsManager protocolsManager,

src/Nethermind/Nethermind.DataMarketplace.Initializers/NdmInitializer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public class NdmInitializer : INdmInitializer
5555
public virtual async Task<INdmCapabilityConnector> InitAsync(IConfigProvider configProvider,
5656
IDbProvider dbProvider, string baseDbPath, IBlockProcessor blockProcessor, IBlockTree blockTree,
5757
ITxPool txPool, ITxPoolInfoProvider txPoolInfoProvider, ISpecProvider specProvider,
58-
IReceiptStorage receiptStorage, IWallet wallet, ITimestamp timestamp, IEcdsa ecdsa,
58+
IReceiptStorage receiptStorage, IWallet wallet, ITimestamp timestamp, IEthereumEcdsa ecdsa,
5959
IRpcModuleProvider rpcModuleProvider, IKeyStore keyStore, IJsonSerializer jsonSerializer,
6060
ICryptoRandom cryptoRandom, IEnode enode, INdmConsumerChannelManager consumerChannelManager,
6161
INdmDataPublisher dataPublisher, IGrpcService grpcService, INodeStatsManager nodeStatsManager,
@@ -88,7 +88,7 @@ public virtual async Task<INdmCapabilityConnector> InitAsync(IConfigProvider con
8888
Address consumerAddress, Address providerAddress)> PreInitAsync(
8989
IConfigProvider configProvider, IDbProvider dbProvider, string baseDbPath, IBlockProcessor blockProcessor,
9090
IBlockTree blockTree, ITxPool txPool, ITxPoolInfoProvider txPoolInfoProvider, ISpecProvider specProvider,
91-
IReceiptStorage receiptStorage, IWallet wallet, ITimestamp timestamp, IEcdsa ecdsa,
91+
IReceiptStorage receiptStorage, IWallet wallet, ITimestamp timestamp, IEthereumEcdsa ecdsa,
9292
IRpcModuleProvider rpcModuleProvider, IKeyStore keyStore, IJsonSerializer jsonSerializer,
9393
ICryptoRandom cryptoRandom, IEnode enode, INdmConsumerChannelManager consumerChannelManager,
9494
INdmDataPublisher dataPublisher, IGrpcService grpcService, bool enableUnsecuredDevWallet,

src/Nethermind/Nethermind.DataMarketplace.Test/ContractInteractionTest.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,15 @@ public BlockchainBridge(TransactionProcessor processor, IReleaseSpec spec)
184184
public BlockHeader BestSuggested { get; }
185185
public long BestKnown { get; }
186186
public bool IsSyncing { get; }
187+
public void RecoverTxSenders(Block block)
188+
{
189+
throw new NotImplementedException();
190+
}
191+
192+
public void RecoverTxSender(Transaction tx, long blockNumber)
193+
{
194+
throw new NotImplementedException();
195+
}
187196

188197
public Block FindBlock(Keccak blockHash, bool mainChainOnly)
189198
{

src/Nethermind/Nethermind.Facade/BlockchainBridge.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class BlockchainBridge : IBlockchainBridge
4848
private readonly IReceiptStorage _receiptStorage;
4949
private readonly IStorageProvider _storageProvider;
5050
private readonly ITransactionProcessor _transactionProcessor;
51+
private readonly IEthereumEcdsa _ecdsa;
5152
private readonly ITxPoolInfoProvider _transactionPoolInfoProvider;
5253

5354
public BlockchainBridge(
@@ -61,7 +62,8 @@ public BlockchainBridge(
6162
IFilterStore filterStore,
6263
IFilterManager filterManager,
6364
IWallet wallet,
64-
ITransactionProcessor transactionProcessor)
65+
ITransactionProcessor transactionProcessor,
66+
IEthereumEcdsa ecdsa)
6567
{
6668
_stateReader = stateReader ?? throw new ArgumentNullException(nameof(stateReader));
6769
_stateProvider = stateProvider ?? throw new ArgumentNullException(nameof(stateProvider));
@@ -74,6 +76,7 @@ public BlockchainBridge(
7476
_filterManager = filterManager ?? throw new ArgumentException(nameof(filterManager));
7577
_wallet = wallet ?? throw new ArgumentException(nameof(wallet));
7678
_transactionProcessor = transactionProcessor ?? throw new ArgumentException(nameof(transactionProcessor));
79+
_ecdsa = ecdsa ?? throw new ArgumentNullException(nameof(ecdsa));
7780
}
7881

7982
public IReadOnlyCollection<Address> GetWalletAccounts()
@@ -267,6 +270,19 @@ public int NewPendingTransactionFilter()
267270
public FilterLog[] GetLogFilterChanges(int filterId) => _filterManager.PollLogs(filterId);
268271
public Keccak[] GetBlockFilterChanges(int filterId) => _filterManager.PollBlockHashes(filterId);
269272

273+
public void RecoverTxSenders(Block block)
274+
{
275+
for (int i = 0; i < block.Transactions.Length; i++)
276+
{
277+
RecoverTxSender(block.Transactions[i], block.Number);
278+
}
279+
}
280+
281+
public void RecoverTxSender(Transaction tx, long blockNumber)
282+
{
283+
tx.SenderAddress = _ecdsa.RecoverAddress(tx, blockNumber);
284+
}
285+
270286
public Keccak[] GetPendingTransactionFilterChanges(int filterId) =>
271287
_filterManager.PollPendingTransactionHashes(filterId);
272288
}

src/Nethermind/Nethermind.Facade/IBlockchainBridge.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ public interface IBlockchainBridge
4040
long BestKnown { get; }
4141
bool IsSyncing { get; }
4242

43+
void RecoverTxSenders(Block block);
44+
45+
void RecoverTxSender(Transaction tx, long blockNumber);
46+
4347
Block FindBlock(Keccak blockHash, bool mainChainOnly);
4448
Block FindBlock(long blockNumber);
4549
Block RetrieveHeadBlock();

src/Nethermind/Nethermind.JsonRpc/Modules/Eth/EthModule.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,11 @@ public ResultWrapper<BlockForRpc> eth_getBlockByHash(Keccak blockHash, bool retu
468468
{
469469
_readerWriterLockSlim.EnterReadLock();
470470
var block = _blockchainBridge.FindBlock(blockHash, false);
471+
if (block != null)
472+
{
473+
_blockchainBridge.RecoverTxSenders(block);
474+
}
475+
471476
return ResultWrapper<BlockForRpc>.Success(new BlockForRpc(block, returnFullTransactionObjects));
472477
}
473478
finally
@@ -486,7 +491,12 @@ public ResultWrapper<BlockForRpc> eth_getBlockByNumber(BlockParameter blockParam
486491
return ResultWrapper<BlockForRpc>.Fail("Incorrect head block");
487492
}
488493

489-
var result = GetBlock(blockParameter, true);
494+
var result = GetBlock(blockParameter, true, true);
495+
if (result.Data != null)
496+
{
497+
_blockchainBridge.RecoverTxSenders(result.Data);
498+
}
499+
490500
return result.Result.ResultType == ResultType.Failure
491501
? ResultWrapper<BlockForRpc>.Fail(result.Result.Error, result.ErrorType)
492502
: ResultWrapper<BlockForRpc>.Success(result.Data == null ? null : new BlockForRpc(result.Data, returnFullTransactionObjects));
@@ -508,6 +518,7 @@ public ResultWrapper<TransactionForRpc> eth_getTransactionByHash(Keccak transact
508518
return ResultWrapper<TransactionForRpc>.Success(null);
509519
}
510520

521+
_blockchainBridge.RecoverTxSender(transaction, receipt.BlockNumber);
511522
var transactionModel = new TransactionForRpc(receipt.BlockHash, receipt.BlockNumber, receipt.Index, transaction);
512523
if (Logger.IsTrace) Logger.Trace($"eth_getTransactionByHash request {transactionHash}, result: {transactionModel.Hash}");
513524
return ResultWrapper<TransactionForRpc>.Success(transactionModel);
@@ -535,6 +546,8 @@ public ResultWrapper<TransactionForRpc> eth_getTransactionByBlockHashAndIndex(Ke
535546
}
536547

537548
var transaction = block.Transactions[(int) positionIndex];
549+
_blockchainBridge.RecoverTxSender(transaction, block.Number);
550+
538551
var transactionModel = new TransactionForRpc(block.Hash, block.Number, (int) positionIndex, transaction);
539552

540553
if (Logger.IsDebug) Logger.Debug($"eth_getTransactionByBlockHashAndIndex request {blockHash}, index: {positionIndex}, result: {transactionModel.Hash}");
@@ -569,6 +582,8 @@ public ResultWrapper<TransactionForRpc> eth_getTransactionByBlockNumberAndIndex(
569582

570583
Block block = result.Data;
571584
var transaction = block.Transactions[(int) positionIndex];
585+
_blockchainBridge.RecoverTxSender(transaction, block.Number);
586+
572587
var transactionModel = new TransactionForRpc(block.Hash, block.Number, (int) positionIndex, transaction);
573588

574589
if (Logger.IsDebug) Logger.Debug($"eth_getTransactionByBlockNumberAndIndex request {blockParameter}, index: {positionIndex}, result: {transactionModel.Hash}");
@@ -879,7 +894,7 @@ private ResultWrapper<byte[]> GetStorage(Address address, BigInteger index, Bloc
879894
return GetAccountStorage(address, index, block.Data.Header.StateRoot);
880895
}
881896

882-
private ResultWrapper<Core.Block> GetBlock(BlockParameter blockParameter, bool allowNulls = false)
897+
private ResultWrapper<Core.Block> GetBlock(BlockParameter blockParameter, bool allowNulls = false, bool recoverTxSenders = false)
883898
{
884899
switch (blockParameter.Type)
885900
{

src/Nethermind/Nethermind.Mining.Test/Nethermind.Mining.Test.csproj

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,4 @@
2424
<Name>Nethermind.Mining</Name>
2525
</ProjectReference>
2626
</ItemGroup>
27-
<ItemGroup>
28-
<Reference Include="NSubstitute, Version=3.1.0.0, Culture=neutral, PublicKeyToken=92dd2e9066daa5ca">
29-
<HintPath>..\..\..\..\..\Users\tksta\.nuget\packages\nsubstitute\3.1.0\lib\netstandard1.3\NSubstitute.dll</HintPath>
30-
</Reference>
31-
</ItemGroup>
3227
</Project>

src/Nethermind/Nethermind.Runner/Runners/EthereumRunner.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ public class EthereumRunner : IRunner
117117
private PrivateKey _nodeKey;
118118
private ChainSpec _chainSpec;
119119
private ICryptoRandom _cryptoRandom = new CryptoRandom();
120-
private IEcdsa _ecdsa = new Ecdsa();
121120
private IJsonSerializer _jsonSerializer = new UnforgivingJsonSerializer();
122121
private IJsonSerializer _ethereumJsonSerializer = new EthereumJsonSerializer();
123122
private CancellationTokenSource _runnerCancellation;
@@ -278,7 +277,8 @@ private void RegisterJsonRpcModules()
278277
filterStore,
279278
filterManager,
280279
_wallet,
281-
rpcState.TransactionProcessor);
280+
rpcState.TransactionProcessor,
281+
_ethereumEcdsa);
282282

283283
AlternativeChain debugChain = new AlternativeChain(_blockTree, _blockValidator, _rewardCalculator, _specProvider, rpcDbProvider, _recoveryStep, _logManager, NullTxPool.Instance, NullReceiptStorage.Instance);
284284
IReadOnlyDbProvider debugDbProvider = new ReadOnlyDbProvider(_dbProvider, false);
@@ -850,7 +850,7 @@ private async Task InitPeer()
850850
if (_logger.IsInfo) _logger.Info($"Initializing NDM...");
851851
var capabilityConnector = await _ndmInitializer.InitAsync(_configProvider, _dbProvider,
852852
_initConfig.BaseDbPath, _blockProcessor, _blockTree, _txPool, _txPoolInfoProvider, _specProvider,
853-
_receiptStorage, _wallet, _timestamp, _ecdsa, _rpcModuleProvider, _keyStore, _jsonSerializer,
853+
_receiptStorage, _wallet, _timestamp, _ethereumEcdsa, _rpcModuleProvider, _keyStore, _jsonSerializer,
854854
_cryptoRandom, _enode, _ndmConsumerChannelManager, _ndmDataPublisher, _grpcService,
855855
_nodeStatsManager, _protocolsManager, protocolValidator, _messageSerializationService,
856856
_initConfig.EnableUnsecuredDevWallet, _logManager);
@@ -889,11 +889,11 @@ private void InitDiscovery()
889889

890890
var privateKeyProvider = new SameKeyGenerator(_nodeKey);
891891
var discoveryMessageFactory = new DiscoveryMessageFactory(_timestamp);
892-
var nodeIdResolver = new NodeIdResolver(_ecdsa);
892+
var nodeIdResolver = new NodeIdResolver(_ethereumEcdsa);
893893

894894
IDiscoveryMsgSerializersProvider msgSerializersProvider = new DiscoveryMsgSerializersProvider(
895895
_messageSerializationService,
896-
_ecdsa,
896+
_ethereumEcdsa,
897897
privateKeyProvider,
898898
discoveryMessageFactory,
899899
nodeIdResolver);

src/Nethermind/Nethermind.sln.DotSettings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
<s:Boolean x:Key="/Default/UserDictionary/Words/=Hardfork/@EntryIndexedValue">True</s:Boolean>
4646
<s:Boolean x:Key="/Default/UserDictionary/Words/=Hashimoto/@EntryIndexedValue">True</s:Boolean>
4747
<s:Boolean x:Key="/Default/UserDictionary/Words/=hashrate/@EntryIndexedValue">True</s:Boolean>
48+
<s:Boolean x:Key="/Default/UserDictionary/Words/=Initializers/@EntryIndexedValue">True</s:Boolean>
4849
<s:Boolean x:Key="/Default/UserDictionary/Words/=intra/@EntryIndexedValue">True</s:Boolean>
4950
<s:Boolean x:Key="/Default/UserDictionary/Words/=ISZERO/@EntryIndexedValue">True</s:Boolean>
5051
<s:Boolean x:Key="/Default/UserDictionary/Words/=Jint/@EntryIndexedValue">True</s:Boolean>

0 commit comments

Comments
 (0)