From 404553a5b06a038e75ef2cb1b76784363a441828 Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Fri, 15 Dec 2023 01:27:13 +0300 Subject: [PATCH 01/15] Receipts --- src/Nethermind/Chains/op-goerli.json | 6 +++ .../Executor/UserOperationTracer.cs | 4 +- .../Nethermind.Core/TransactionReceipt.cs | 3 ++ .../TestAllTracerWithOutput.cs | 4 +- .../Nethermind.Evm/Tracing/AccessTxTracer.cs | 4 +- .../Tracing/AlwaysCancelTxTracer.cs | 4 +- .../Tracing/BlockReceiptsTracer.cs | 28 ++++++----- .../Tracing/CallOutputTracer.cs | 4 +- .../Tracing/CancellationTxTracer.cs | 8 +-- .../Tracing/CompositeTxTracer.cs | 8 +-- .../Tracing/EstimateGasTracer.cs | 4 +- .../Nethermind.Evm/Tracing/GasEstimator.cs | 4 +- .../GethStyle/GethLikeTxMemoryTracer.cs | 4 +- .../Tracing/GethStyle/GethLikeTxTracer.cs | 4 +- .../JavaScript/GethLikeJavaScriptTxTracer.cs | 8 +-- .../Nethermind.Evm/Tracing/ITxTracer.cs | 4 +- .../Nethermind.Evm/Tracing/NullTxTracer.cs | 4 +- .../Tracing/ParityStyle/ParityLikeTxTracer.cs | 4 +- .../Tracing/Proofs/ProofTxTracer.cs | 4 +- .../Nethermind.Evm/Tracing/TxTracer.cs | 4 +- .../TransactionProcessor.cs | 50 +++++++++++-------- .../Execution/TxBundleSimulator.cs | 4 +- .../Nethermind.Optimism/IOPConfigHelper.cs | 1 + .../InitializeBlockchainOptimism.cs | 1 + .../Nethermind.Optimism/OPConfigHelper.cs | 9 +++- .../OptimismTransactionProcessor.cs | 39 +++++++++++++++ .../ReceiptMessageDecoder.cs | 13 +++++ .../ChainSpecStyle/ChainSpecLoader.cs | 1 + .../ChainSpecStyle/Json/ChainSpecJson.cs | 2 + .../ChainSpecStyle/OptimismParameters.cs | 2 + 30 files changed, 164 insertions(+), 75 deletions(-) diff --git a/src/Nethermind/Chains/op-goerli.json b/src/Nethermind/Chains/op-goerli.json index f1b0d9a377b..694a72712fe 100644 --- a/src/Nethermind/Chains/op-goerli.json +++ b/src/Nethermind/Chains/op-goerli.json @@ -6,6 +6,7 @@ "params": { "regolithTimestamp": "0x6414B8B0", "bedrockBlockNumber": "0x0", + "canyonTimestamp": "0x6553a790", "l1FeeRecipient": "0x420000000000000000000000000000000000001A", "l1BlockAddress": "0x4200000000000000000000000000000000000015" } @@ -52,6 +53,11 @@ "eip3529Transition": "0x3df828", "eip3541Transition": "0x3df828", + "eip4895TransitionTimestamp": "0x6553a790", + "eip3651TransitionTimestamp": "0x6553a790", + "eip3855TransitionTimestamp": "0x6553a790", + "eip3860TransitionTimestamp": "0x6553a790", + "terminalTotalDifficulty": "0" }, "genesis": { diff --git a/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs b/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs index e013a114263..6f5c6a79152 100644 --- a/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs +++ b/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs @@ -70,13 +70,13 @@ public UserOperationTxTracer( public override bool IsTracingAccess => true; public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, - Hash256? stateRoot = null) + Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { Output = output; } public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, - Hash256? stateRoot = null) + Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { Success = false; Error = error; diff --git a/src/Nethermind/Nethermind.Core/TransactionReceipt.cs b/src/Nethermind/Nethermind.Core/TransactionReceipt.cs index ea5f9c57531..5de0b0d85f3 100644 --- a/src/Nethermind/Nethermind.Core/TransactionReceipt.cs +++ b/src/Nethermind/Nethermind.Core/TransactionReceipt.cs @@ -39,6 +39,9 @@ public class TxReceipt public LogEntry[]? Logs { get; set; } public string? Error { get; set; } + public ulong? DepositNonce { get; set; } + public ulong? DepositReceiptVersion { get; set; } + /// /// Ignores receipt output on RLP serialization. /// Output is either StateRoot or StatusCode depending on eip configuration. diff --git a/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs b/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs index 4c3388111e7..2ad44e0dc61 100644 --- a/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs +++ b/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs @@ -42,14 +42,14 @@ public TestAllTracerWithOutput() public List ReportedActionErrors { get; set; } = new List(); - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { GasSpent = gasSpent; ReturnValue = output; StatusCode = Evm.StatusCode.Success; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { GasSpent = gasSpent; Error = error; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs index 00b42ab55a8..4eb5ac54b85 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs @@ -24,12 +24,12 @@ public AccessTxTracer(params Address[] addressesToOptimize) _addressesToOptimize = addressesToOptimize; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { GasSpent += gasSpent; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { GasSpent += gasSpent; } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs index a3ddb2a9ca1..bdb598fce21 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs @@ -42,9 +42,9 @@ public static AlwaysCancelTxTracer Instance public bool IsTracingAccess => true; public bool IsTracingFees => true; - public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) => throw new OperationCanceledException(ErrorMessage); + public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) => throw new OperationCanceledException(ErrorMessage); - public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) => throw new OperationCanceledException(ErrorMessage); + public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) => throw new OperationCanceledException(ErrorMessage); public void StartOperation(int depth, long gas, Instruction opcode, int pc, bool isPostMerge = false) => throw new OperationCanceledException(ErrorMessage); diff --git a/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs index 5c456e673b8..c90d81ad8b8 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs @@ -30,46 +30,48 @@ public class BlockReceiptsTracer : IBlockTracer, ITxTracer, IJournal, ITxTr private IBlockTracer _otherTracer = NullBlockTracer.Instance; - public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { - _txReceipts.Add(BuildReceipt(recipient, gasSpent, StatusCode.Success, logs, stateRoot)); + _txReceipts.Add(BuildReceipt(recipient, gasSpent, StatusCode.Success, logs, stateRoot, depositNonce, depositReceiptVersion)); // hacky way to support nested receipt tracers if (_otherTracer is ITxTracer otherTxTracer) { - otherTxTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot); + otherTxTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot, depositNonce, depositReceiptVersion); } if (_currentTxTracer.IsTracingReceipt) { - _currentTxTracer.MarkAsSuccess(recipient, gasSpent, output, logs); + // TODO: is no stateRoot a bug? + _currentTxTracer.MarkAsSuccess(recipient, gasSpent, output, logs, null, depositNonce, depositReceiptVersion); } } - public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) + public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { - _txReceipts.Add(BuildFailedReceipt(recipient, gasSpent, error, stateRoot)); + _txReceipts.Add(BuildFailedReceipt(recipient, gasSpent, error, stateRoot, depositNonce, depositReceiptVersion)); // hacky way to support nested receipt tracers if (_otherTracer is ITxTracer otherTxTracer) { - otherTxTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot); + otherTxTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot, depositNonce, depositReceiptVersion); } if (_currentTxTracer.IsTracingReceipt) { - _currentTxTracer.MarkAsFailed(recipient, gasSpent, output, error); + // TODO: is no stateRoot a bug? + _currentTxTracer.MarkAsFailed(recipient, gasSpent, output, error, null, depositNonce, depositReceiptVersion); } } - private TxReceipt BuildFailedReceipt(Address recipient, long gasSpent, string error, Hash256? stateRoot = null) + private TxReceipt BuildFailedReceipt(Address recipient, long gasSpent, string error, Hash256? stateRoot, ulong? depositNonce, ulong? depositReceiptVersion) { - TxReceipt receipt = BuildReceipt(recipient, gasSpent, StatusCode.Failure, Array.Empty(), stateRoot); + TxReceipt receipt = BuildReceipt(recipient, gasSpent, StatusCode.Failure, Array.Empty(), stateRoot, depositNonce, depositReceiptVersion); receipt.Error = error; return receipt; } - private TxReceipt BuildReceipt(Address recipient, long spentGas, byte statusCode, LogEntry[] logEntries, Hash256? stateRoot = null) + private TxReceipt BuildReceipt(Address recipient, long spentGas, byte statusCode, LogEntry[] logEntries, Hash256? stateRoot, ulong? depositNonce, ulong? depositReceiptVersion) { Transaction transaction = _currentTx!; TxReceipt txReceipt = new() @@ -87,7 +89,9 @@ private TxReceipt BuildReceipt(Address recipient, long spentGas, byte statusCode Sender = transaction.SenderAddress, ContractAddress = transaction.IsContractCreation ? recipient : null, TxHash = transaction.Hash, - PostTransactionState = stateRoot + PostTransactionState = stateRoot, + DepositNonce = depositNonce, + DepositReceiptVersion = depositReceiptVersion }; return txReceipt; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs index 404b6bb66c4..5e95de9742b 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs @@ -17,14 +17,14 @@ public class CallOutputTracer : TxTracer public byte StatusCode { get; set; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { GasSpent = gasSpent; ReturnValue = output; StatusCode = Evm.StatusCode.Success; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { GasSpent = gasSpent; Error = error; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs index 31759e88649..30fc1175522 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs @@ -168,21 +168,21 @@ public void ReportStorageRead(in StorageCell storageCell) } } - public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { _token.ThrowIfCancellationRequested(); if (_innerTracer.IsTracingReceipt) { - _innerTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot); + _innerTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot, depositNonce, depositReceiptVersion); } } - public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) + public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { _token.ThrowIfCancellationRequested(); if (_innerTracer.IsTracingReceipt) { - _innerTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot); + _innerTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot, depositNonce, depositReceiptVersion); } } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs index c4ad9abfd32..efe25b3063e 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs @@ -125,26 +125,26 @@ public void ReportStorageRead(in StorageCell storageCell) } } - public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { for (int index = 0; index < _txTracers.Count; index++) { ITxTracer innerTracer = _txTracers[index]; if (innerTracer.IsTracingReceipt) { - innerTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot); + innerTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot, depositNonce, depositReceiptVersion); } } } - public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) + public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { for (int index = 0; index < _txTracers.Count; index++) { ITxTracer innerTracer = _txTracers[index]; if (innerTracer.IsTracingReceipt) { - innerTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot); + innerTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot, depositNonce, depositReceiptVersion); } } } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs index 637eeda9fbe..6522dffe2e2 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs @@ -35,14 +35,14 @@ public EstimateGasTracer() public byte StatusCode { get; set; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { GasSpent = gasSpent; ReturnValue = output; StatusCode = Evm.StatusCode.Success; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { GasSpent = gasSpent; Error = error; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs b/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs index 7ae1c6c64a3..60cdcac293b 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs @@ -106,11 +106,11 @@ public OutOfGasTracer() public override bool IsTracingInstructions => true; public bool OutOfGas { get; private set; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxMemoryTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxMemoryTracer.cs index c361051e709..59c7a439c0e 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxMemoryTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxMemoryTracer.cs @@ -14,9 +14,9 @@ public class GethLikeTxMemoryTracer : GethLikeTxTracer { public GethLikeTxMemoryTracer(GethTraceOptions options) : base(options) => IsTracingMemory = IsTracingFullMemory; - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { - base.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot); + base.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot, depositNonce, depositReceiptVersion); Trace.Gas = gasSpent; } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs index 13f4f1c5707..d0746a3348f 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs @@ -29,12 +29,12 @@ protected GethLikeTxTracer(GethTraceOptions options) public sealed override bool IsTracingStack { get; protected set; } protected bool IsTracingFullMemory { get; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { Trace.ReturnValue = output; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { Trace.Failed = true; Trace.ReturnValue = output ?? Array.Empty(); diff --git a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs index c63203dfd40..42b243822e3 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs @@ -192,17 +192,17 @@ private void InvokeExit(long gas, ReadOnlyMemory output, string? error = n _depth--; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { - base.MarkAsFailed(recipient, gasSpent, output, error, stateRoot); + base.MarkAsFailed(recipient, gasSpent, output, error, stateRoot, depositNonce, depositReceiptVersion); _ctx.gasUsed = gasSpent; _ctx.Output = output; _ctx.error = error; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { - base.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot); + base.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot, depositNonce, depositReceiptVersion); _ctx.gasUsed = gasSpent; _ctx.Output = output; } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs index ca99d17265e..debf9363e51 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs @@ -146,7 +146,7 @@ public interface ITxTracer : IWorldStateTracer, IDisposable /// Logs for transaction /// State root after transaction, depends on EIP-658 /// Depends on - void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null); + void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null); /// /// Transaction failed @@ -157,7 +157,7 @@ public interface ITxTracer : IWorldStateTracer, IDisposable /// Error that failed the transaction /// State root after transaction, depends on EIP-658 /// Depends on - void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null); + void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null); /// /// diff --git a/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs index ee1c0bb456a..9ee64d7a5fb 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs @@ -22,9 +22,9 @@ private NullTxTracer() { } [StackTraceHidden] private static void ThrowInvalidOperationException() => throw new InvalidOperationException(ErrorMessage); - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) => ThrowInvalidOperationException(); - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) => ThrowInvalidOperationException(); public override void StartOperation(int depth, long gas, Instruction opcode, int pc, bool isPostMerge = false) => ThrowInvalidOperationException(); diff --git a/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs index 08fde62852a..7269cf089ca 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs @@ -215,7 +215,7 @@ private void PopAction() _currentAction = _actionStack.Count == 0 ? null : _actionStack.Peek(); } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { if (_currentAction is not null) { @@ -230,7 +230,7 @@ public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] outp _trace.Action!.Result!.Output = output; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { if (_currentAction is not null) { diff --git a/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs index e1d37bb6e14..3a01e26ad5d 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs @@ -95,12 +95,12 @@ public override void ReportAccountRead(Address address) Accounts.Add(address); } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { Output = output; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { Output = output; } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs index 14343567c4c..38d631be237 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs @@ -48,8 +48,8 @@ public virtual void ReportAccountRead(Address address) { } public virtual void ReportStorageChange(in ReadOnlySpan key, in ReadOnlySpan value) { } public virtual void ReportStorageChange(in StorageCell storageCell, byte[] before, byte[] after) { } public virtual void ReportStorageRead(in StorageCell storageCell) { } - public virtual void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { } - public virtual void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) { } + public virtual void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { } + public virtual void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { } public virtual void StartOperation(int depth, long gas, Instruction opcode, int pc, bool isPostMerge = false) { } public virtual void ReportOperationError(EvmExceptionType error) { } public virtual void ReportOperationRemainingGas(long gas) { } diff --git a/src/Nethermind/Nethermind.Evm/TransactionProcessing/TransactionProcessor.cs b/src/Nethermind/Nethermind.Evm/TransactionProcessing/TransactionProcessor.cs index 8eb05afb4be..5f22f88a8d3 100644 --- a/src/Nethermind/Nethermind.Evm/TransactionProcessing/TransactionProcessor.cs +++ b/src/Nethermind/Nethermind.Evm/TransactionProcessing/TransactionProcessor.cs @@ -179,6 +179,20 @@ protected virtual void Execute(Transaction tx, BlockExecutionContext blCtx, ITxT WorldState.Commit(spec, tracer.IsTracingState ? tracer : NullStateTracer.Instance); } + if (statusCode == StatusCode.Failure) + { + byte[] output = (substate?.ShouldRevert ?? false) ? substate.Output.ToArray() : Array.Empty(); + TraceReceiptFailure(tracer, tx, header, env.ExecutingAccount, spentGas, output, substate?.Error ?? "invalid", spec); + } + else + { + LogEntry[] logs = substate.Logs.Count != 0 ? substate.Logs.ToArray() : Array.Empty(); + TraceReceiptSuccess(tracer, tx, header, env.ExecutingAccount, spentGas, substate.Output.ToArray(), logs, spec); + } + } + + protected virtual void TraceReceiptFailure(ITxTracer tracer, Transaction tx, BlockHeader header, Address executingAccount, long spentGas, byte[] output, string error, IReleaseSpec spec) + { if (tracer.IsTracingReceipt) { Hash256 stateRoot = null; @@ -188,40 +202,36 @@ protected virtual void Execute(Transaction tx, BlockExecutionContext blCtx, ITxT stateRoot = WorldState.StateRoot; } - if (statusCode == StatusCode.Failure) - { - byte[] output = (substate?.ShouldRevert ?? false) ? substate.Output.ToArray() : Array.Empty(); - tracer.MarkAsFailed(env.ExecutingAccount, spentGas, output, substate?.Error, stateRoot); - } - else - { - LogEntry[] logs = substate.Logs.Count != 0 ? substate.Logs.ToArray() : Array.Empty(); - tracer.MarkAsSuccess(env.ExecutingAccount, spentGas, substate.Output.ToArray(), logs, stateRoot); - } + tracer.MarkAsFailed(executingAccount, spentGas, output, error, stateRoot); } } - protected void QuickFail(Transaction tx, BlockHeader block, IReleaseSpec spec, ITxTracer txTracer, string? reason) + protected virtual void TraceReceiptSuccess(ITxTracer tracer, Transaction tx, BlockHeader header, Address executingAccount, long spentGas, byte[] output, LogEntry[] logs, IReleaseSpec spec) { - block.GasUsed += tx.GasLimit; - - Address recipient = tx.To ?? ContractAddress.From( - tx.SenderAddress ?? Address.Zero, - WorldState.GetNonce(tx.SenderAddress ?? Address.Zero)); - - if (txTracer.IsTracingReceipt) + if (tracer.IsTracingReceipt) { - Hash256? stateRoot = null; + Hash256 stateRoot = null; if (!spec.IsEip658Enabled) { WorldState.RecalculateStateRoot(); stateRoot = WorldState.StateRoot; } - txTracer.MarkAsFailed(recipient, tx.GasLimit, Array.Empty(), reason ?? "invalid", stateRoot); + tracer.MarkAsSuccess(executingAccount, spentGas, output, logs, stateRoot); } } + protected void QuickFail(Transaction tx, BlockHeader header, IReleaseSpec spec, ITxTracer txTracer, string? reason) + { + header.GasUsed += tx.GasLimit; + + Address recipient = tx.To ?? ContractAddress.From( + tx.SenderAddress ?? Address.Zero, + WorldState.GetNonce(tx.SenderAddress ?? Address.Zero)); + + TraceReceiptFailure(txTracer, tx, header, recipient, tx.GasLimit, Array.Empty(), reason ?? "invalid", spec); + } + /// /// Validates the transaction, in a static manner (i.e. without accesing state/storage). diff --git a/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs b/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs index efcd168c850..fed5c8a3054 100644 --- a/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs +++ b/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs @@ -197,13 +197,13 @@ public BundleTxTracer(Address beneficiary, Transaction? transaction, int index) public bool Success { get; private set; } public string? Error { get; private set; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { GasSpent = gasSpent; Success = true; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { GasSpent = gasSpent; Success = false; diff --git a/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs b/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs index 2875a2b7e9a..5b796ce2ee9 100644 --- a/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs +++ b/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs @@ -11,4 +11,5 @@ public interface IOPConfigHelper bool IsBedrock(BlockHeader header); bool IsRegolith(BlockHeader header); + bool IsCanyon(BlockHeader header); } diff --git a/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs b/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs index 6920765a0dc..a72da278b67 100644 --- a/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs +++ b/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs @@ -30,6 +30,7 @@ protected override Task InitBlockchain() _api.SpecHelper = new( _api.ChainSpec.Optimism.RegolithTimestamp, _api.ChainSpec.Optimism.BedrockBlockNumber, + _api.ChainSpec.Optimism.CanyonTimestamp, _api.ChainSpec.Optimism.L1FeeRecipient ); _api.L1CostHelper = new(_api.SpecHelper, _api.ChainSpec.Optimism.L1BlockAddress); diff --git a/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs b/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs index d9c56cf389c..a559a7ac804 100644 --- a/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs +++ b/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs @@ -9,13 +9,15 @@ public class OPSpecHelper : IOPConfigHelper { private readonly ulong _regolithTimestamp; private readonly long _bedrockBlockNumber; + private readonly ulong _canyonTimestamp; public Address L1FeeReceiver { get; init; } - public OPSpecHelper(ulong regolithTimestamp, long bedrockBlockNumber, Address l1FeeReceiver) + public OPSpecHelper(ulong regolithTimestamp, long bedrockBlockNumber, ulong canyonTimestamp, Address l1FeeReceiver) { _regolithTimestamp = regolithTimestamp; _bedrockBlockNumber = bedrockBlockNumber; + _canyonTimestamp = canyonTimestamp; L1FeeReceiver = l1FeeReceiver; } @@ -28,4 +30,9 @@ public bool IsBedrock(BlockHeader header) { return header.Number >= _bedrockBlockNumber; } + + public bool IsCanyon(BlockHeader header) + { + return header.Timestamp >= _canyonTimestamp; + } } diff --git a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs index b58391a4317..e844b235374 100644 --- a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs +++ b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs @@ -47,6 +47,45 @@ protected override void Execute(Transaction tx, BlockExecutionContext blCtx, ITx base.Execute(tx, blCtx, tracer, opts); } + private (ulong?, ulong?) GetDepositReceiptData(Transaction tx, BlockHeader header) + { + ulong? depositNonce = null; + ulong? version = null; + + if (tx.IsDeposit()) + { + depositNonce = WorldState.GetNonce(tx.SenderAddress!).ToUInt64(null); + if (_opConfigHelper.IsCanyon(header)) + { + version = 1; + } + } + + return (depositNonce == 0 ? 0 : depositNonce - 1, version); + } + + protected override void TraceReceiptFailure(ITxTracer tracer, Transaction tx, BlockHeader header, Address executingAccount, long spentGas, byte[] output, string error, IReleaseSpec spec) + { + // TODO: tx.Sender == executingAccount? + if (tracer.IsTracingReceipt) + { + (ulong? depositNonce, ulong? version) = GetDepositReceiptData(tx, header); + + tracer.MarkAsFailed(executingAccount, spentGas, output, error, null, depositNonce, version); + } + } + + protected override void TraceReceiptSuccess(ITxTracer tracer, Transaction tx, BlockHeader header, Address executingAccount, long spentGas, byte[] output, LogEntry[] logs, IReleaseSpec spec) + { + // TODO: tx.Sender == executingAccount? + if (tracer.IsTracingReceipt) + { + (ulong? depositNonce, ulong? version) = GetDepositReceiptData(tx, header); + + tracer.MarkAsSuccess(executingAccount, spentGas, output, logs, null, depositNonce, version); + } + } + protected override bool ValidateStatic(Transaction tx, BlockHeader header, IReleaseSpec spec, ITxTracer tracer, ExecutionOptions opts, out long intrinsicGas) { diff --git a/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs b/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs index b7da5faaedb..3250c46a344 100644 --- a/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs +++ b/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs @@ -58,6 +58,7 @@ public TxReceipt Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBeha entries[i] = Rlp.Decode(rlpStream, RlpBehaviors.AllowExtraBytes); } + // TODO: Decode op stuff here txReceipt.Logs = entries; return txReceipt; } @@ -85,6 +86,12 @@ public TxReceipt Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBeha : Rlp.LengthOf(item.PostTransactionState); } + if (item.TxType == TxType.DepositTx && item.DepositReceiptVersion is not null) + { + contentLength += Rlp.LengthOf(item.DepositNonce ?? 0); + contentLength += Rlp.LengthOf(item.DepositReceiptVersion.Value); + } + return (contentLength, logsLength); } @@ -173,6 +180,12 @@ public void Encode(RlpStream rlpStream, TxReceipt item, RlpBehaviors rlpBehavior { rlpStream.Encode(item.Logs[i]); } + + if (item.TxType == TxType.DepositTx && item.DepositReceiptVersion is not null) + { + rlpStream.Encode(item.DepositNonce!.Value); + rlpStream.Encode(item.DepositReceiptVersion.Value); + } } } } diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs index 163834c1a40..efff578dd09 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs @@ -347,6 +347,7 @@ static AuRaParameters.Validator LoadValidator(ChainSpecJson.AuRaValidatorJson va { RegolithTimestamp = chainSpecJson.Engine.Optimism.RegolithTimestamp, BedrockBlockNumber = chainSpecJson.Engine.Optimism.BedrockBlockNumber, + CanyonTimestamp = chainSpecJson.Engine.Optimism.CanyonTimestamp, L1FeeRecipient = chainSpecJson.Engine.Optimism.L1FeeRecipient, L1BlockAddress = chainSpecJson.Engine.Optimism.L1BlockAddress }; diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs index 4bf9b38fe2f..7592cf895c3 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs @@ -171,6 +171,7 @@ internal class OptimismEngineJson { public ulong RegolithTimestamp => Params.RegolithTimestamp; public long BedrockBlockNumber => Params.BedrockBlockNumber; + public ulong CanyonTimestamp => Params.CanyonTimestamp; public Address L1FeeRecipient => Params.L1FeeRecipient; public Address L1BlockAddress => Params.L1BlockAddress; public OptimismEngineParamsJson Params { get; set; } @@ -180,6 +181,7 @@ internal class OptimismEngineParamsJson { public ulong RegolithTimestamp { get; set; } public long BedrockBlockNumber { get; set; } + public ulong CanyonTimestamp { get; set; } public Address L1FeeRecipient { get; set; } public Address L1BlockAddress { get; set; } } diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs index 586481dbc96..80f41f2b949 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs @@ -13,6 +13,8 @@ public class OptimismParameters public long BedrockBlockNumber { get; set; } + public ulong CanyonTimestamp { get; set; } + public Address L1FeeRecipient { get; set; } public Address L1BlockAddress { get; set; } From 8fec7017c12e7f91ffdb46006641838c5e45e315 Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Fri, 15 Dec 2023 20:55:26 +0300 Subject: [PATCH 02/15] Create2Deployer --- src/Nethermind/Chains/op-goerli.json | 5 ++++- .../Nethermind.Optimism/IOPConfigHelper.cs | 4 ++++ .../InitializeBlockchainOptimism.cs | 7 +------ .../Nethermind.Optimism/OPConfigHelper.cs | 19 ++++++++++++++----- .../OptimismTransactionProcessor.cs | 19 +++++++++++++++++-- .../ChainSpecStyle/ChainSpecLoader.cs | 5 ++++- .../ChainSpecStyle/Json/ChainSpecJson.cs | 7 +++++++ .../ChainSpecStyle/OptimismParameters.cs | 9 +++++++-- 8 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/Nethermind/Chains/op-goerli.json b/src/Nethermind/Chains/op-goerli.json index 694a72712fe..3bd61444dc1 100644 --- a/src/Nethermind/Chains/op-goerli.json +++ b/src/Nethermind/Chains/op-goerli.json @@ -8,7 +8,10 @@ "bedrockBlockNumber": "0x0", "canyonTimestamp": "0x6553a790", "l1FeeRecipient": "0x420000000000000000000000000000000000001A", - "l1BlockAddress": "0x4200000000000000000000000000000000000015" + "l1BlockAddress": "0x4200000000000000000000000000000000000015", + "create2DeployerAddress": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "create2DeployerCodeHash": "0xb0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2", + "create2DeployerCode": "6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033" } } }, diff --git a/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs b/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs index 5b796ce2ee9..fbdfc2d0721 100644 --- a/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs +++ b/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LGPL-3.0-only using Nethermind.Core; +using Nethermind.Core.Crypto; namespace Nethermind.Optimism; @@ -12,4 +13,7 @@ public interface IOPConfigHelper bool IsBedrock(BlockHeader header); bool IsRegolith(BlockHeader header); bool IsCanyon(BlockHeader header); + Address Create2DeployerAddress { get; } + Hash256 Create2DeployerCodeHash { get; } + byte[] Create2DeployerCode { get; } } diff --git a/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs b/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs index a72da278b67..89b0e3db2c5 100644 --- a/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs +++ b/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs @@ -27,12 +27,7 @@ public InitializeBlockchainOptimism(OptimismNethermindApi api) : base(api) protected override Task InitBlockchain() { - _api.SpecHelper = new( - _api.ChainSpec.Optimism.RegolithTimestamp, - _api.ChainSpec.Optimism.BedrockBlockNumber, - _api.ChainSpec.Optimism.CanyonTimestamp, - _api.ChainSpec.Optimism.L1FeeRecipient - ); + _api.SpecHelper = new(_api.ChainSpec.Optimism); _api.L1CostHelper = new(_api.SpecHelper, _api.ChainSpec.Optimism.L1BlockAddress); return base.InitBlockchain(); diff --git a/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs b/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs index a559a7ac804..0bcb3fe4a1e 100644 --- a/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs +++ b/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs @@ -2,6 +2,8 @@ // SPDX-License-Identifier: LGPL-3.0-only using Nethermind.Core; +using Nethermind.Core.Crypto; +using Nethermind.Specs.ChainSpecStyle; namespace Nethermind.Optimism; @@ -13,12 +15,15 @@ public class OPSpecHelper : IOPConfigHelper public Address L1FeeReceiver { get; init; } - public OPSpecHelper(ulong regolithTimestamp, long bedrockBlockNumber, ulong canyonTimestamp, Address l1FeeReceiver) + public OPSpecHelper(OptimismParameters parameters) { - _regolithTimestamp = regolithTimestamp; - _bedrockBlockNumber = bedrockBlockNumber; - _canyonTimestamp = canyonTimestamp; - L1FeeReceiver = l1FeeReceiver; + _regolithTimestamp = parameters.RegolithTimestamp; + _bedrockBlockNumber = parameters.BedrockBlockNumber; + _canyonTimestamp = parameters.CanyonTimestamp; + L1FeeReceiver = parameters.L1FeeRecipient; + Create2DeployerCode = parameters.Create2DeployerCode; + Create2DeployerAddress = parameters.Create2DeployerAddress; + Create2DeployerCodeHash = parameters.Create2DeployerCodeHash; } public bool IsRegolith(BlockHeader header) @@ -35,4 +40,8 @@ public bool IsCanyon(BlockHeader header) { return header.Timestamp >= _canyonTimestamp; } + + public Address Create2DeployerAddress { get; } + public Hash256 Create2DeployerCodeHash { get; } + public byte[] Create2DeployerCode { get; } } diff --git a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs index e844b235374..a6aeaff211b 100644 --- a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs +++ b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LGPL-3.0-only using Nethermind.Core; +using Nethermind.Core.Crypto; using Nethermind.Core.Specs; using Nethermind.Evm; using Nethermind.Evm.Tracing; @@ -33,11 +34,11 @@ public OptimismTransactionProcessor( protected override void Execute(Transaction tx, BlockExecutionContext blCtx, ITxTracer tracer, ExecutionOptions opts) { + IReleaseSpec spec = SpecProvider.GetSpec(blCtx.Header); + ApplyCanyonTransition(blCtx.Header, spec); _currentTxL1Cost = null; if (tx.IsDeposit()) { - IReleaseSpec spec = SpecProvider.GetSpec(blCtx.Header); - WorldState.AddToBalanceAndCreateIfNotExists(tx.SenderAddress!, tx.Mint, spec); if (opts.HasFlag(ExecutionOptions.Commit) || !spec.IsEip658Enabled) @@ -47,6 +48,20 @@ protected override void Execute(Transaction tx, BlockExecutionContext blCtx, ITx base.Execute(tx, blCtx, tracer, opts); } + private void ApplyCanyonTransition(BlockHeader header, IReleaseSpec spec) + { + // TODO: create OpBlockProcessor + if (_opConfigHelper.IsCanyon(header)) + { + Hash256 currentHash = WorldState.GetCodeHash(_opConfigHelper.Create2DeployerAddress); + + if (currentHash != _opConfigHelper.Create2DeployerCodeHash) + { + WorldState.InsertCode(_opConfigHelper.Create2DeployerAddress, _opConfigHelper.Create2DeployerCode, spec); + } + } + } + private (ulong?, ulong?) GetDepositReceiptData(Transaction tx, BlockHeader header) { ulong? depositNonce = null; diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs index efff578dd09..1751ac50fc7 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs @@ -349,7 +349,10 @@ static AuRaParameters.Validator LoadValidator(ChainSpecJson.AuRaValidatorJson va BedrockBlockNumber = chainSpecJson.Engine.Optimism.BedrockBlockNumber, CanyonTimestamp = chainSpecJson.Engine.Optimism.CanyonTimestamp, L1FeeRecipient = chainSpecJson.Engine.Optimism.L1FeeRecipient, - L1BlockAddress = chainSpecJson.Engine.Optimism.L1BlockAddress + L1BlockAddress = chainSpecJson.Engine.Optimism.L1BlockAddress, + Create2DeployerAddress = chainSpecJson.Engine.Optimism.Create2DeployerAddress, + Create2DeployerCodeHash = chainSpecJson.Engine.Optimism.Create2DeployerCodeHash, + Create2DeployerCode = chainSpecJson.Engine.Optimism.Create2DeployerCode }; } else if (chainSpecJson.Engine?.NethDev is not null) diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs index 7592cf895c3..10a437744ed 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs @@ -7,6 +7,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using Nethermind.Core; +using Nethermind.Core.Crypto; using Nethermind.Int256; namespace Nethermind.Specs.ChainSpecStyle.Json @@ -174,6 +175,9 @@ internal class OptimismEngineJson public ulong CanyonTimestamp => Params.CanyonTimestamp; public Address L1FeeRecipient => Params.L1FeeRecipient; public Address L1BlockAddress => Params.L1BlockAddress; + public Address Create2DeployerAddress => Params.Create2DeployerAddress; + public Hash256 Create2DeployerCodeHash => Params.Create2DeployerCodeHash; + public byte[] Create2DeployerCode => Params.Create2DeployerCode; public OptimismEngineParamsJson Params { get; set; } } @@ -184,6 +188,9 @@ internal class OptimismEngineParamsJson public ulong CanyonTimestamp { get; set; } public Address L1FeeRecipient { get; set; } public Address L1BlockAddress { get; set; } + public Address Create2DeployerAddress { get; set; } + public Hash256 Create2DeployerCodeHash { get; set; } + public byte[] Create2DeployerCode { get; set; } } internal class NethDevJson diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs index 80f41f2b949..c5ada49aa66 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs @@ -1,9 +1,8 @@ // SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited // SPDX-License-Identifier: LGPL-3.0-only -using System.Collections.Generic; using Nethermind.Core; -using Nethermind.Int256; +using Nethermind.Core.Crypto; namespace Nethermind.Specs.ChainSpecStyle { @@ -18,5 +17,11 @@ public class OptimismParameters public Address L1FeeRecipient { get; set; } public Address L1BlockAddress { get; set; } + + public Address Create2DeployerAddress { get; set; } + + public Hash256 Create2DeployerCodeHash { get; set; } + + public byte[] Create2DeployerCode { get; set; } } } From b2142c5e4e400774f028b4c923441e2913f415f7 Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Mon, 18 Dec 2023 00:55:12 +0300 Subject: [PATCH 03/15] Fix null value --- src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs | 4 ++-- .../Nethermind.Optimism/OptimismTransactionProcessor.cs | 4 +++- .../Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs | 4 ++-- .../Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs b/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs index 0bcb3fe4a1e..cd05e52f1c8 100644 --- a/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs +++ b/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs @@ -11,7 +11,7 @@ public class OPSpecHelper : IOPConfigHelper { private readonly ulong _regolithTimestamp; private readonly long _bedrockBlockNumber; - private readonly ulong _canyonTimestamp; + private readonly ulong? _canyonTimestamp; public Address L1FeeReceiver { get; init; } @@ -38,7 +38,7 @@ public bool IsBedrock(BlockHeader header) public bool IsCanyon(BlockHeader header) { - return header.Timestamp >= _canyonTimestamp; + return header.Timestamp >= (_canyonTimestamp ?? long.MaxValue); } public Address Create2DeployerAddress { get; } diff --git a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs index a6aeaff211b..b77fb7a8545 100644 --- a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs +++ b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs @@ -53,7 +53,9 @@ private void ApplyCanyonTransition(BlockHeader header, IReleaseSpec spec) // TODO: create OpBlockProcessor if (_opConfigHelper.IsCanyon(header)) { - Hash256 currentHash = WorldState.GetCodeHash(_opConfigHelper.Create2DeployerAddress); + Hash256? currentHash = WorldState.AccountExists(_opConfigHelper.Create2DeployerAddress) + ? WorldState.GetCodeHash(_opConfigHelper.Create2DeployerAddress) + : null; if (currentHash != _opConfigHelper.Create2DeployerCodeHash) { diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs index 10a437744ed..b197d6fef3a 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs @@ -172,7 +172,7 @@ internal class OptimismEngineJson { public ulong RegolithTimestamp => Params.RegolithTimestamp; public long BedrockBlockNumber => Params.BedrockBlockNumber; - public ulong CanyonTimestamp => Params.CanyonTimestamp; + public ulong? CanyonTimestamp => Params.CanyonTimestamp; public Address L1FeeRecipient => Params.L1FeeRecipient; public Address L1BlockAddress => Params.L1BlockAddress; public Address Create2DeployerAddress => Params.Create2DeployerAddress; @@ -185,7 +185,7 @@ internal class OptimismEngineParamsJson { public ulong RegolithTimestamp { get; set; } public long BedrockBlockNumber { get; set; } - public ulong CanyonTimestamp { get; set; } + public ulong? CanyonTimestamp { get; set; } public Address L1FeeRecipient { get; set; } public Address L1BlockAddress { get; set; } public Address Create2DeployerAddress { get; set; } diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs index c5ada49aa66..a8810652e99 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs @@ -12,7 +12,7 @@ public class OptimismParameters public long BedrockBlockNumber { get; set; } - public ulong CanyonTimestamp { get; set; } + public ulong? CanyonTimestamp { get; set; } public Address L1FeeRecipient { get; set; } From 7a64b1316eee643fc910536a9987800bcdac73e1 Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Mon, 18 Dec 2023 02:49:11 +0300 Subject: [PATCH 04/15] Refactor 1559 --- src/Nethermind/Chains/op-goerli.json | 1 + src/Nethermind/Chains/op-sepolia.json | 2 +- .../Producers/BlockProducerBaseTests.BaseFee.cs | 12 ++++++------ .../TargetAdjustedGasLimitCalculatorTests.cs | 2 +- .../Nethermind.Consensus/Eip1559GasLimitAdjuster.cs | 2 +- .../Nethermind.Core.Test/BlockHeaderTests.cs | 4 ++-- src/Nethermind/Nethermind.Core/BaseFeeCalculator.cs | 8 ++++---- src/Nethermind/Nethermind.Core/Eip1559Constants.cs | 5 ----- src/Nethermind/Nethermind.Core/Specs/IEip1559Spec.cs | 3 +++ .../Nethermind.Specs.Test/OverridableReleaseSpec.cs | 3 +++ .../ChainSpecStyle/ChainSpecBasedSpecProvider.cs | 5 +++++ .../ChainSpecStyle/ChainSpecLoader.cs | 11 ++++------- .../ChainSpecStyle/Json/ChainSpecJson.cs | 2 ++ .../ChainSpecStyle/OptimismParameters.cs | 3 +++ src/Nethermind/Nethermind.Specs/ReleaseSpec.cs | 3 +++ .../Nethermind.Specs/SystemTransactionReleaseSpec.cs | 3 +++ 16 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/Nethermind/Chains/op-goerli.json b/src/Nethermind/Chains/op-goerli.json index 3bd61444dc1..3a9be11ac01 100644 --- a/src/Nethermind/Chains/op-goerli.json +++ b/src/Nethermind/Chains/op-goerli.json @@ -9,6 +9,7 @@ "canyonTimestamp": "0x6553a790", "l1FeeRecipient": "0x420000000000000000000000000000000000001A", "l1BlockAddress": "0x4200000000000000000000000000000000000015", + "canyonBaseFeeChangeDenominator": "250", "create2DeployerAddress": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", "create2DeployerCodeHash": "0xb0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2", "create2DeployerCode": "6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033" diff --git a/src/Nethermind/Chains/op-sepolia.json b/src/Nethermind/Chains/op-sepolia.json index 087e053c8e7..c95b9a0a992 100644 --- a/src/Nethermind/Chains/op-sepolia.json +++ b/src/Nethermind/Chains/op-sepolia.json @@ -39,7 +39,7 @@ "eip1559Transition": "0x0", "eip1559FeeCollectorTransition": "0x0", "eip1559FeeCollector": "0x4200000000000000000000000000000000000019", - "eip1559ElasticityMultiplier": "0xa", + "eip1559ElasticityMultiplier": "0x6", "eip1559BaseFeeMaxChangeDenominator": "0x32", "eip3198Transition": "0x0", "eip3529Transition": "0x0", diff --git a/src/Nethermind/Nethermind.Blockchain.Test/Producers/BlockProducerBaseTests.BaseFee.cs b/src/Nethermind/Nethermind.Blockchain.Test/Producers/BlockProducerBaseTests.BaseFee.cs index 4e66e5bd708..988136b6896 100644 --- a/src/Nethermind/Nethermind.Blockchain.Test/Producers/BlockProducerBaseTests.BaseFee.cs +++ b/src/Nethermind/Nethermind.Blockchain.Test/Producers/BlockProducerBaseTests.BaseFee.cs @@ -255,7 +255,7 @@ public async Task BlockProducer_returns_correct_fork_base_fee() .WithEip1559TransitionBlock(7) .CreateTestBlockchain() .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee); + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee); await scenario.Finish(); } @@ -266,7 +266,7 @@ public async Task BlockProducer_returns_correctly_decreases_base_fee_on_empty_bl .WithEip1559TransitionBlock(6) .CreateTestBlockchain() .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee) + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee) .AssertNewBlock(875000000) .AssertNewBlock(765625000) .AssertNewBlock(669921875) @@ -283,7 +283,7 @@ public async Task BaseFee_should_decrease_when_we_send_transactions_below_gas_ta .CreateTestBlockchain(gasLimit) .DeployContract() .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee) + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee) .SendLegacyTransaction(gasLimit / 3, 20.GWei()) .SendEip1559Transaction(gasLimit / 3, 1.GWei(), 20.GWei()) .AssertNewBlock(875000000) @@ -301,7 +301,7 @@ public async Task BaseFee_should_not_change_when_we_send_transactions_equal_gas_ .CreateTestBlockchain(gasTarget) .DeployContract() .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee) + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee) .SendLegacyTransaction(gasTarget / 2, 20.GWei()) .SendEip1559Transaction(gasTarget / 2, 1.GWei(), 20.GWei()) .AssertNewBlock(875000000) @@ -319,7 +319,7 @@ public async Task BaseFee_should_increase_when_we_send_transactions_above_gas_ta .CreateTestBlockchain(gasTarget) .DeployContract() .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee) + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee) .SendLegacyTransaction(gasTarget / 2, 20.GWei()) .SendEip1559Transaction(gasTarget / 2, 1.GWei(), 20.GWei()) .SendLegacyTransaction(gasTarget / 2, 20.GWei()) @@ -337,7 +337,7 @@ public async Task When_base_fee_decreases_previously_fee_too_low_transaction_is_ .WithEip1559TransitionBlock(6) .CreateTestBlockchain(gasTarget) .BlocksBeforeTransitionShouldHaveZeroBaseFee() - .AssertNewBlock(Eip1559Constants.ForkBaseFee) + .AssertNewBlock(Eip1559Constants.DefaultForkBaseFee) .SendLegacyTransaction(gasTarget / 2, 7.GWei() / 10, nonce: UInt256.Zero) .AssertNewBlock(875000000) .AssertNewBlock(765625000) diff --git a/src/Nethermind/Nethermind.Consensus.Test/TargetAdjustedGasLimitCalculatorTests.cs b/src/Nethermind/Nethermind.Consensus.Test/TargetAdjustedGasLimitCalculatorTests.cs index d3006e499c7..2f96501987d 100644 --- a/src/Nethermind/Nethermind.Consensus.Test/TargetAdjustedGasLimitCalculatorTests.cs +++ b/src/Nethermind/Nethermind.Consensus.Test/TargetAdjustedGasLimitCalculatorTests.cs @@ -27,7 +27,7 @@ public void Is_bump_on_1559_eip_block() TargetAdjustedGasLimitCalculator targetedAdjustedGasLimitCalculator = new(specProvider, new BlocksConfig()); BlockHeader header = Build.A.BlockHeader.WithNumber(londonBlock - 1).WithGasLimit(gasLimit).TestObject; long actualValue = targetedAdjustedGasLimitCalculator.GetGasLimit(header); - Assert.That(actualValue, Is.EqualTo(gasLimit * Eip1559Constants.ElasticityMultiplier)); + Assert.That(actualValue, Is.EqualTo(gasLimit * Eip1559Constants.DefaultElasticityMultiplier)); } } } diff --git a/src/Nethermind/Nethermind.Consensus/Eip1559GasLimitAdjuster.cs b/src/Nethermind/Nethermind.Consensus/Eip1559GasLimitAdjuster.cs index 3c1ecb4138f..98e15179438 100644 --- a/src/Nethermind/Nethermind.Consensus/Eip1559GasLimitAdjuster.cs +++ b/src/Nethermind/Nethermind.Consensus/Eip1559GasLimitAdjuster.cs @@ -14,7 +14,7 @@ public static long AdjustGasLimit(IReleaseSpec releaseSpec, long gasLimit, long long adjustedGasLimit = gasLimit; if (releaseSpec.Eip1559TransitionBlock == blockNumber) { - adjustedGasLimit *= Eip1559Constants.ElasticityMultiplier; + adjustedGasLimit *= releaseSpec.ElasticityMultiplier; } return adjustedGasLimit; diff --git a/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs b/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs index b2c59314889..ae4c6e925ba 100644 --- a/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs +++ b/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs @@ -117,7 +117,7 @@ public void Eip_1559_CalculateBaseFee(long gasTarget, long baseFee, long expecte BlockHeader blockHeader = Build.A.BlockHeader.TestObject; blockHeader.Number = 2001; - blockHeader.GasLimit = gasTarget * Eip1559Constants.ElasticityMultiplier; + blockHeader.GasLimit = gasTarget * Eip1559Constants.DefaultElasticityMultiplier; blockHeader.BaseFeePerGas = (UInt256)baseFee; blockHeader.GasUsed = gasUsed; UInt256 actualBaseFee = BaseFeeCalculator.Calculate(blockHeader, releaseSpec); @@ -144,7 +144,7 @@ public void Eip_1559_CalculateBaseFee_shared_test_cases((BaseFeeTestCases Info, BlockHeader blockHeader = Build.A.BlockHeader.TestObject; blockHeader.Number = 2001; - blockHeader.GasLimit = testCase.Info.ParentTargetGasUsed * Eip1559Constants.ElasticityMultiplier; + blockHeader.GasLimit = testCase.Info.ParentTargetGasUsed * Eip1559Constants.DefaultElasticityMultiplier; blockHeader.BaseFeePerGas = (UInt256)testCase.Info.ParentBaseFee; blockHeader.GasUsed = testCase.Info.ParentGasUsed; UInt256 actualBaseFee = BaseFeeCalculator.Calculate(blockHeader, releaseSpec); diff --git a/src/Nethermind/Nethermind.Core/BaseFeeCalculator.cs b/src/Nethermind/Nethermind.Core/BaseFeeCalculator.cs index 70b72473a73..268997f6df9 100644 --- a/src/Nethermind/Nethermind.Core/BaseFeeCalculator.cs +++ b/src/Nethermind/Nethermind.Core/BaseFeeCalculator.cs @@ -18,7 +18,7 @@ public static UInt256 Calculate(BlockHeader parent, IEip1559Spec specFor1559) long gasDelta; UInt256 feeDelta; bool isForkBlockNumber = specFor1559.Eip1559TransitionBlock == parent.Number + 1; - long parentGasTarget = parent.GasLimit / Eip1559Constants.ElasticityMultiplier; + long parentGasTarget = parent.GasLimit / specFor1559.ElasticityMultiplier; if (isForkBlockNumber) parentGasTarget = parent.GasLimit; @@ -30,20 +30,20 @@ public static UInt256 Calculate(BlockHeader parent, IEip1559Spec specFor1559) { gasDelta = parent.GasUsed - parentGasTarget; feeDelta = UInt256.Max( - parentBaseFee * (UInt256)gasDelta / (UInt256)parentGasTarget / Eip1559Constants.BaseFeeMaxChangeDenominator, + parentBaseFee * (UInt256)gasDelta / (UInt256)parentGasTarget / specFor1559.BaseFeeMaxChangeDenominator, UInt256.One); expectedBaseFee = parentBaseFee + feeDelta; } else { gasDelta = parentGasTarget - parent.GasUsed; - feeDelta = parentBaseFee * (UInt256)gasDelta / (UInt256)parentGasTarget / Eip1559Constants.BaseFeeMaxChangeDenominator; + feeDelta = parentBaseFee * (UInt256)gasDelta / (UInt256)parentGasTarget / specFor1559.BaseFeeMaxChangeDenominator; expectedBaseFee = UInt256.Max(parentBaseFee - feeDelta, 0); } if (isForkBlockNumber) { - expectedBaseFee = Eip1559Constants.ForkBaseFee; + expectedBaseFee = specFor1559.ForkBaseFee; } if (specFor1559.Eip1559BaseFeeMinValue.HasValue) diff --git a/src/Nethermind/Nethermind.Core/Eip1559Constants.cs b/src/Nethermind/Nethermind.Core/Eip1559Constants.cs index c2895bed910..cab44982cae 100644 --- a/src/Nethermind/Nethermind.Core/Eip1559Constants.cs +++ b/src/Nethermind/Nethermind.Core/Eip1559Constants.cs @@ -14,10 +14,5 @@ public class Eip1559Constants public static readonly UInt256 DefaultBaseFeeMaxChangeDenominator = 8; public static readonly int DefaultElasticityMultiplier = 2; - - // The above values are the default ones. However, we're allowing to override it from genesis - public static UInt256 ForkBaseFee { get; set; } = DefaultForkBaseFee; - public static UInt256 BaseFeeMaxChangeDenominator { get; set; } = DefaultBaseFeeMaxChangeDenominator; - public static long ElasticityMultiplier { get; set; } = DefaultElasticityMultiplier; } } diff --git a/src/Nethermind/Nethermind.Core/Specs/IEip1559Spec.cs b/src/Nethermind/Nethermind.Core/Specs/IEip1559Spec.cs index 33e5723eed3..0d343448551 100644 --- a/src/Nethermind/Nethermind.Core/Specs/IEip1559Spec.cs +++ b/src/Nethermind/Nethermind.Core/Specs/IEip1559Spec.cs @@ -17,5 +17,8 @@ public interface IEip1559Spec public long Eip1559TransitionBlock { get; } public Address? Eip1559FeeCollector => null; public UInt256? Eip1559BaseFeeMinValue => null; + public UInt256 ForkBaseFee { get; } + public UInt256 BaseFeeMaxChangeDenominator { get; } + public long ElasticityMultiplier { get; } } } diff --git a/src/Nethermind/Nethermind.Specs.Test/OverridableReleaseSpec.cs b/src/Nethermind/Nethermind.Specs.Test/OverridableReleaseSpec.cs index 225168c5b1d..b36a57071d0 100644 --- a/src/Nethermind/Nethermind.Specs.Test/OverridableReleaseSpec.cs +++ b/src/Nethermind/Nethermind.Specs.Test/OverridableReleaseSpec.cs @@ -157,5 +157,8 @@ public ulong Eip4844TransitionTimestamp public bool IsEip6780Enabled => _spec.IsEip6780Enabled; public bool IsEip4788Enabled => _spec.IsEip4788Enabled; public Address Eip4788ContractAddress => _spec.Eip4788ContractAddress; + public UInt256 ForkBaseFee => _spec.ForkBaseFee; + public UInt256 BaseFeeMaxChangeDenominator => _spec.BaseFeeMaxChangeDenominator; + public long ElasticityMultiplier => _spec.ElasticityMultiplier; } } diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs index 45a85affb03..1486ad00ee5 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs @@ -207,8 +207,13 @@ private static ReleaseSpec CreateReleaseSpec(ChainSpec chainSpec, long releaseSt releaseSpec.IsEip3607Enabled = (chainSpec.Parameters.Eip3607Transition ?? long.MaxValue) <= releaseStartBlock; releaseSpec.ValidateChainId = (chainSpec.Parameters.ValidateChainIdTransition ?? 0) <= releaseStartBlock; releaseSpec.ValidateReceipts = ((chainSpec.Parameters.ValidateReceiptsTransition > 0) ? Math.Max(chainSpec.Parameters.ValidateReceiptsTransition ?? 0, chainSpec.Parameters.Eip658Transition ?? 0) : 0) <= releaseStartBlock; + releaseSpec.Eip1559FeeCollector = releaseSpec.IsEip1559Enabled && (chainSpec.Parameters.Eip1559FeeCollectorTransition ?? long.MaxValue) <= releaseStartBlock ? chainSpec.Parameters.Eip1559FeeCollector : null; releaseSpec.Eip1559BaseFeeMinValue = releaseSpec.IsEip1559Enabled && (chainSpec.Parameters.Eip1559BaseFeeMinValueTransition ?? long.MaxValue) <= releaseStartBlock ? chainSpec.Parameters.Eip1559BaseFeeMinValue : null; + releaseSpec.ElasticityMultiplier = chainSpec.Parameters.Eip1559ElasticityMultiplier; + releaseSpec.ForkBaseFee = chainSpec.Parameters.Eip1559BaseFeeInitialValue; + releaseSpec.BaseFeeMaxChangeDenominator = chainSpec.Parameters.Eip1559BaseFeeMaxChangeDenominator; + if (chainSpec.Ethash is not null) { diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs index 1751ac50fc7..01adec4047f 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs @@ -157,10 +157,10 @@ bool GetForInnerPathExistence(KeyValuePair o) TransactionPermissionContractTransition = chainSpecJson.Params.TransactionPermissionContractTransition, ValidateChainIdTransition = chainSpecJson.Params.ValidateChainIdTransition, ValidateReceiptsTransition = chainSpecJson.Params.ValidateReceiptsTransition, - Eip1559ElasticityMultiplier = chainSpecJson.Params.Eip1559ElasticityMultiplier ?? Eip1559Constants.ElasticityMultiplier, - Eip1559BaseFeeInitialValue = chainSpecJson.Params.Eip1559BaseFeeInitialValue ?? Eip1559Constants.ForkBaseFee, + Eip1559ElasticityMultiplier = chainSpecJson.Params.Eip1559ElasticityMultiplier ?? Eip1559Constants.DefaultElasticityMultiplier, + Eip1559BaseFeeInitialValue = chainSpecJson.Params.Eip1559BaseFeeInitialValue ?? Eip1559Constants.DefaultForkBaseFee, Eip1559BaseFeeMaxChangeDenominator = chainSpecJson.Params.Eip1559BaseFeeMaxChangeDenominator ?? - Eip1559Constants.BaseFeeMaxChangeDenominator, + Eip1559Constants.DefaultBaseFeeMaxChangeDenominator, Eip1559FeeCollector = chainSpecJson.Params.Eip1559FeeCollector, Eip1559FeeCollectorTransition = chainSpecJson.Params.Eip1559FeeCollectorTransition, Eip1559BaseFeeMinValueTransition = chainSpecJson.Params.Eip1559BaseFeeMinValueTransition, @@ -180,10 +180,6 @@ bool GetForInnerPathExistence(KeyValuePair o) ?? GetTransitionForExpectedPricing("alt_bn128_pairing", "price.alt_bn128_pairing.base", 45000); chainSpec.Parameters.Eip2565Transition ??= GetTransitionIfInnerPathExists("modexp", "price.modexp2565"); - Eip1559Constants.ElasticityMultiplier = chainSpec.Parameters.Eip1559ElasticityMultiplier; - Eip1559Constants.ForkBaseFee = chainSpec.Parameters.Eip1559BaseFeeInitialValue; - Eip1559Constants.BaseFeeMaxChangeDenominator = chainSpec.Parameters.Eip1559BaseFeeMaxChangeDenominator; - Eip4844Constants.OverrideIfAny( chainSpec.Parameters.Eip4844BlobGasPriceUpdateFraction, chainSpec.Parameters.Eip4844MaxBlobGasPerBlock, @@ -350,6 +346,7 @@ static AuRaParameters.Validator LoadValidator(ChainSpecJson.AuRaValidatorJson va CanyonTimestamp = chainSpecJson.Engine.Optimism.CanyonTimestamp, L1FeeRecipient = chainSpecJson.Engine.Optimism.L1FeeRecipient, L1BlockAddress = chainSpecJson.Engine.Optimism.L1BlockAddress, + CanyonBaseFeeChangeDenominator = chainSpecJson.Engine.Optimism.CanyonBaseFeeChangeDenominator, Create2DeployerAddress = chainSpecJson.Engine.Optimism.Create2DeployerAddress, Create2DeployerCodeHash = chainSpecJson.Engine.Optimism.Create2DeployerCodeHash, Create2DeployerCode = chainSpecJson.Engine.Optimism.Create2DeployerCode diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs index b197d6fef3a..7b473a36154 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs @@ -175,6 +175,7 @@ internal class OptimismEngineJson public ulong? CanyonTimestamp => Params.CanyonTimestamp; public Address L1FeeRecipient => Params.L1FeeRecipient; public Address L1BlockAddress => Params.L1BlockAddress; + public UInt256 CanyonBaseFeeChangeDenominator => Params.CanyonBaseFeeChangeDenominator; public Address Create2DeployerAddress => Params.Create2DeployerAddress; public Hash256 Create2DeployerCodeHash => Params.Create2DeployerCodeHash; public byte[] Create2DeployerCode => Params.Create2DeployerCode; @@ -188,6 +189,7 @@ internal class OptimismEngineParamsJson public ulong? CanyonTimestamp { get; set; } public Address L1FeeRecipient { get; set; } public Address L1BlockAddress { get; set; } + public UInt256 CanyonBaseFeeChangeDenominator { get; set; } public Address Create2DeployerAddress { get; set; } public Hash256 Create2DeployerCodeHash { get; set; } public byte[] Create2DeployerCode { get; set; } diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs index a8810652e99..d8550702305 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs @@ -3,6 +3,7 @@ using Nethermind.Core; using Nethermind.Core.Crypto; +using Nethermind.Int256; namespace Nethermind.Specs.ChainSpecStyle { @@ -18,6 +19,8 @@ public class OptimismParameters public Address L1BlockAddress { get; set; } + public UInt256 CanyonBaseFeeChangeDenominator { get; set; } + public Address Create2DeployerAddress { get; set; } public Hash256 Create2DeployerCodeHash { get; set; } diff --git a/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs b/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs index fa886f82fa6..e3835cbf40f 100644 --- a/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs +++ b/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs @@ -72,6 +72,9 @@ public ReleaseSpec Clone() public ulong Eip4844TransitionTimestamp { get; set; } public Address Eip1559FeeCollector { get; set; } public UInt256? Eip1559BaseFeeMinValue { get; set; } + public UInt256 ForkBaseFee { get; set; } + public UInt256 BaseFeeMaxChangeDenominator { get; set; } + public long ElasticityMultiplier { get; set; } public bool IsEip1153Enabled { get; set; } public bool IsEip3651Enabled { get; set; } public bool IsEip3855Enabled { get; set; } diff --git a/src/Nethermind/Nethermind.Specs/SystemTransactionReleaseSpec.cs b/src/Nethermind/Nethermind.Specs/SystemTransactionReleaseSpec.cs index b4c0c4d29e8..8774d7a03ae 100644 --- a/src/Nethermind/Nethermind.Specs/SystemTransactionReleaseSpec.cs +++ b/src/Nethermind/Nethermind.Specs/SystemTransactionReleaseSpec.cs @@ -130,5 +130,8 @@ public bool IsEip158IgnoredAccount(Address address) public bool IsEip6780Enabled => _spec.IsEip6780Enabled; public bool IsEip4788Enabled => _spec.IsEip4788Enabled; public Address Eip4788ContractAddress => _spec.Eip4788ContractAddress; + public UInt256 ForkBaseFee => _spec.ForkBaseFee; + public UInt256 BaseFeeMaxChangeDenominator => _spec.BaseFeeMaxChangeDenominator; + public long ElasticityMultiplier => _spec.ElasticityMultiplier; } } From d28de6bd3c31c1e0052e655a117802f5f359008b Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Mon, 18 Dec 2023 15:47:12 +0300 Subject: [PATCH 05/15] Canyon eip 1559 --- .../ChainSpecStyle/ChainSpecBasedSpecProvider.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs index 1486ad00ee5..70c48f7c103 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs @@ -214,6 +214,11 @@ private static ReleaseSpec CreateReleaseSpec(ChainSpec chainSpec, long releaseSt releaseSpec.ForkBaseFee = chainSpec.Parameters.Eip1559BaseFeeInitialValue; releaseSpec.BaseFeeMaxChangeDenominator = chainSpec.Parameters.Eip1559BaseFeeMaxChangeDenominator; + if (chainSpec.Optimism.CanyonTimestamp <= releaseStartTimestamp) + { + releaseSpec.BaseFeeMaxChangeDenominator = chainSpec.Optimism.CanyonBaseFeeChangeDenominator; + } + if (chainSpec.Ethash is not null) { From 6574fe24a4d8e92409b13c3648296abc2cad04ba Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Thu, 21 Dec 2023 00:15:07 +0300 Subject: [PATCH 06/15] Refactor --- .../Executor/UserOperationTracer.cs | 2 +- .../Processing/BlockProcessor.cs | 12 ++--- .../TestAllTracerWithOutput.cs | 2 +- .../Nethermind.Evm/Tracing/AccessTxTracer.cs | 2 +- .../Tracing/AlwaysCancelTxTracer.cs | 2 +- .../Tracing/BlockReceiptsTracer.cs | 40 +++++++-------- .../Tracing/CallOutputTracer.cs | 2 +- .../Tracing/CancellationTxTracer.cs | 4 +- .../Tracing/CompositeTxTracer.cs | 4 +- .../Tracing/EstimateGasTracer.cs | 2 +- .../Nethermind.Evm/Tracing/GasEstimator.cs | 2 +- .../GethStyle/GethLikeTxMemoryTracer.cs | 4 +- .../Tracing/GethStyle/GethLikeTxTracer.cs | 2 +- .../JavaScript/GethLikeJavaScriptTxTracer.cs | 4 +- .../Nethermind.Evm/Tracing/ITxTracer.cs | 2 +- .../Nethermind.Evm/Tracing/NullTxTracer.cs | 2 +- .../Tracing/ParityStyle/ParityLikeTxTracer.cs | 2 +- .../Tracing/Proofs/ProofTxTracer.cs | 2 +- .../Nethermind.Evm/Tracing/TxTracer.cs | 2 +- .../Execution/TxBundleSimulator.cs | 2 +- .../Create2DeployerContractRewriter.cs | 34 +++++++++++++ .../Nethermind.Optimism/IOPConfigHelper.cs | 6 +-- .../InitializeBlockchainOptimism.cs | 27 ++++++++++ .../Nethermind.Optimism/OPConfigHelper.cs | 7 +-- .../OptimismBlockProcessor.cs | 47 +++++++++++++++++ .../OptimismBlockProducerEnvFactory.cs | 27 ++++++++-- .../OptimismBlockReceiptTracer.cs | 50 +++++++++++++++++++ .../OptimismTransactionProcessor.cs | 42 +--------------- .../ChainSpecStyle/ChainSpecLoader.cs | 1 - .../ChainSpecStyle/Json/ChainSpecJson.cs | 1 - .../ChainSpecStyle/OptimismParameters.cs | 3 -- 31 files changed, 234 insertions(+), 107 deletions(-) create mode 100644 src/Nethermind/Nethermind.Optimism/Create2DeployerContractRewriter.cs create mode 100644 src/Nethermind/Nethermind.Optimism/OptimismBlockProcessor.cs create mode 100644 src/Nethermind/Nethermind.Optimism/OptimismBlockReceiptTracer.cs diff --git a/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs b/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs index 6f5c6a79152..18cf32c18fd 100644 --- a/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs +++ b/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs @@ -70,7 +70,7 @@ public UserOperationTxTracer( public override bool IsTracingAccess => true; public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, - Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + Hash256? stateRoot = null) { Output = output; } diff --git a/src/Nethermind/Nethermind.Consensus/Processing/BlockProcessor.cs b/src/Nethermind/Nethermind.Consensus/Processing/BlockProcessor.cs index 232c125c38b..6244458f7fc 100644 --- a/src/Nethermind/Nethermind.Consensus/Processing/BlockProcessor.cs +++ b/src/Nethermind/Nethermind.Consensus/Processing/BlockProcessor.cs @@ -43,7 +43,7 @@ public partial class BlockProcessor : IBlockProcessor /// We use a single receipt tracer for all blocks. Internally receipt tracer forwards most of the calls /// to any block-specific tracers. /// - private readonly BlockReceiptsTracer _receiptsTracer; + protected BlockReceiptsTracer ReceiptsTracer { get; set; } public BlockProcessor( ISpecProvider? specProvider, @@ -67,7 +67,7 @@ public BlockProcessor( _blockTransactionsExecutor = blockTransactionsExecutor ?? throw new ArgumentNullException(nameof(blockTransactionsExecutor)); _beaconBlockRootHandler = new BeaconBlockRootHandler(); - _receiptsTracer = new BlockReceiptsTracer(); + ReceiptsTracer = new BlockReceiptsTracer(); } public event EventHandler BlockProcessed; @@ -226,13 +226,13 @@ protected virtual TxReceipt[] ProcessBlock( { IReleaseSpec spec = _specProvider.GetSpec(block.Header); - _receiptsTracer.SetOtherTracer(blockTracer); - _receiptsTracer.StartNewBlockTrace(block); + ReceiptsTracer.SetOtherTracer(blockTracer); + ReceiptsTracer.StartNewBlockTrace(block); _beaconBlockRootHandler.ApplyContractStateChanges(block, spec, _stateProvider); _stateProvider.Commit(spec); - TxReceipt[] receipts = _blockTransactionsExecutor.ProcessTransactions(block, options, _receiptsTracer, spec); + TxReceipt[] receipts = _blockTransactionsExecutor.ProcessTransactions(block, options, ReceiptsTracer, spec); if (spec.IsEip4844Enabled) { @@ -242,7 +242,7 @@ protected virtual TxReceipt[] ProcessBlock( block.Header.ReceiptsRoot = receipts.GetReceiptsRoot(spec, block.ReceiptsRoot); ApplyMinerRewards(block, blockTracer, spec); _withdrawalProcessor.ProcessWithdrawals(block, spec); - _receiptsTracer.EndBlockTrace(); + ReceiptsTracer.EndBlockTrace(); _stateProvider.Commit(spec); diff --git a/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs b/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs index 2ad44e0dc61..497c8746716 100644 --- a/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs +++ b/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs @@ -42,7 +42,7 @@ public TestAllTracerWithOutput() public List ReportedActionErrors { get; set; } = new List(); - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { GasSpent = gasSpent; ReturnValue = output; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs index 4eb5ac54b85..0a12ad42f67 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs @@ -24,7 +24,7 @@ public AccessTxTracer(params Address[] addressesToOptimize) _addressesToOptimize = addressesToOptimize; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { GasSpent += gasSpent; } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs index bdb598fce21..6a6e0a0c4f6 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs @@ -42,7 +42,7 @@ public static AlwaysCancelTxTracer Instance public bool IsTracingAccess => true; public bool IsTracingFees => true; - public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) => throw new OperationCanceledException(ErrorMessage); + public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) => throw new OperationCanceledException(ErrorMessage); public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) => throw new OperationCanceledException(ErrorMessage); diff --git a/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs index c90d81ad8b8..87f64ec901e 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs @@ -12,7 +12,7 @@ namespace Nethermind.Evm.Tracing; public class BlockReceiptsTracer : IBlockTracer, ITxTracer, IJournal, ITxTracerWrapper { - private Block _block = null!; + protected Block Block = null!; public bool IsTracingReceipt => true; public bool IsTracingActions => _currentTxTracer.IsTracingActions; public bool IsTracingOpLevelStorage => _currentTxTracer.IsTracingOpLevelStorage; @@ -30,26 +30,26 @@ public class BlockReceiptsTracer : IBlockTracer, ITxTracer, IJournal, ITxTr private IBlockTracer _otherTracer = NullBlockTracer.Instance; - public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { - _txReceipts.Add(BuildReceipt(recipient, gasSpent, StatusCode.Success, logs, stateRoot, depositNonce, depositReceiptVersion)); + _txReceipts.Add(BuildReceipt(recipient, gasSpent, StatusCode.Success, logs, stateRoot)); // hacky way to support nested receipt tracers if (_otherTracer is ITxTracer otherTxTracer) { - otherTxTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot, depositNonce, depositReceiptVersion); + otherTxTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot); } if (_currentTxTracer.IsTracingReceipt) { // TODO: is no stateRoot a bug? - _currentTxTracer.MarkAsSuccess(recipient, gasSpent, output, logs, null, depositNonce, depositReceiptVersion); + _currentTxTracer.MarkAsSuccess(recipient, gasSpent, output, logs, null); } } public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { - _txReceipts.Add(BuildFailedReceipt(recipient, gasSpent, error, stateRoot, depositNonce, depositReceiptVersion)); + _txReceipts.Add(BuildFailedReceipt(recipient, gasSpent, error, stateRoot)); // hacky way to support nested receipt tracers if (_otherTracer is ITxTracer otherTxTracer) @@ -64,34 +64,32 @@ public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string } } - private TxReceipt BuildFailedReceipt(Address recipient, long gasSpent, string error, Hash256? stateRoot, ulong? depositNonce, ulong? depositReceiptVersion) + protected TxReceipt BuildFailedReceipt(Address recipient, long gasSpent, string error, Hash256? stateRoot) { - TxReceipt receipt = BuildReceipt(recipient, gasSpent, StatusCode.Failure, Array.Empty(), stateRoot, depositNonce, depositReceiptVersion); + TxReceipt receipt = BuildReceipt(recipient, gasSpent, StatusCode.Failure, Array.Empty(), stateRoot); receipt.Error = error; return receipt; } - private TxReceipt BuildReceipt(Address recipient, long spentGas, byte statusCode, LogEntry[] logEntries, Hash256? stateRoot, ulong? depositNonce, ulong? depositReceiptVersion) + protected virtual TxReceipt BuildReceipt(Address recipient, long spentGas, byte statusCode, LogEntry[] logEntries, Hash256? stateRoot) { - Transaction transaction = _currentTx!; + Transaction transaction = CurrentTx!; TxReceipt txReceipt = new() { Logs = logEntries, TxType = transaction.Type, Bloom = logEntries.Length == 0 ? Bloom.Empty : new Bloom(logEntries), - GasUsedTotal = _block.GasUsed, + GasUsedTotal = Block.GasUsed, StatusCode = statusCode, Recipient = transaction.IsContractCreation ? null : recipient, - BlockHash = _block.Hash, - BlockNumber = _block.Number, + BlockHash = Block.Hash, + BlockNumber = Block.Number, Index = _currentIndex, GasUsed = spentGas, Sender = transaction.SenderAddress, ContractAddress = transaction.IsContractCreation ? recipient : null, TxHash = transaction.Hash, - PostTransactionState = stateRoot, - DepositNonce = depositNonce, - DepositReceiptVersion = depositReceiptVersion + PostTransactionState = stateRoot }; return txReceipt; @@ -197,7 +195,7 @@ public void ReportFees(UInt256 fees, UInt256 burntFees) private ITxTracer _currentTxTracer = NullTxTracer.Instance; private int _currentIndex; private readonly List _txReceipts = new(); - private Transaction? _currentTx; + protected Transaction? CurrentTx; public IReadOnlyList TxReceipts => _txReceipts; public TxReceipt LastReceipt => _txReceipts[^1]; public bool IsTracingRewards => _otherTracer.IsTracingRewards; @@ -215,7 +213,7 @@ public void Restore(int snapshot) _txReceipts.RemoveAt(_txReceipts.Count - 1); } - _block.Header.GasUsed = _txReceipts.Count > 0 ? _txReceipts.Last().GasUsedTotal : 0; + Block.Header.GasUsed = _txReceipts.Count > 0 ? _txReceipts.Last().GasUsedTotal : 0; } public void ReportReward(Address author, string rewardType, UInt256 rewardValue) => @@ -228,7 +226,7 @@ public void StartNewBlockTrace(Block block) throw new InvalidOperationException("other tracer not set in receipts tracer"); } - _block = block; + Block = block; _currentIndex = 0; _txReceipts.Clear(); @@ -237,7 +235,7 @@ public void StartNewBlockTrace(Block block) public ITxTracer StartNewTxTrace(Transaction? tx) { - _currentTx = tx; + CurrentTx = tx; _currentTxTracer = _otherTracer.StartNewTxTrace(tx); return _currentTxTracer; } @@ -254,7 +252,7 @@ public void EndBlockTrace() if (_txReceipts.Count > 0) { Bloom blockBloom = new(); - _block.Header.Bloom = blockBloom; + Block.Header.Bloom = blockBloom; for (int index = 0; index < _txReceipts.Count; index++) { TxReceipt? receipt = _txReceipts[index]; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs index 5e95de9742b..f9c3c1dd071 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs @@ -17,7 +17,7 @@ public class CallOutputTracer : TxTracer public byte StatusCode { get; set; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { GasSpent = gasSpent; ReturnValue = output; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs index 30fc1175522..f980b3c36ae 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs @@ -168,12 +168,12 @@ public void ReportStorageRead(in StorageCell storageCell) } } - public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { _token.ThrowIfCancellationRequested(); if (_innerTracer.IsTracingReceipt) { - _innerTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot, depositNonce, depositReceiptVersion); + _innerTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot); } } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs index efe25b3063e..1e2bcd367ae 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs @@ -125,14 +125,14 @@ public void ReportStorageRead(in StorageCell storageCell) } } - public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { for (int index = 0; index < _txTracers.Count; index++) { ITxTracer innerTracer = _txTracers[index]; if (innerTracer.IsTracingReceipt) { - innerTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot, depositNonce, depositReceiptVersion); + innerTracer.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot); } } } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs index 6522dffe2e2..2f30559d218 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs @@ -35,7 +35,7 @@ public EstimateGasTracer() public byte StatusCode { get; set; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { GasSpent = gasSpent; ReturnValue = output; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs b/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs index 60cdcac293b..c747115fd88 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs @@ -106,7 +106,7 @@ public OutOfGasTracer() public override bool IsTracingInstructions => true; public bool OutOfGas { get; private set; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxMemoryTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxMemoryTracer.cs index 59c7a439c0e..c361051e709 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxMemoryTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxMemoryTracer.cs @@ -14,9 +14,9 @@ public class GethLikeTxMemoryTracer : GethLikeTxTracer { public GethLikeTxMemoryTracer(GethTraceOptions options) : base(options) => IsTracingMemory = IsTracingFullMemory; - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { - base.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot, depositNonce, depositReceiptVersion); + base.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot); Trace.Gas = gasSpent; } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs index d0746a3348f..12f4d98b8f6 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs @@ -29,7 +29,7 @@ protected GethLikeTxTracer(GethTraceOptions options) public sealed override bool IsTracingStack { get; protected set; } protected bool IsTracingFullMemory { get; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { Trace.ReturnValue = output; } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs index d9416674859..0a9d389269f 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs @@ -200,9 +200,9 @@ public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? outp _ctx.error = error; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { - base.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot, depositNonce, depositReceiptVersion); + base.MarkAsSuccess(recipient, gasSpent, output, logs, stateRoot); _ctx.gasUsed = gasSpent; _ctx.Output = output; } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs index debf9363e51..42dac85e4a5 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs @@ -146,7 +146,7 @@ public interface ITxTracer : IWorldStateTracer, IDisposable /// Logs for transaction /// State root after transaction, depends on EIP-658 /// Depends on - void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null); + void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null); /// /// Transaction failed diff --git a/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs index 9ee64d7a5fb..cd58b4f2612 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs @@ -22,7 +22,7 @@ private NullTxTracer() { } [StackTraceHidden] private static void ThrowInvalidOperationException() => throw new InvalidOperationException(ErrorMessage); - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) => ThrowInvalidOperationException(); public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) => ThrowInvalidOperationException(); diff --git a/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs index 3543163c00f..d7da4156be8 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs @@ -215,7 +215,7 @@ private void PopAction() _currentAction = _actionStack.Count == 0 ? null : _actionStack.Peek(); } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { if (_currentAction is not null) { diff --git a/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs index 3a01e26ad5d..29de42e28f7 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs @@ -95,7 +95,7 @@ public override void ReportAccountRead(Address address) Accounts.Add(address); } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { Output = output; } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs index 38d631be237..698dceb6c93 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs @@ -48,7 +48,7 @@ public virtual void ReportAccountRead(Address address) { } public virtual void ReportStorageChange(in ReadOnlySpan key, in ReadOnlySpan value) { } public virtual void ReportStorageChange(in StorageCell storageCell, byte[] before, byte[] after) { } public virtual void ReportStorageRead(in StorageCell storageCell) { } - public virtual void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { } + public virtual void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { } public virtual void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { } public virtual void StartOperation(int depth, long gas, Instruction opcode, int pc, bool isPostMerge = false) { } public virtual void ReportOperationError(EvmExceptionType error) { } diff --git a/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs b/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs index fed5c8a3054..75f337b6790 100644 --- a/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs +++ b/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs @@ -197,7 +197,7 @@ public BundleTxTracer(Address beneficiary, Transaction? transaction, int index) public bool Success { get; private set; } public string? Error { get; private set; } - public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { GasSpent = gasSpent; Success = true; diff --git a/src/Nethermind/Nethermind.Optimism/Create2DeployerContractRewriter.cs b/src/Nethermind/Nethermind.Optimism/Create2DeployerContractRewriter.cs new file mode 100644 index 00000000000..5485998ec55 --- /dev/null +++ b/src/Nethermind/Nethermind.Optimism/Create2DeployerContractRewriter.cs @@ -0,0 +1,34 @@ +// SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using Nethermind.Blockchain; +using Nethermind.Blockchain.Find; +using Nethermind.Core; +using Nethermind.Core.Specs; +using Nethermind.State; + +namespace Nethermind.Optimism; + +public class Create2DeployerContractRewriter +{ + private IOPConfigHelper _opConfigHelper; + private ISpecProvider _specProvider; + private IBlockTree _blockTree; + + public Create2DeployerContractRewriter(IOPConfigHelper opConfigHelper, ISpecProvider specProvider, IBlockTree blockTree) + { + _opConfigHelper = opConfigHelper; + _specProvider = specProvider; + _blockTree = blockTree; + } + + public void RewriteContract(BlockHeader header, IWorldState worldState) + { + IReleaseSpec spec = _specProvider.GetSpec(header); + BlockHeader? parent = _blockTree.FindParent(header, BlockTreeLookupOptions.None)?.Header; + if ((parent is null || !_opConfigHelper.IsCanyon(parent)) && _opConfigHelper.IsCanyon(header)) + { + worldState.InsertCode(_opConfigHelper.Create2DeployerAddress!, _opConfigHelper.Create2DeployerCode, spec); + } + } +} diff --git a/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs b/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs index fbdfc2d0721..e59e591d4b4 100644 --- a/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs +++ b/src/Nethermind/Nethermind.Optimism/IOPConfigHelper.cs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: LGPL-3.0-only using Nethermind.Core; -using Nethermind.Core.Crypto; namespace Nethermind.Optimism; @@ -13,7 +12,6 @@ public interface IOPConfigHelper bool IsBedrock(BlockHeader header); bool IsRegolith(BlockHeader header); bool IsCanyon(BlockHeader header); - Address Create2DeployerAddress { get; } - Hash256 Create2DeployerCodeHash { get; } - byte[] Create2DeployerCode { get; } + Address? Create2DeployerAddress { get; } + byte[]? Create2DeployerCode { get; } } diff --git a/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs b/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs index 89b0e3db2c5..fb7b53726ff 100644 --- a/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs +++ b/src/Nethermind/Nethermind.Optimism/InitializeBlockchainOptimism.cs @@ -5,6 +5,7 @@ using Nethermind.Api; using Nethermind.Blockchain.Services; using Nethermind.Config; +using Nethermind.Consensus.Processing; using Nethermind.Consensus.Producers; using Nethermind.Consensus.Validators; using Nethermind.Evm; @@ -80,6 +81,32 @@ protected override IBlockValidator CreateBlockValidator() return new InvalidBlockInterceptor(blockValidator, _api.InvalidChainTracker, _api.LogManager); } + protected override BlockProcessor CreateBlockProcessor() + { + if (_api.DbProvider is null) throw new StepDependencyException(nameof(_api.DbProvider)); + if (_api.RewardCalculatorSource is null) throw new StepDependencyException(nameof(_api.RewardCalculatorSource)); + if (_api.TransactionProcessor is null) throw new StepDependencyException(nameof(_api.TransactionProcessor)); + if (_api.SpecHelper is null) throw new StepDependencyException(nameof(_api.SpecHelper)); + if (_api.SpecProvider is null) throw new StepDependencyException(nameof(_api.SpecProvider)); + if (_api.BlockTree is null) throw new StepDependencyException(nameof(_api.BlockTree)); + if (_api.WorldState is null) throw new StepDependencyException(nameof(_api.WorldState)); + + Create2DeployerContractRewriter contractRewriter = + new(_api.SpecHelper, _api.SpecProvider, _api.BlockTree); + + return new OptimismBlockProcessor( + _api.SpecProvider, + _api.BlockValidator, + _api.RewardCalculatorSource.Get(_api.TransactionProcessor!), + new BlockProcessor.BlockValidationTransactionsExecutor(_api.TransactionProcessor, _api.WorldState), + _api.WorldState, + _api.ReceiptStorage, + _api.WitnessCollector, + _api.LogManager, + _api.SpecHelper, + contractRewriter); + } + protected override IUnclesValidator CreateUnclesValidator() => Always.Valid; protected override IHealthHintService CreateHealthHintService() => diff --git a/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs b/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs index cd05e52f1c8..3902d88b024 100644 --- a/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs +++ b/src/Nethermind/Nethermind.Optimism/OPConfigHelper.cs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: LGPL-3.0-only using Nethermind.Core; -using Nethermind.Core.Crypto; using Nethermind.Specs.ChainSpecStyle; namespace Nethermind.Optimism; @@ -23,7 +22,6 @@ public OPSpecHelper(OptimismParameters parameters) L1FeeReceiver = parameters.L1FeeRecipient; Create2DeployerCode = parameters.Create2DeployerCode; Create2DeployerAddress = parameters.Create2DeployerAddress; - Create2DeployerCodeHash = parameters.Create2DeployerCodeHash; } public bool IsRegolith(BlockHeader header) @@ -41,7 +39,6 @@ public bool IsCanyon(BlockHeader header) return header.Timestamp >= (_canyonTimestamp ?? long.MaxValue); } - public Address Create2DeployerAddress { get; } - public Hash256 Create2DeployerCodeHash { get; } - public byte[] Create2DeployerCode { get; } + public Address? Create2DeployerAddress { get; } + public byte[]? Create2DeployerCode { get; } } diff --git a/src/Nethermind/Nethermind.Optimism/OptimismBlockProcessor.cs b/src/Nethermind/Nethermind.Optimism/OptimismBlockProcessor.cs new file mode 100644 index 00000000000..50389d91351 --- /dev/null +++ b/src/Nethermind/Nethermind.Optimism/OptimismBlockProcessor.cs @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using System; +using Nethermind.Blockchain.Receipts; +using Nethermind.Consensus.Processing; +using Nethermind.Consensus.Rewards; +using Nethermind.Consensus.Validators; +using Nethermind.Consensus.Withdrawals; +using Nethermind.Core; +using Nethermind.Core.Specs; +using Nethermind.Evm.Tracing; +using Nethermind.Logging; +using Nethermind.State; + +namespace Nethermind.Optimism; + +public class OptimismBlockProcessor : BlockProcessor +{ + private Create2DeployerContractRewriter? _contractRewriter; + + public OptimismBlockProcessor( + ISpecProvider? specProvider, + IBlockValidator? blockValidator, + IRewardCalculator? rewardCalculator, + IBlockProcessor.IBlockTransactionsExecutor? blockTransactionsExecutor, + IWorldState? stateProvider, + IReceiptStorage? receiptStorage, + IWitnessCollector? witnessCollector, + ILogManager? logManager, + IOPConfigHelper opConfigHelper, + Create2DeployerContractRewriter contractRewriter, + IWithdrawalProcessor? withdrawalProcessor = null) + : base(specProvider, blockValidator, rewardCalculator, blockTransactionsExecutor, + stateProvider, receiptStorage, witnessCollector, logManager, withdrawalProcessor) + { + ArgumentNullException.ThrowIfNull(stateProvider); + _contractRewriter = contractRewriter; + ReceiptsTracer = new OptimismBlockReceiptTracer(opConfigHelper, stateProvider); + } + + protected override TxReceipt[] ProcessBlock(Block block, IBlockTracer blockTracer, ProcessingOptions options) + { + _contractRewriter?.RewriteContract(block.Header, _stateProvider); + return base.ProcessBlock(block, blockTracer, options); + } +} diff --git a/src/Nethermind/Nethermind.Optimism/OptimismBlockProducerEnvFactory.cs b/src/Nethermind/Nethermind.Optimism/OptimismBlockProducerEnvFactory.cs index 7393e7fdfa8..42df6a18aa3 100644 --- a/src/Nethermind/Nethermind.Optimism/OptimismBlockProducerEnvFactory.cs +++ b/src/Nethermind/Nethermind.Optimism/OptimismBlockProducerEnvFactory.cs @@ -10,14 +10,11 @@ using Nethermind.Consensus.Rewards; using Nethermind.Consensus.Transactions; using Nethermind.Consensus.Validators; -using Nethermind.Core; +using Nethermind.Consensus.Withdrawals; using Nethermind.Core.Specs; -using Nethermind.Db; -using Nethermind.Evm.TransactionProcessing; using Nethermind.Logging; using Nethermind.Specs.ChainSpecStyle; using Nethermind.State; -using Nethermind.Trie.Pruning; using Nethermind.TxPool; namespace Nethermind.Optimism; @@ -74,4 +71,26 @@ protected override ITxSource CreateTxSourceForProducer(ITxSource? additionalTxSo return new OptimismTxPoolTxSource(baseTxSource); } + + protected override BlockProcessor CreateBlockProcessor( + ReadOnlyTxProcessingEnv readOnlyTxProcessingEnv, + ISpecProvider specProvider, + IBlockValidator blockValidator, + IRewardCalculatorSource rewardCalculatorSource, + IReceiptStorage receiptStorage, + ILogManager logManager, + IBlocksConfig blocksConfig) + { + return new OptimismBlockProcessor(specProvider, + blockValidator, + rewardCalculatorSource.Get(readOnlyTxProcessingEnv.TransactionProcessor), + TransactionsExecutorFactory.Create(readOnlyTxProcessingEnv), + readOnlyTxProcessingEnv.StateProvider, + receiptStorage, + NullWitnessCollector.Instance, + logManager, + _specHelper, + new Create2DeployerContractRewriter(_specHelper, _specProvider, _blockTree), + new BlockProductionWithdrawalProcessor(new WithdrawalProcessor(readOnlyTxProcessingEnv.StateProvider, logManager))); + } } diff --git a/src/Nethermind/Nethermind.Optimism/OptimismBlockReceiptTracer.cs b/src/Nethermind/Nethermind.Optimism/OptimismBlockReceiptTracer.cs new file mode 100644 index 00000000000..95048f27080 --- /dev/null +++ b/src/Nethermind/Nethermind.Optimism/OptimismBlockReceiptTracer.cs @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2023 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using System; +using Nethermind.Core; +using Nethermind.Core.Crypto; +using Nethermind.Evm.Tracing; +using Nethermind.State; + +namespace Nethermind.Optimism; + +public class OptimismBlockReceiptTracer : BlockReceiptsTracer +{ + private IOPConfigHelper _opConfigHelper; + private IWorldState _worldState; + + public OptimismBlockReceiptTracer(IOPConfigHelper opConfigHelper, IWorldState worldState) + { + _opConfigHelper = opConfigHelper; + _worldState = worldState; + } + + private (ulong?, ulong?) GetDepositReceiptData(BlockHeader header) + { + ArgumentNullException.ThrowIfNull(CurrentTx); + + ulong? depositNonce = null; + ulong? version = null; + + if (CurrentTx.IsDeposit()) + { + depositNonce = _worldState.GetNonce(CurrentTx.SenderAddress!).ToUInt64(null); + if (_opConfigHelper.IsCanyon(header)) + { + version = 1; + } + } + + return (depositNonce == 0 ? 0 : depositNonce - 1, version); + } + + protected override TxReceipt BuildReceipt(Address recipient, long spentGas, byte statusCode, LogEntry[] logEntries, Hash256? stateRoot) + { + (ulong? depositNonce, ulong? version) = GetDepositReceiptData(Block.Header); + TxReceipt receipt = base.BuildReceipt(recipient, spentGas, statusCode, logEntries, stateRoot); + receipt.DepositNonce = depositNonce; + receipt.DepositReceiptVersion = version; + return receipt; + } +} diff --git a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs index b77fb7a8545..45239780a23 100644 --- a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs +++ b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs @@ -35,7 +35,6 @@ public OptimismTransactionProcessor( protected override void Execute(Transaction tx, BlockExecutionContext blCtx, ITxTracer tracer, ExecutionOptions opts) { IReleaseSpec spec = SpecProvider.GetSpec(blCtx.Header); - ApplyCanyonTransition(blCtx.Header, spec); _currentTxL1Cost = null; if (tx.IsDeposit()) { @@ -48,47 +47,12 @@ protected override void Execute(Transaction tx, BlockExecutionContext blCtx, ITx base.Execute(tx, blCtx, tracer, opts); } - private void ApplyCanyonTransition(BlockHeader header, IReleaseSpec spec) - { - // TODO: create OpBlockProcessor - if (_opConfigHelper.IsCanyon(header)) - { - Hash256? currentHash = WorldState.AccountExists(_opConfigHelper.Create2DeployerAddress) - ? WorldState.GetCodeHash(_opConfigHelper.Create2DeployerAddress) - : null; - - if (currentHash != _opConfigHelper.Create2DeployerCodeHash) - { - WorldState.InsertCode(_opConfigHelper.Create2DeployerAddress, _opConfigHelper.Create2DeployerCode, spec); - } - } - } - - private (ulong?, ulong?) GetDepositReceiptData(Transaction tx, BlockHeader header) - { - ulong? depositNonce = null; - ulong? version = null; - - if (tx.IsDeposit()) - { - depositNonce = WorldState.GetNonce(tx.SenderAddress!).ToUInt64(null); - if (_opConfigHelper.IsCanyon(header)) - { - version = 1; - } - } - - return (depositNonce == 0 ? 0 : depositNonce - 1, version); - } - protected override void TraceReceiptFailure(ITxTracer tracer, Transaction tx, BlockHeader header, Address executingAccount, long spentGas, byte[] output, string error, IReleaseSpec spec) { // TODO: tx.Sender == executingAccount? if (tracer.IsTracingReceipt) { - (ulong? depositNonce, ulong? version) = GetDepositReceiptData(tx, header); - - tracer.MarkAsFailed(executingAccount, spentGas, output, error, null, depositNonce, version); + tracer.MarkAsFailed(executingAccount, spentGas, output, error, null); } } @@ -97,9 +61,7 @@ protected override void TraceReceiptSuccess(ITxTracer tracer, Transaction tx, Bl // TODO: tx.Sender == executingAccount? if (tracer.IsTracingReceipt) { - (ulong? depositNonce, ulong? version) = GetDepositReceiptData(tx, header); - - tracer.MarkAsSuccess(executingAccount, spentGas, output, logs, null, depositNonce, version); + tracer.MarkAsSuccess(executingAccount, spentGas, output, logs, null); } } diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs index 01adec4047f..ec649bbda53 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecLoader.cs @@ -348,7 +348,6 @@ static AuRaParameters.Validator LoadValidator(ChainSpecJson.AuRaValidatorJson va L1BlockAddress = chainSpecJson.Engine.Optimism.L1BlockAddress, CanyonBaseFeeChangeDenominator = chainSpecJson.Engine.Optimism.CanyonBaseFeeChangeDenominator, Create2DeployerAddress = chainSpecJson.Engine.Optimism.Create2DeployerAddress, - Create2DeployerCodeHash = chainSpecJson.Engine.Optimism.Create2DeployerCodeHash, Create2DeployerCode = chainSpecJson.Engine.Optimism.Create2DeployerCode }; } diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs index 7b473a36154..d38056916e0 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs @@ -177,7 +177,6 @@ internal class OptimismEngineJson public Address L1BlockAddress => Params.L1BlockAddress; public UInt256 CanyonBaseFeeChangeDenominator => Params.CanyonBaseFeeChangeDenominator; public Address Create2DeployerAddress => Params.Create2DeployerAddress; - public Hash256 Create2DeployerCodeHash => Params.Create2DeployerCodeHash; public byte[] Create2DeployerCode => Params.Create2DeployerCode; public OptimismEngineParamsJson Params { get; set; } } diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs index d8550702305..b2439224257 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/OptimismParameters.cs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: LGPL-3.0-only using Nethermind.Core; -using Nethermind.Core.Crypto; using Nethermind.Int256; namespace Nethermind.Specs.ChainSpecStyle @@ -23,8 +22,6 @@ public class OptimismParameters public Address Create2DeployerAddress { get; set; } - public Hash256 Create2DeployerCodeHash { get; set; } - public byte[] Create2DeployerCode { get; set; } } } From 19880cf09c7f1557a056bd1101ac187aabbab279 Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Thu, 21 Dec 2023 00:40:55 +0300 Subject: [PATCH 07/15] MarkAsFailed --- .../Executor/UserOperationTracer.cs | 2 +- .../Nethermind.Evm.Test/TestAllTracerWithOutput.cs | 2 +- src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs | 2 +- .../Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs | 2 +- .../Nethermind.Evm/Tracing/BlockReceiptsTracer.cs | 6 +++--- src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs | 2 +- .../Nethermind.Evm/Tracing/CancellationTxTracer.cs | 4 ++-- src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs | 4 ++-- src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs | 2 +- src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs | 2 +- .../Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs | 2 +- .../GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs | 4 ++-- src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs | 2 +- src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs | 2 +- .../Tracing/ParityStyle/ParityLikeTxTracer.cs | 2 +- .../Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs | 2 +- src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs | 2 +- .../Nethermind.Mev/Execution/TxBundleSimulator.cs | 2 +- 18 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs b/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs index 18cf32c18fd..e013a114263 100644 --- a/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs +++ b/src/Nethermind/Nethermind.AccountAbstraction/Executor/UserOperationTracer.cs @@ -76,7 +76,7 @@ public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] outp } public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, - Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + Hash256? stateRoot = null) { Success = false; Error = error; diff --git a/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs b/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs index 497c8746716..4c3388111e7 100644 --- a/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs +++ b/src/Nethermind/Nethermind.Evm.Test/TestAllTracerWithOutput.cs @@ -49,7 +49,7 @@ public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] outp StatusCode = Evm.StatusCode.Success; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null) { GasSpent = gasSpent; Error = error; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs index 0a12ad42f67..00b42ab55a8 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/AccessTxTracer.cs @@ -29,7 +29,7 @@ public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] outp GasSpent += gasSpent; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) { GasSpent += gasSpent; } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs index 6a6e0a0c4f6..a3ddb2a9ca1 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/AlwaysCancelTxTracer.cs @@ -44,7 +44,7 @@ public static AlwaysCancelTxTracer Instance public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) => throw new OperationCanceledException(ErrorMessage); - public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) => throw new OperationCanceledException(ErrorMessage); + public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) => throw new OperationCanceledException(ErrorMessage); public void StartOperation(int depth, long gas, Instruction opcode, int pc, bool isPostMerge = false) => throw new OperationCanceledException(ErrorMessage); diff --git a/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs index 87f64ec901e..c43469bd91c 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/BlockReceiptsTracer.cs @@ -47,20 +47,20 @@ public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEn } } - public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) { _txReceipts.Add(BuildFailedReceipt(recipient, gasSpent, error, stateRoot)); // hacky way to support nested receipt tracers if (_otherTracer is ITxTracer otherTxTracer) { - otherTxTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot, depositNonce, depositReceiptVersion); + otherTxTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot); } if (_currentTxTracer.IsTracingReceipt) { // TODO: is no stateRoot a bug? - _currentTxTracer.MarkAsFailed(recipient, gasSpent, output, error, null, depositNonce, depositReceiptVersion); + _currentTxTracer.MarkAsFailed(recipient, gasSpent, output, error, null); } } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs index f9c3c1dd071..404b6bb66c4 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/CallOutputTracer.cs @@ -24,7 +24,7 @@ public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] outp StatusCode = Evm.StatusCode.Success; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) { GasSpent = gasSpent; Error = error; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs index f980b3c36ae..31759e88649 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/CancellationTxTracer.cs @@ -177,12 +177,12 @@ public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEn } } - public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) { _token.ThrowIfCancellationRequested(); if (_innerTracer.IsTracingReceipt) { - _innerTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot, depositNonce, depositReceiptVersion); + _innerTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot); } } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs index 1e2bcd367ae..c4ad9abfd32 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/CompositeTxTracer.cs @@ -137,14 +137,14 @@ public void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEn } } - public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) { for (int index = 0; index < _txTracers.Count; index++) { ITxTracer innerTracer = _txTracers[index]; if (innerTracer.IsTracingReceipt) { - innerTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot, depositNonce, depositReceiptVersion); + innerTracer.MarkAsFailed(recipient, gasSpent, output, error, stateRoot); } } } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs index 2f30559d218..637eeda9fbe 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/EstimateGasTracer.cs @@ -42,7 +42,7 @@ public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] outp StatusCode = Evm.StatusCode.Success; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null) { GasSpent = gasSpent; Error = error; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs b/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs index c747115fd88..7ae1c6c64a3 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/GasEstimator.cs @@ -110,7 +110,7 @@ public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] outp { } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) { } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs index 12f4d98b8f6..13f4f1c5707 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/GethLikeTxTracer.cs @@ -34,7 +34,7 @@ public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] outp Trace.ReturnValue = output; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null) { Trace.Failed = true; Trace.ReturnValue = output ?? Array.Empty(); diff --git a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs index 0a9d389269f..225d91fc8de 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/GethStyle/JavaScript/GethLikeJavaScriptTxTracer.cs @@ -192,9 +192,9 @@ private void InvokeExit(long gas, ReadOnlyMemory output, string? error = n _depth--; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[]? output, string error, Hash256? stateRoot = null) { - base.MarkAsFailed(recipient, gasSpent, output, error, stateRoot, depositNonce, depositReceiptVersion); + base.MarkAsFailed(recipient, gasSpent, output, error, stateRoot); _ctx.gasUsed = gasSpent; _ctx.Output = output; _ctx.error = error; diff --git a/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs index 42dac85e4a5..ca99d17265e 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/ITxTracer.cs @@ -157,7 +157,7 @@ public interface ITxTracer : IWorldStateTracer, IDisposable /// Error that failed the transaction /// State root after transaction, depends on EIP-658 /// Depends on - void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null); + void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null); /// /// diff --git a/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs index cd58b4f2612..ee1c0bb456a 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/NullTxTracer.cs @@ -24,7 +24,7 @@ private NullTxTracer() { } public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) => ThrowInvalidOperationException(); - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) => ThrowInvalidOperationException(); public override void StartOperation(int depth, long gas, Instruction opcode, int pc, bool isPostMerge = false) => ThrowInvalidOperationException(); diff --git a/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs index d7da4156be8..908a90527d8 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/ParityStyle/ParityLikeTxTracer.cs @@ -230,7 +230,7 @@ public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] outp _trace.Action!.Result!.Output = output; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) { if (_currentAction is not null) { diff --git a/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs index 29de42e28f7..e1d37bb6e14 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/Proofs/ProofTxTracer.cs @@ -100,7 +100,7 @@ public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] outp Output = output; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) { Output = output; } diff --git a/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs b/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs index 698dceb6c93..14343567c4c 100644 --- a/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs +++ b/src/Nethermind/Nethermind.Evm/Tracing/TxTracer.cs @@ -49,7 +49,7 @@ public virtual void ReportStorageChange(in ReadOnlySpan key, in ReadOnlySp public virtual void ReportStorageChange(in StorageCell storageCell, byte[] before, byte[] after) { } public virtual void ReportStorageRead(in StorageCell storageCell) { } public virtual void MarkAsSuccess(Address recipient, long gasSpent, byte[] output, LogEntry[] logs, Hash256? stateRoot = null) { } - public virtual void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) { } + public virtual void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) { } public virtual void StartOperation(int depth, long gas, Instruction opcode, int pc, bool isPostMerge = false) { } public virtual void ReportOperationError(EvmExceptionType error) { } public virtual void ReportOperationRemainingGas(long gas) { } diff --git a/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs b/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs index 75f337b6790..efcd168c850 100644 --- a/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs +++ b/src/Nethermind/Nethermind.Mev/Execution/TxBundleSimulator.cs @@ -203,7 +203,7 @@ public override void MarkAsSuccess(Address recipient, long gasSpent, byte[] outp Success = true; } - public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null, ulong? depositNonce = null, ulong? depositReceiptVersion = null) + public override void MarkAsFailed(Address recipient, long gasSpent, byte[] output, string error, Hash256? stateRoot = null) { GasSpent = gasSpent; Success = false; From f9bedb9e03583cb588f17a0a6651091eea8c3cf7 Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Thu, 21 Dec 2023 00:47:45 +0300 Subject: [PATCH 08/15] Revert TxProcessor --- .../TransactionProcessor.cs | 50 ++++++++----------- .../OptimismTransactionProcessor.cs | 19 ------- 2 files changed, 20 insertions(+), 49 deletions(-) diff --git a/src/Nethermind/Nethermind.Evm/TransactionProcessing/TransactionProcessor.cs b/src/Nethermind/Nethermind.Evm/TransactionProcessing/TransactionProcessor.cs index 5f22f88a8d3..8eb05afb4be 100644 --- a/src/Nethermind/Nethermind.Evm/TransactionProcessing/TransactionProcessor.cs +++ b/src/Nethermind/Nethermind.Evm/TransactionProcessing/TransactionProcessor.cs @@ -179,20 +179,6 @@ protected virtual void Execute(Transaction tx, BlockExecutionContext blCtx, ITxT WorldState.Commit(spec, tracer.IsTracingState ? tracer : NullStateTracer.Instance); } - if (statusCode == StatusCode.Failure) - { - byte[] output = (substate?.ShouldRevert ?? false) ? substate.Output.ToArray() : Array.Empty(); - TraceReceiptFailure(tracer, tx, header, env.ExecutingAccount, spentGas, output, substate?.Error ?? "invalid", spec); - } - else - { - LogEntry[] logs = substate.Logs.Count != 0 ? substate.Logs.ToArray() : Array.Empty(); - TraceReceiptSuccess(tracer, tx, header, env.ExecutingAccount, spentGas, substate.Output.ToArray(), logs, spec); - } - } - - protected virtual void TraceReceiptFailure(ITxTracer tracer, Transaction tx, BlockHeader header, Address executingAccount, long spentGas, byte[] output, string error, IReleaseSpec spec) - { if (tracer.IsTracingReceipt) { Hash256 stateRoot = null; @@ -202,36 +188,40 @@ protected virtual void TraceReceiptFailure(ITxTracer tracer, Transaction tx, Blo stateRoot = WorldState.StateRoot; } - tracer.MarkAsFailed(executingAccount, spentGas, output, error, stateRoot); + if (statusCode == StatusCode.Failure) + { + byte[] output = (substate?.ShouldRevert ?? false) ? substate.Output.ToArray() : Array.Empty(); + tracer.MarkAsFailed(env.ExecutingAccount, spentGas, output, substate?.Error, stateRoot); + } + else + { + LogEntry[] logs = substate.Logs.Count != 0 ? substate.Logs.ToArray() : Array.Empty(); + tracer.MarkAsSuccess(env.ExecutingAccount, spentGas, substate.Output.ToArray(), logs, stateRoot); + } } } - protected virtual void TraceReceiptSuccess(ITxTracer tracer, Transaction tx, BlockHeader header, Address executingAccount, long spentGas, byte[] output, LogEntry[] logs, IReleaseSpec spec) + protected void QuickFail(Transaction tx, BlockHeader block, IReleaseSpec spec, ITxTracer txTracer, string? reason) { - if (tracer.IsTracingReceipt) + block.GasUsed += tx.GasLimit; + + Address recipient = tx.To ?? ContractAddress.From( + tx.SenderAddress ?? Address.Zero, + WorldState.GetNonce(tx.SenderAddress ?? Address.Zero)); + + if (txTracer.IsTracingReceipt) { - Hash256 stateRoot = null; + Hash256? stateRoot = null; if (!spec.IsEip658Enabled) { WorldState.RecalculateStateRoot(); stateRoot = WorldState.StateRoot; } - tracer.MarkAsSuccess(executingAccount, spentGas, output, logs, stateRoot); + txTracer.MarkAsFailed(recipient, tx.GasLimit, Array.Empty(), reason ?? "invalid", stateRoot); } } - protected void QuickFail(Transaction tx, BlockHeader header, IReleaseSpec spec, ITxTracer txTracer, string? reason) - { - header.GasUsed += tx.GasLimit; - - Address recipient = tx.To ?? ContractAddress.From( - tx.SenderAddress ?? Address.Zero, - WorldState.GetNonce(tx.SenderAddress ?? Address.Zero)); - - TraceReceiptFailure(txTracer, tx, header, recipient, tx.GasLimit, Array.Empty(), reason ?? "invalid", spec); - } - /// /// Validates the transaction, in a static manner (i.e. without accesing state/storage). diff --git a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs index 45239780a23..ac0f4c4f2e4 100644 --- a/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs +++ b/src/Nethermind/Nethermind.Optimism/OptimismTransactionProcessor.cs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: LGPL-3.0-only using Nethermind.Core; -using Nethermind.Core.Crypto; using Nethermind.Core.Specs; using Nethermind.Evm; using Nethermind.Evm.Tracing; @@ -47,24 +46,6 @@ protected override void Execute(Transaction tx, BlockExecutionContext blCtx, ITx base.Execute(tx, blCtx, tracer, opts); } - protected override void TraceReceiptFailure(ITxTracer tracer, Transaction tx, BlockHeader header, Address executingAccount, long spentGas, byte[] output, string error, IReleaseSpec spec) - { - // TODO: tx.Sender == executingAccount? - if (tracer.IsTracingReceipt) - { - tracer.MarkAsFailed(executingAccount, spentGas, output, error, null); - } - } - - protected override void TraceReceiptSuccess(ITxTracer tracer, Transaction tx, BlockHeader header, Address executingAccount, long spentGas, byte[] output, LogEntry[] logs, IReleaseSpec spec) - { - // TODO: tx.Sender == executingAccount? - if (tracer.IsTracingReceipt) - { - tracer.MarkAsSuccess(executingAccount, spentGas, output, logs, null); - } - } - protected override bool ValidateStatic(Transaction tx, BlockHeader header, IReleaseSpec spec, ITxTracer tracer, ExecutionOptions opts, out long intrinsicGas) { From 94623247b63ffcfeba0723251e53377c94a00dfe Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Thu, 21 Dec 2023 18:05:55 +0300 Subject: [PATCH 09/15] Fix tests --- .../Nethermind.Mining.Test/MinGasPriceTests.cs | 13 +++++++++++++ .../ChainSpecStyle/ChainParameters.cs | 6 +++--- .../ChainSpecStyle/ChainSpecBasedSpecProvider.cs | 9 +++++---- src/Nethermind/Nethermind.Specs/ReleaseSpec.cs | 6 +++--- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/Nethermind/Nethermind.Mining.Test/MinGasPriceTests.cs b/src/Nethermind/Nethermind.Mining.Test/MinGasPriceTests.cs index 2e613d8c8e9..bd1e9e4db65 100644 --- a/src/Nethermind/Nethermind.Mining.Test/MinGasPriceTests.cs +++ b/src/Nethermind/Nethermind.Mining.Test/MinGasPriceTests.cs @@ -54,6 +54,19 @@ public void Test1559(long minimum, long maxFeePerGas, long maxPriorityFeePerGas, specProvider.GetSpec(Arg.Any(), Arg.Any()).IsEip1559Enabled.Returns(true); specProvider.GetSpec(Arg.Any()).IsEip1559Enabled.Returns(true); specProvider.GetSpec(Arg.Any()).IsEip1559Enabled.Returns(true); + + specProvider.GetSpec(Arg.Any()).ForkBaseFee.Returns(Eip1559Constants.DefaultForkBaseFee); + specProvider.GetSpec(Arg.Any()).BaseFeeMaxChangeDenominator.Returns(Eip1559Constants.DefaultBaseFeeMaxChangeDenominator); + specProvider.GetSpec(Arg.Any()).ElasticityMultiplier.Returns(Eip1559Constants.DefaultElasticityMultiplier); + + specProvider.GetSpec(Arg.Any(), Arg.Any()).ForkBaseFee.Returns(Eip1559Constants.DefaultForkBaseFee); + specProvider.GetSpec(Arg.Any(), Arg.Any()).BaseFeeMaxChangeDenominator.Returns(Eip1559Constants.DefaultBaseFeeMaxChangeDenominator); + specProvider.GetSpec(Arg.Any(), Arg.Any()).ElasticityMultiplier.Returns(Eip1559Constants.DefaultElasticityMultiplier); + + specProvider.GetSpec(Arg.Any()).ForkBaseFee.Returns(Eip1559Constants.DefaultForkBaseFee); + specProvider.GetSpec(Arg.Any()).BaseFeeMaxChangeDenominator.Returns(Eip1559Constants.DefaultBaseFeeMaxChangeDenominator); + specProvider.GetSpec(Arg.Any()).ElasticityMultiplier.Returns(Eip1559Constants.DefaultElasticityMultiplier); + BlocksConfig blocksConfig = new() { MinGasPrice = (UInt256)minimum diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainParameters.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainParameters.cs index 2b5f645602b..817250bc01e 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainParameters.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainParameters.cs @@ -54,11 +54,11 @@ public class ChainParameters public long? Eip3541Transition { get; set; } public long? Eip3607Transition { get; set; } - public UInt256 Eip1559BaseFeeInitialValue { get; set; } + public UInt256? Eip1559BaseFeeInitialValue { get; set; } - public UInt256 Eip1559BaseFeeMaxChangeDenominator { get; set; } + public UInt256? Eip1559BaseFeeMaxChangeDenominator { get; set; } - public long Eip1559ElasticityMultiplier { get; set; } + public long? Eip1559ElasticityMultiplier { get; set; } /// /// Transaction permission managing contract address. diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs index 70c48f7c103..ddaf40fa2b2 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/ChainSpecBasedSpecProvider.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Numerics; using System.Reflection; +using Nethermind.Core; using Nethermind.Core.Collections; using Nethermind.Core.Specs; using Nethermind.Int256; @@ -210,11 +211,11 @@ private static ReleaseSpec CreateReleaseSpec(ChainSpec chainSpec, long releaseSt releaseSpec.Eip1559FeeCollector = releaseSpec.IsEip1559Enabled && (chainSpec.Parameters.Eip1559FeeCollectorTransition ?? long.MaxValue) <= releaseStartBlock ? chainSpec.Parameters.Eip1559FeeCollector : null; releaseSpec.Eip1559BaseFeeMinValue = releaseSpec.IsEip1559Enabled && (chainSpec.Parameters.Eip1559BaseFeeMinValueTransition ?? long.MaxValue) <= releaseStartBlock ? chainSpec.Parameters.Eip1559BaseFeeMinValue : null; - releaseSpec.ElasticityMultiplier = chainSpec.Parameters.Eip1559ElasticityMultiplier; - releaseSpec.ForkBaseFee = chainSpec.Parameters.Eip1559BaseFeeInitialValue; - releaseSpec.BaseFeeMaxChangeDenominator = chainSpec.Parameters.Eip1559BaseFeeMaxChangeDenominator; + releaseSpec.ElasticityMultiplier = chainSpec.Parameters.Eip1559ElasticityMultiplier ?? Eip1559Constants.DefaultElasticityMultiplier; + releaseSpec.ForkBaseFee = chainSpec.Parameters.Eip1559BaseFeeInitialValue ?? Eip1559Constants.DefaultForkBaseFee; + releaseSpec.BaseFeeMaxChangeDenominator = chainSpec.Parameters.Eip1559BaseFeeMaxChangeDenominator ?? Eip1559Constants.DefaultBaseFeeMaxChangeDenominator; - if (chainSpec.Optimism.CanyonTimestamp <= releaseStartTimestamp) + if (chainSpec.Optimism?.CanyonTimestamp <= releaseStartTimestamp) { releaseSpec.BaseFeeMaxChangeDenominator = chainSpec.Optimism.CanyonBaseFeeChangeDenominator; } diff --git a/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs b/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs index e3835cbf40f..5de83c8356b 100644 --- a/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs +++ b/src/Nethermind/Nethermind.Specs/ReleaseSpec.cs @@ -72,9 +72,9 @@ public ReleaseSpec Clone() public ulong Eip4844TransitionTimestamp { get; set; } public Address Eip1559FeeCollector { get; set; } public UInt256? Eip1559BaseFeeMinValue { get; set; } - public UInt256 ForkBaseFee { get; set; } - public UInt256 BaseFeeMaxChangeDenominator { get; set; } - public long ElasticityMultiplier { get; set; } + public UInt256 ForkBaseFee { get; set; } = Eip1559Constants.DefaultForkBaseFee; + public UInt256 BaseFeeMaxChangeDenominator { get; set; } = Eip1559Constants.DefaultBaseFeeMaxChangeDenominator; + public long ElasticityMultiplier { get; set; } = Eip1559Constants.DefaultElasticityMultiplier; public bool IsEip1153Enabled { get; set; } public bool IsEip3651Enabled { get; set; } public bool IsEip3855Enabled { get; set; } From a95f70cf7eeff8fdc56067c4a6ca614a03d1fc0e Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Thu, 21 Dec 2023 18:10:25 +0300 Subject: [PATCH 10/15] Fix tests --- src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs b/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs index ae4c6e925ba..849c25d3364 100644 --- a/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs +++ b/src/Nethermind/Nethermind.Core.Test/BlockHeaderTests.cs @@ -114,6 +114,9 @@ public void Eip_1559_CalculateBaseFee(long gasTarget, long baseFee, long expecte IReleaseSpec releaseSpec = Substitute.For(); releaseSpec.IsEip1559Enabled.Returns(true); releaseSpec.Eip1559BaseFeeMinValue.Returns((UInt256?)minimalBaseFee); + releaseSpec.ForkBaseFee.Returns(Eip1559Constants.DefaultForkBaseFee); + releaseSpec.BaseFeeMaxChangeDenominator.Returns(Eip1559Constants.DefaultBaseFeeMaxChangeDenominator); + releaseSpec.ElasticityMultiplier.Returns(Eip1559Constants.DefaultElasticityMultiplier); BlockHeader blockHeader = Build.A.BlockHeader.TestObject; blockHeader.Number = 2001; @@ -141,6 +144,9 @@ public void Eip_1559_CalculateBaseFee_shared_test_cases((BaseFeeTestCases Info, { IReleaseSpec releaseSpec = Substitute.For(); releaseSpec.IsEip1559Enabled.Returns(true); + releaseSpec.ForkBaseFee.Returns(Eip1559Constants.DefaultForkBaseFee); + releaseSpec.BaseFeeMaxChangeDenominator.Returns(Eip1559Constants.DefaultBaseFeeMaxChangeDenominator); + releaseSpec.ElasticityMultiplier.Returns(Eip1559Constants.DefaultElasticityMultiplier); BlockHeader blockHeader = Build.A.BlockHeader.TestObject; blockHeader.Number = 2001; From 48828f96b5d26a444818992a1d908a4d24490e9d Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Thu, 21 Dec 2023 18:31:56 +0300 Subject: [PATCH 11/15] decoder --- src/Nethermind/Chains/op-goerli.json | 1 - .../ReceiptMessageDecoder.cs | 9 +++++++-- .../ChainSpecStyle/Json/ChainSpecJson.cs | 1 - 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Nethermind/Chains/op-goerli.json b/src/Nethermind/Chains/op-goerli.json index 3a9be11ac01..4c914e34e74 100644 --- a/src/Nethermind/Chains/op-goerli.json +++ b/src/Nethermind/Chains/op-goerli.json @@ -11,7 +11,6 @@ "l1BlockAddress": "0x4200000000000000000000000000000000000015", "canyonBaseFeeChangeDenominator": "250", "create2DeployerAddress": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", - "create2DeployerCodeHash": "0xb0550b5b431e30d38000efb7107aaa0ade03d48a7198a140edda9d27134468b2", "create2DeployerCode": "6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033" } } diff --git a/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs b/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs index 91a97dba5cf..ab14dc7c883 100644 --- a/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs +++ b/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs @@ -57,9 +57,14 @@ public TxReceipt Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBeha { entries[i] = Rlp.Decode(rlpStream, RlpBehaviors.AllowExtraBytes); } - - // TODO: Decode op stuff here txReceipt.Logs = entries; + + if (rlpStream.Position != lastCheck) + { + txReceipt.DepositNonce = rlpStream.DecodeUlong(); + txReceipt.DepositReceiptVersion = rlpStream.DecodeUlong(); + } + return txReceipt; } diff --git a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs index d38056916e0..d819732c34f 100644 --- a/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs +++ b/src/Nethermind/Nethermind.Specs/ChainSpecStyle/Json/ChainSpecJson.cs @@ -190,7 +190,6 @@ internal class OptimismEngineParamsJson public Address L1BlockAddress { get; set; } public UInt256 CanyonBaseFeeChangeDenominator { get; set; } public Address Create2DeployerAddress { get; set; } - public Hash256 Create2DeployerCodeHash { get; set; } public byte[] Create2DeployerCode { get; set; } } From 2085f910874c69b497a5ac0500965ed451947d02 Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Fri, 22 Dec 2023 11:58:26 +0300 Subject: [PATCH 12/15] Fix configs --- src/Nethermind/Chains/base-goerli.json | 15 +++++++++++++-- src/Nethermind/Chains/base-sepolia.json | 13 ++++++++++++- src/Nethermind/Chains/op-sepolia.json | 13 ++++++++++++- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/Nethermind/Chains/base-goerli.json b/src/Nethermind/Chains/base-goerli.json index c414ea94c31..fe4e8e8dcb8 100644 --- a/src/Nethermind/Chains/base-goerli.json +++ b/src/Nethermind/Chains/base-goerli.json @@ -5,7 +5,13 @@ "Optimism": { "params": { "regolithTimestamp": "0x0", - "bedrockBlockNumber": "0x0" + "bedrockBlockNumber": "0x0", + "canyonTimestamp": "0x6553a790", + "l1FeeRecipient": "0x420000000000000000000000000000000000001A", + "l1BlockAddress": "0x4200000000000000000000000000000000000015", + "canyonBaseFeeChangeDenominator": "250", + "create2DeployerAddress": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "create2DeployerCode": "6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033" } } }, @@ -39,12 +45,17 @@ "eip1559Transition": "0x0", "eip1559FeeCollectorTransition": "0x0", "eip1559FeeCollector": "0x4200000000000000000000000000000000000019", - "eip1559ElasticityMultiplier": "0xa", + "eip1559ElasticityMultiplier": "0x6", "eip1559BaseFeeMaxChangeDenominator": "0x32", "eip3198Transition": "0x0", "eip3529Transition": "0x0", "eip3541Transition": "0x0", + "eip4895TransitionTimestamp": "0x6553a790", + "eip3651TransitionTimestamp": "0x6553a790", + "eip3855TransitionTimestamp": "0x6553a790", + "eip3860TransitionTimestamp": "0x6553a790", + "terminalTotalDifficulty": "0" }, "genesis": { diff --git a/src/Nethermind/Chains/base-sepolia.json b/src/Nethermind/Chains/base-sepolia.json index 932a4f347b0..bd64d43f840 100644 --- a/src/Nethermind/Chains/base-sepolia.json +++ b/src/Nethermind/Chains/base-sepolia.json @@ -5,7 +5,13 @@ "Optimism": { "params": { "regolithTimestamp": "0x0", - "bedrockBlockNumber": "0x0" + "bedrockBlockNumber": "0x0", + "canyonTimestamp": "0x6553a790", + "l1FeeRecipient": "0x420000000000000000000000000000000000001A", + "l1BlockAddress": "0x4200000000000000000000000000000000000015", + "canyonBaseFeeChangeDenominator": "250", + "create2DeployerAddress": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "create2DeployerCode": "6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033" } } }, @@ -45,6 +51,11 @@ "eip3529Transition": "0x0", "eip3541Transition": "0x0", + "eip4895TransitionTimestamp": "0x6553a790", + "eip3651TransitionTimestamp": "0x6553a790", + "eip3855TransitionTimestamp": "0x6553a790", + "eip3860TransitionTimestamp": "0x6553a790", + "terminalTotalDifficulty": "0" }, "genesis": { diff --git a/src/Nethermind/Chains/op-sepolia.json b/src/Nethermind/Chains/op-sepolia.json index c95b9a0a992..e34fa5cf082 100644 --- a/src/Nethermind/Chains/op-sepolia.json +++ b/src/Nethermind/Chains/op-sepolia.json @@ -5,7 +5,13 @@ "Optimism": { "params": { "regolithTimestamp": "0x0", - "bedrockBlockNumber": "0x0" + "bedrockBlockNumber": "0x0", + "canyonTimestamp": "0x6553a790", + "l1FeeRecipient": "0x420000000000000000000000000000000000001A", + "l1BlockAddress": "0x4200000000000000000000000000000000000015", + "canyonBaseFeeChangeDenominator": "250", + "create2DeployerAddress": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "create2DeployerCode": "6080604052600436106100435760003560e01c8063076c37b21461004f578063481286e61461007157806356299481146100ba57806366cfa057146100da57600080fd5b3661004a57005b600080fd5b34801561005b57600080fd5b5061006f61006a366004610327565b6100fa565b005b34801561007d57600080fd5b5061009161008c366004610327565b61014a565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100c657600080fd5b506100916100d5366004610349565b61015d565b3480156100e657600080fd5b5061006f6100f53660046103ca565b610172565b61014582826040518060200161010f9061031a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604052610183565b505050565b600061015683836102e7565b9392505050565b600061016a8484846102f0565b949350505050565b61017d838383610183565b50505050565b6000834710156101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e636500000060448201526064015b60405180910390fd5b815160000361025f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f60448201526064016101eb565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610156576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f790000000000000060448201526064016101eb565b60006101568383305b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b61014e806104ad83390190565b6000806040838503121561033a57600080fd5b50508035926020909101359150565b60008060006060848603121561035e57600080fd5b8335925060208401359150604084013573ffffffffffffffffffffffffffffffffffffffff8116811461039057600080fd5b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156103df57600080fd5b8335925060208401359150604084013567ffffffffffffffff8082111561040557600080fd5b818601915086601f83011261041957600080fd5b81358181111561042b5761042b61039b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156104715761047161039b565b8160405282815289602084870101111561048a57600080fd5b826020860160208301376000602084830101528095505050505050925092509256fe608060405234801561001057600080fd5b5061012e806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063249cb3fa14602d575b600080fd5b603c603836600460b1565b604e565b60405190815260200160405180910390f35b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281205460ff16608857600060aa565b7fa2ef4600d742022d532d4747cb3547474667d6f13804902513b2ec01c848f4b45b9392505050565b6000806040838503121560c357600080fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff8116811460ed57600080fd5b80915050925092905056fea26469706673582212205ffd4e6cede7d06a5daf93d48d0541fc68189eeb16608c1999a82063b666eb1164736f6c63430008130033a2646970667358221220fdc4a0fe96e3b21c108ca155438d37c9143fb01278a3c1d274948bad89c564ba64736f6c63430008130033" } } }, @@ -45,6 +51,11 @@ "eip3529Transition": "0x0", "eip3541Transition": "0x0", + "eip4895TransitionTimestamp": "0x6553a790", + "eip3651TransitionTimestamp": "0x6553a790", + "eip3855TransitionTimestamp": "0x6553a790", + "eip3860TransitionTimestamp": "0x6553a790", + "terminalTotalDifficulty": "0" }, "genesis": { From 6fc12d92805246b7e8cb59a471659d2c8b45d018 Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Fri, 22 Dec 2023 20:36:19 +0300 Subject: [PATCH 13/15] base-goerli regolith timestamp --- src/Nethermind/Chains/base-goerli.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nethermind/Chains/base-goerli.json b/src/Nethermind/Chains/base-goerli.json index fe4e8e8dcb8..0b05dce10ae 100644 --- a/src/Nethermind/Chains/base-goerli.json +++ b/src/Nethermind/Chains/base-goerli.json @@ -4,7 +4,7 @@ "engine": { "Optimism": { "params": { - "regolithTimestamp": "0x0", + "regolithTimestamp": "0x6453E490", "bedrockBlockNumber": "0x0", "canyonTimestamp": "0x6553a790", "l1FeeRecipient": "0x420000000000000000000000000000000000001A", From c3fd0fd7764b844d0fd45e8f3df029ca00cd9811 Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Sat, 23 Dec 2023 12:13:48 +0300 Subject: [PATCH 14/15] Fix elasticity multiplier --- src/Nethermind/Chains/base-goerli.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nethermind/Chains/base-goerli.json b/src/Nethermind/Chains/base-goerli.json index 0b05dce10ae..2d1c80ec0e7 100644 --- a/src/Nethermind/Chains/base-goerli.json +++ b/src/Nethermind/Chains/base-goerli.json @@ -45,7 +45,7 @@ "eip1559Transition": "0x0", "eip1559FeeCollectorTransition": "0x0", "eip1559FeeCollector": "0x4200000000000000000000000000000000000019", - "eip1559ElasticityMultiplier": "0x6", + "eip1559ElasticityMultiplier": "0xa", "eip1559BaseFeeMaxChangeDenominator": "0x32", "eip3198Transition": "0x0", "eip3529Transition": "0x0", From e23d708bb445ad9118c08c629260f812e2f30991 Mon Sep 17 00:00:00 2001 From: Nikita Mescheryakov Date: Mon, 1 Jan 2024 20:19:14 +0300 Subject: [PATCH 15/15] Check tx type --- .../Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs b/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs index ab14dc7c883..ce58b0c0c95 100644 --- a/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs +++ b/src/Nethermind/Nethermind.Serialization.Rlp/ReceiptMessageDecoder.cs @@ -59,7 +59,7 @@ public TxReceipt Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBeha } txReceipt.Logs = entries; - if (rlpStream.Position != lastCheck) + if (txReceipt.TxType == TxType.DepositTx && rlpStream.Position != lastCheck) { txReceipt.DepositNonce = rlpStream.DecodeUlong(); txReceipt.DepositReceiptVersion = rlpStream.DecodeUlong();