diff --git a/ethereum/api/src/test/resources/org/hyperledger/besu/ethereum/api/jsonrpc/eth/simulateV1/specs/eth_simulateV1-trie-log.json b/ethereum/api/src/test/resources/org/hyperledger/besu/ethereum/api/jsonrpc/eth/simulateV1/specs/eth_simulateV1-trie-log.json index f3000fb3b9b..03fcb69ca5e 100644 --- a/ethereum/api/src/test/resources/org/hyperledger/besu/ethereum/api/jsonrpc/eth/simulateV1/specs/eth_simulateV1-trie-log.json +++ b/ethereum/api/src/test/resources/org/hyperledger/besu/ethereum/api/jsonrpc/eth/simulateV1/specs/eth_simulateV1-trie-log.json @@ -74,7 +74,7 @@ "timestamp": "0x1ce", "transactions" : [ "0x01227a99771643168026ed4617f14a903a509b9cb98d9caa3928d36b5082ffe3", "0xe413183c27f9777053272f9846aa8d56f0f9ab119c8bd47b5efac84ab58f3af5" ], "transactionsRoot": "0x8df9808c2a8348795f8962e3a33684c00c2816033cb354247f5deaa3c23541cc", - "trieLog" : "0xf905b4a06e71e3172e3547c45bec026423067a121f2ebeaa4cccf2ba8783c3f23fd1f09af901439400000961ef480eb55e80d19ad83579a64c007002f895f84880843b9aca01a00ed2d94007a0eecee7c27c531d1249a18f6c48fe86c6d6e87c50b6943a5f015aa00345a365d2f4c5975b9f1599abe0a2ee76b7a3a731bc68781bd04c84e4858f50f84880843b9aca01a00ed2d94007a0eecee7c27c531d1249a18f6c48fe86c6d6e87c50b6943a5f015aa00345a365d2f4c5975b9f1599abe0a2ee76b7a3a731bc68781bd04c84e4858f508080f894e4a0290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563808080e4a0405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace808080e4a0b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6808080e4a0c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b808080f9013b940000bbddc7ce488642fb579f8b00f3a590007251f88df8448001a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a078c6cb5202685228bbcbfb992b1c4e116c7ec5ef11e25b8e92716cfc628ddd60f8448001a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a078c6cb5202685228bbcbfb992b1c4e116c7ec5ef11e25b8e92716cfc628ddd608080f894e4a0290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563808080e4a0405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace808080e4a0b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6808080e4a0c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b808080f8ed940000f90827f1c53a10cb7a02335b175320002935f88df8448001a010ce6c8acd71ef11f43b5bfeb3bd3352e70a144330ba3919cf575cd5787ab33da06e49e66782037c0555897870e29fa5e552daf4719552131a0abce779daec0a5df8448001a0c0ebc880b835c61f7d6ce818918d562a1e525d97b5498a3dda9a3a5b1ead3cbaa06e49e66782037c0555897870e29fa5e552daf4719552131a0abce779daec0a5d8080f846f844a04a2cc91ee622da3bc833a54c37ffcb6f3ec23b7793efc5eaf5e71b7b406c5c0680a0af51811799f22260e5b4e1f95504dae760505f102dcb2e9ca7d897d8a40124a180f8f394000f3df6d732807ef1319fb7b8bb8522d0beac02f88df844802aa0a7d9c22f383b2fc2fb8db92c324f5906c4d999e9e639eb5beae4ce08e85be195a0f57acd40259872606d76197ef052f3d35588dadf919ee1f0e3cb9b62d3f4b02cf844802aa0cad64d94c0ab1afebaeed15ffcf3c2e8d0b7b448061f90596bca1ab9d3b08da5a0f57acd40259872606d76197ef052f3d35588dadf919ee1f0e3cb9b62d3f4b02c8080f84ce6a05d6f015ab75b09997e10f2fa9ea352d95dce65c2d7ce5ac920ae531c9a381e4a808201ce80e4a07099a2fd6f46d39cd1df0f865dd101c17ce8b8a58ab7fe7195abab9e15e0bcea808080f86194c000000000000000000000000000000000000000f84880f8440180a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470808080f86194c100000000000000000000000000000000000000f84880f8440180a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470808080f86394c200000000000000000000000000000000000000f84a80f846808203e8a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470808080", + "trieLog" : "0xf9066ea06e71e3172e3547c45bec026423067a121f2ebeaa4cccf2ba8783c3f23fd1f09af8b8940000000000000000000000000000000000000000f89ff84d808907d022dbe49dc859aca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470f84d808907d022dbe49dc859aca056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470808080f901439400000961ef480eb55e80d19ad83579a64c007002f895f84880843b9aca01a00ed2d94007a0eecee7c27c531d1249a18f6c48fe86c6d6e87c50b6943a5f015aa00345a365d2f4c5975b9f1599abe0a2ee76b7a3a731bc68781bd04c84e4858f50f84880843b9aca01a00ed2d94007a0eecee7c27c531d1249a18f6c48fe86c6d6e87c50b6943a5f015aa00345a365d2f4c5975b9f1599abe0a2ee76b7a3a731bc68781bd04c84e4858f508080f894e4a0290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563808080e4a0405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace808080e4a0b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6808080e4a0c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b808080f9013b940000bbddc7ce488642fb579f8b00f3a590007251f88df8448001a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a078c6cb5202685228bbcbfb992b1c4e116c7ec5ef11e25b8e92716cfc628ddd60f8448001a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a078c6cb5202685228bbcbfb992b1c4e116c7ec5ef11e25b8e92716cfc628ddd608080f894e4a0290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563808080e4a0405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace808080e4a0b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6808080e4a0c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b808080f8ed940000f90827f1c53a10cb7a02335b175320002935f88df8448001a010ce6c8acd71ef11f43b5bfeb3bd3352e70a144330ba3919cf575cd5787ab33da06e49e66782037c0555897870e29fa5e552daf4719552131a0abce779daec0a5df8448001a0c0ebc880b835c61f7d6ce818918d562a1e525d97b5498a3dda9a3a5b1ead3cbaa06e49e66782037c0555897870e29fa5e552daf4719552131a0abce779daec0a5d8080f846f844a04a2cc91ee622da3bc833a54c37ffcb6f3ec23b7793efc5eaf5e71b7b406c5c0680a0af51811799f22260e5b4e1f95504dae760505f102dcb2e9ca7d897d8a40124a180f8f394000f3df6d732807ef1319fb7b8bb8522d0beac02f88df844802aa0a7d9c22f383b2fc2fb8db92c324f5906c4d999e9e639eb5beae4ce08e85be195a0f57acd40259872606d76197ef052f3d35588dadf919ee1f0e3cb9b62d3f4b02cf844802aa0cad64d94c0ab1afebaeed15ffcf3c2e8d0b7b448061f90596bca1ab9d3b08da5a0f57acd40259872606d76197ef052f3d35588dadf919ee1f0e3cb9b62d3f4b02c8080f84ce6a05d6f015ab75b09997e10f2fa9ea352d95dce65c2d7ce5ac920ae531c9a381e4a808201ce80e4a07099a2fd6f46d39cd1df0f865dd101c17ce8b8a58ab7fe7195abab9e15e0bcea808080f86194c000000000000000000000000000000000000000f84880f8440180a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470808080f86194c100000000000000000000000000000000000000f84880f8440180a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470808080f86394c200000000000000000000000000000000000000f84a80f846808203e8a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470808080", "uncles": [], "withdrawals": [], "withdrawalsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java index 95ca1de98da..33434581d39 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/MainnetTransactionProcessor.java @@ -457,13 +457,13 @@ public TransactionProcessingResult processTransaction( coinbaseCalculator.price(usedGas, transactionGasPrice, blockHeader.getBaseFee()); operationTracer.traceBeforeRewardTransaction(worldUpdater, transaction, coinbaseWeiDelta); - if (!coinbaseWeiDelta.isZero() || !clearEmptyAccounts) { - final var coinbase = worldState.getOrCreate(miningBeneficiary); - initialFrame - .getEip7928AccessList() - .ifPresent(t -> t.addTouchedAccount(coinbase.getAddress())); + + // EIP-158 & EIP-7928: coinbase is considered "touched" even when fees are zero. + // Touching ensures an *empty* coinbase can be deleted during state clearing. + final MutableAccount coinbase = worldState.getOrCreate(miningBeneficiary); + accessLocationTracker.ifPresent(t -> t.addTouchedAccount(miningBeneficiary)); + if (!coinbaseWeiDelta.isZero()) { coinbase.incrementBalance(coinbaseWeiDelta); - accessLocationTracker.ifPresent(t -> t.addTouchedAccount(miningBeneficiary)); } operationTracer.traceEndTransaction( diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorIntegrationTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorIntegrationTest.java index c3bfab979c9..a2556e981b6 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorIntegrationTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/AbstractBlockProcessorIntegrationTest.java @@ -349,6 +349,7 @@ void testProcessBlockZeroReward() { assertBlockAccessListAddresses( sequentialResult, + coinbase, Address.fromHexStringStrict(ACCOUNT_2), Address.fromHexStringStrict(ACCOUNT_3), Address.fromHexStringStrict(ACCOUNT_GENESIS_1), @@ -367,6 +368,7 @@ void testProcessBlockZeroReward() { assertBlockAccessListAddresses( parallelResult, + coinbase, Address.fromHexStringStrict(ACCOUNT_2), Address.fromHexStringStrict(ACCOUNT_3), Address.fromHexStringStrict(ACCOUNT_GENESIS_1),