Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public void Precompile_WithCachingEnabled_IsWrappedInCachedPrecompile()
TestPrecompile cachingPrecompile = new(supportsCaching: true);
Address precompileAddress = Address.FromNumber(100);

FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[precompileAddress] = new(cachingPrecompile)
}.ToFrozenDictionary();
Expand All @@ -51,7 +51,7 @@ public void Precompile_WithCachingEnabled_IsWrappedInCachedPrecompile()

// Act
CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, cache);
ICodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);
CodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);

// Assert
codeInfo.Should().NotBeNull();
Expand All @@ -66,7 +66,7 @@ public void Precompile_WithCachingDisabled_IsNotWrapped()
TestPrecompile nonCachingPrecompile = new(supportsCaching: false);
Address precompileAddress = Address.FromNumber(100);

FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[precompileAddress] = new(nonCachingPrecompile)
}.ToFrozenDictionary();
Expand All @@ -81,7 +81,7 @@ public void Precompile_WithCachingDisabled_IsNotWrapped()

// Act
CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, cache);
ICodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);
CodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);

// Assert
codeInfo.Should().NotBeNull();
Expand All @@ -92,7 +92,7 @@ public void Precompile_WithCachingDisabled_IsNotWrapped()
public void IdentityPrecompile_IsNotWrapped_WhenCacheEnabled()
{
// Arrange
FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[IdentityPrecompile.Address] = new(IdentityPrecompile.Instance)
}.ToFrozenDictionary();
Expand All @@ -107,7 +107,7 @@ public void IdentityPrecompile_IsNotWrapped_WhenCacheEnabled()

// Act
CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, cache);
ICodeInfo codeInfo = repository.GetCachedCodeInfo(IdentityPrecompile.Address, false, spec, out _);
CodeInfo codeInfo = repository.GetCachedCodeInfo(IdentityPrecompile.Address, false, spec, out _);

// Assert
codeInfo.Should().NotBeNull();
Expand All @@ -122,7 +122,7 @@ public void CachedPrecompile_CachesResults_ForCachingEnabledPrecompile()
TestPrecompile cachingPrecompile = new(supportsCaching: true, onRun: () => runCount++);
Address precompileAddress = Address.FromNumber(100);

FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[precompileAddress] = new(cachingPrecompile)
}.ToFrozenDictionary();
Expand All @@ -136,7 +136,7 @@ public void CachedPrecompile_CachesResults_ForCachingEnabledPrecompile()
IReleaseSpec spec = CreateSpecWithPrecompile(precompileAddress);

CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, cache);
ICodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);
CodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);

byte[] input = [1, 2, 3];

Expand All @@ -157,7 +157,7 @@ public void NonCachingPrecompile_DoesNotCacheResults()
TestPrecompile nonCachingPrecompile = new(supportsCaching: false, onRun: () => runCount++);
Address precompileAddress = Address.FromNumber(100);

FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[precompileAddress] = new(nonCachingPrecompile)
}.ToFrozenDictionary();
Expand All @@ -171,7 +171,7 @@ public void NonCachingPrecompile_DoesNotCacheResults()
IReleaseSpec spec = CreateSpecWithPrecompile(precompileAddress);

CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, cache);
ICodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);
CodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);

byte[] input = [1, 2, 3];

Expand All @@ -191,7 +191,7 @@ public void NullCache_DoesNotWrapAnyPrecompiles()
TestPrecompile cachingPrecompile = new(supportsCaching: true);
Address precompileAddress = Address.FromNumber(100);

FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[precompileAddress] = new(cachingPrecompile)
}.ToFrozenDictionary();
Expand All @@ -205,7 +205,7 @@ public void NullCache_DoesNotWrapAnyPrecompiles()

// Act - pass null cache
CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, null);
ICodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);
CodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);

// Assert - precompile should not be wrapped
codeInfo.Should().NotBeNull();
Expand All @@ -216,7 +216,7 @@ public void NullCache_DoesNotWrapAnyPrecompiles()
public void Sha256Precompile_IsWrapped_WhenCacheEnabled()
{
// Arrange - Sha256Precompile has SupportsCaching = true (default)
FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[Sha256Precompile.Address] = new(Sha256Precompile.Instance)
}.ToFrozenDictionary();
Expand All @@ -231,7 +231,7 @@ public void Sha256Precompile_IsWrapped_WhenCacheEnabled()

// Act
CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, cache);
ICodeInfo codeInfo = repository.GetCachedCodeInfo(Sha256Precompile.Address, false, spec, out _);
CodeInfo codeInfo = repository.GetCachedCodeInfo(Sha256Precompile.Address, false, spec, out _);

// Assert - Sha256Precompile should be wrapped (unlike IdentityPrecompile)
codeInfo.Should().NotBeNull();
Expand All @@ -243,7 +243,7 @@ public void Sha256Precompile_IsWrapped_WhenCacheEnabled()
public void MixedPrecompiles_OnlyCachingEnabledAreWrapped()
{
// Arrange - mix of caching and non-caching precompiles
FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[Sha256Precompile.Address] = new(Sha256Precompile.Instance), // SupportsCaching = true
[IdentityPrecompile.Address] = new(IdentityPrecompile.Instance) // SupportsCaching = false
Expand All @@ -264,8 +264,8 @@ public void MixedPrecompiles_OnlyCachingEnabledAreWrapped()

// Act
CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, cache);
ICodeInfo sha256CodeInfo = repository.GetCachedCodeInfo(Sha256Precompile.Address, false, spec, out _);
ICodeInfo identityCodeInfo = repository.GetCachedCodeInfo(IdentityPrecompile.Address, false, spec, out _);
CodeInfo sha256CodeInfo = repository.GetCachedCodeInfo(Sha256Precompile.Address, false, spec, out _);
CodeInfo identityCodeInfo = repository.GetCachedCodeInfo(IdentityPrecompile.Address, false, spec, out _);

// Assert - Sha256 wrapped, Identity not wrapped
sha256CodeInfo.Precompile.Should().NotBeSameAs(Sha256Precompile.Instance);
Expand All @@ -282,7 +282,7 @@ public void CachedPrecompile_DifferentInputs_CreateSeparateCacheEntries()
TestPrecompile cachingPrecompile = new(supportsCaching: true, onRun: () => runCount++);
Address precompileAddress = Address.FromNumber(100);

FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[precompileAddress] = new(cachingPrecompile)
}.ToFrozenDictionary();
Expand All @@ -296,7 +296,7 @@ public void CachedPrecompile_DifferentInputs_CreateSeparateCacheEntries()
IReleaseSpec spec = CreateSpecWithPrecompile(precompileAddress);

CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, cache);
ICodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);
CodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);

byte[] input1 = [1, 2, 3];
byte[] input2 = [4, 5, 6];
Expand All @@ -321,7 +321,7 @@ public void CachedPrecompile_ReturnsCachedResult_OnCacheHit()
TestPrecompile cachingPrecompile = new(supportsCaching: true, onRun: () => runCount++, fixedOutput: expectedOutput);
Address precompileAddress = Address.FromNumber(100);

FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[precompileAddress] = new(cachingPrecompile)
}.ToFrozenDictionary();
Expand All @@ -335,7 +335,7 @@ public void CachedPrecompile_ReturnsCachedResult_OnCacheHit()
IReleaseSpec spec = CreateSpecWithPrecompile(precompileAddress);

CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, cache);
ICodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);
CodeInfo codeInfo = repository.GetCachedCodeInfo(precompileAddress, false, spec, out _);

byte[] input = [1, 2, 3];

Expand All @@ -355,7 +355,7 @@ public void CachedPrecompile_ReturnsCachedResult_OnCacheHit()
public void Sha256Precompile_CachesResults_WithRealComputation()
{
// Arrange
FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[Sha256Precompile.Address] = new(Sha256Precompile.Instance)
}.ToFrozenDictionary();
Expand All @@ -369,7 +369,7 @@ public void Sha256Precompile_CachesResults_WithRealComputation()
IReleaseSpec spec = CreateSpecWithPrecompile(Sha256Precompile.Address);

CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, cache);
ICodeInfo codeInfo = repository.GetCachedCodeInfo(Sha256Precompile.Address, false, spec, out _);
CodeInfo codeInfo = repository.GetCachedCodeInfo(Sha256Precompile.Address, false, spec, out _);

byte[] input = [1, 2, 3, 4, 5];

Expand All @@ -388,7 +388,7 @@ public void Sha256Precompile_CachesResults_WithRealComputation()
public void IdentityPrecompile_DoesNotCache_WithRealComputation()
{
// Arrange
FrozenDictionary<AddressAsKey, PrecompileInfo> precompiles = new Dictionary<AddressAsKey, PrecompileInfo>
FrozenDictionary<AddressAsKey, CodeInfo> precompiles = new Dictionary<AddressAsKey, CodeInfo>
{
[IdentityPrecompile.Address] = new(IdentityPrecompile.Instance)
}.ToFrozenDictionary();
Expand All @@ -402,7 +402,7 @@ public void IdentityPrecompile_DoesNotCache_WithRealComputation()
IReleaseSpec spec = CreateSpecWithPrecompile(IdentityPrecompile.Address);

CachedCodeInfoRepository repository = new(precompileProvider, baseRepository, cache);
ICodeInfo codeInfo = repository.GetCachedCodeInfo(IdentityPrecompile.Address, false, spec, out _);
CodeInfo codeInfo = repository.GetCachedCodeInfo(IdentityPrecompile.Address, false, spec, out _);

byte[] input = [1, 2, 3, 4, 5];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ public class CachedCodeInfoRepository(
ICodeInfoRepository baseCodeInfoRepository,
ConcurrentDictionary<PreBlockCaches.PrecompileCacheKey, Result<byte[]>>? precompileCache) : ICodeInfoRepository
{
private readonly FrozenDictionary<AddressAsKey, PrecompileInfo> _cachedPrecompile = precompileCache is null
private readonly FrozenDictionary<AddressAsKey, CodeInfo> _cachedPrecompile = precompileCache is null
? precompileProvider.GetPrecompiles()
: precompileProvider.GetPrecompiles().ToFrozenDictionary(kvp => kvp.Key, kvp => CreateCachedPrecompile(kvp, precompileCache));

public ICodeInfo GetCachedCodeInfo(Address codeSource, bool followDelegation, IReleaseSpec vmSpec,
public CodeInfo GetCachedCodeInfo(Address codeSource, bool followDelegation, IReleaseSpec vmSpec,
out Address? delegationAddress)
{
if (vmSpec.IsPrecompile(codeSource) && _cachedPrecompile.TryGetValue(codeSource, out var cachedCodeInfo))
Expand Down Expand Up @@ -57,15 +57,15 @@ public bool TryGetDelegation(Address address, IReleaseSpec spec,
return baseCodeInfoRepository.TryGetDelegation(address, spec, out delegatedAddress);
}

private static PrecompileInfo CreateCachedPrecompile(
in KeyValuePair<AddressAsKey, PrecompileInfo> originalPrecompile,
private static CodeInfo CreateCachedPrecompile(
in KeyValuePair<AddressAsKey, CodeInfo> originalPrecompile,
ConcurrentDictionary<PreBlockCaches.PrecompileCacheKey, Result<byte[]>> cache)
{
IPrecompile precompile = originalPrecompile.Value.Precompile!;

return !precompile.SupportsCaching
? originalPrecompile.Value
: new PrecompileInfo(new CachedPrecompile(originalPrecompile.Key.Value, precompile, cache));
: new CodeInfo(new CachedPrecompile(originalPrecompile.Key.Value, precompile, cache));
}

private class CachedPrecompile(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ namespace Nethermind.Blockchain;

public class EthereumPrecompileProvider() : IPrecompileProvider
{
private static FrozenDictionary<AddressAsKey, PrecompileInfo> Precompiles
private static FrozenDictionary<AddressAsKey, CodeInfo> Precompiles
{
get => new Dictionary<AddressAsKey, PrecompileInfo>
get => new Dictionary<AddressAsKey, CodeInfo>
{
[EcRecoverPrecompile.Address] = new(EcRecoverPrecompile.Instance),
[Sha256Precompile.Address] = new(Sha256Precompile.Instance),
Expand Down Expand Up @@ -45,7 +45,7 @@ private static FrozenDictionary<AddressAsKey, PrecompileInfo> Precompiles
}.ToFrozenDictionary();
}

public FrozenDictionary<AddressAsKey, PrecompileInfo> GetPrecompiles()
public FrozenDictionary<AddressAsKey, CodeInfo> GetPrecompiles()
{
return Precompiles;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using Nethermind.Evm;
using Nethermind.Evm.Tracing;
using Nethermind.Evm.TransactionProcessing;
using Nethermind.Evm.CodeAnalysis;

namespace Nethermind.Blockchain.Tracing.GethStyle.Custom.JavaScript;

Expand Down Expand Up @@ -108,7 +109,7 @@ public override void ReportAction(long gas, UInt256 value, Address from, Address

public override void StartOperation(int pc, Instruction opcode, long gas, in ExecutionEnvironment env, int codeSection = 0, int functionDepth = 0)
{
_log.pc = pc + env.CodeInfo.PcOffset();
_log.pc = pc + (env.CodeInfo is EofCodeInfo eof ? eof.PcOffset() : 0);
_log.op = new Log.Opcode(opcode);
_log.gas = gas;
_log.depth = env.GetGethTraceDepth();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Nethermind.Core.Crypto;
using Nethermind.Core.Extensions;
using Nethermind.Evm;
using Nethermind.Evm.CodeAnalysis;
using Nethermind.Evm.Tracing;
using Nethermind.Evm.TransactionProcessing;
using Nethermind.Int256;
Expand Down Expand Up @@ -236,7 +237,7 @@ public override void StartOperation(int pc, Instruction opcode, long gas, in Exe
{
ParityVmOperationTrace operationTrace = new();
_gasAlreadySetForCurrentOp = false;
operationTrace.Pc = pc + env.CodeInfo.PcOffset();
operationTrace.Pc = pc + (env.CodeInfo is EofCodeInfo eof ? eof.PcOffset() : 0);
operationTrace.Cost = gas;
// skip codeSection
// skip functionDepth
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ public void GetCachedCodeInfo_CodeTryGetDelegation_ReturnsCodeOfDelegation(byte[
stateProvider.InsertCode(delegationAddress, delegationCode, _releaseSpec);
EthereumCodeInfoRepository sut = new(stateProvider);

ICodeInfo result = sut.GetCachedCodeInfo(TestItem.AddressA, _releaseSpec);
CodeInfo result = sut.GetCachedCodeInfo(TestItem.AddressA, _releaseSpec);
result.CodeSpan.ToArray().Should().BeEquivalentTo(delegationCode);
}

Expand Down
4 changes: 2 additions & 2 deletions src/Nethermind/Nethermind.Evm/CallResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public CallResult(ReadOnlyMemory<byte> output, bool? precompileSuccess, int from
FromVersion = fromVersion;
}

public CallResult(ICodeInfo? container, ReadOnlyMemory<byte> output, bool? precompileSuccess, int fromVersion, bool shouldRevert = false, EvmExceptionType exceptionType = EvmExceptionType.None)
public CallResult(CodeInfo? container, ReadOnlyMemory<byte> output, bool? precompileSuccess, int fromVersion, bool shouldRevert = false, EvmExceptionType exceptionType = EvmExceptionType.None)
{
StateToExecute = null;
Output = (container, output);
Expand All @@ -64,7 +64,7 @@ private CallResult(EvmExceptionType exceptionType)
}

public VmState<TGasPolicy>? StateToExecute { get; }
public (ICodeInfo Container, ReadOnlyMemory<byte> Bytes) Output { get; }
public (CodeInfo Container, ReadOnlyMemory<byte> Bytes) Output { get; }
public EvmExceptionType ExceptionType { get; }
public bool ShouldRevert { get; }
public bool? PrecompileSuccess { get; }
Expand Down
Loading