From 9c9121a115ecb09f1c3add1fff4da3b102f8b429 Mon Sep 17 00:00:00 2001 From: Daniel Lehrner Date: Mon, 15 Jul 2024 17:02:09 +0200 Subject: [PATCH] persist accounts that have storage updates, but no nonce, balance nor code Signed-off-by: Daniel Lehrner --- .../mainnet/MainnetTransactionProcessor.java | 8 ++++++-- .../besu/evm/worldstate/WorldUpdater.java | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) 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 5984be0e1d5..75fadcc7157 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 @@ -501,7 +501,6 @@ public TransactionProcessingResult processTransaction( coinbaseCalculator.price(usedGas, transactionGasPrice, blockHeader.getBaseFee()); coinbase.incrementBalance(coinbaseWeiDelta); - authorizedCodeService.resetAuthorities(); operationTracer.traceEndTransaction( worldUpdater, @@ -516,8 +515,13 @@ public TransactionProcessingResult processTransaction( initialFrame.getSelfDestructs().forEach(worldState::deleteAccount); if (clearEmptyAccounts) { - worldState.clearAccountsThatAreEmpty(); + // TODO remove for devnet-2 and later as in the new version of 7702 the nonce of the + // authorities is increased + // and will not be cleared anymore in case of storage change only + worldState.clearAccountsThatAreEmpty(authorizedCodeService.getAuthorities()); + // worldState.clearAccountsThatAreEmpty(); } + authorizedCodeService.resetAuthorities(); if (initialFrame.getState() == MessageFrame.State.COMPLETED_SUCCESS) { return TransactionProcessingResult.successful( diff --git a/evm/src/main/java/org/hyperledger/besu/evm/worldstate/WorldUpdater.java b/evm/src/main/java/org/hyperledger/besu/evm/worldstate/WorldUpdater.java index 5144176e799..ed815a1ab0e 100644 --- a/evm/src/main/java/org/hyperledger/besu/evm/worldstate/WorldUpdater.java +++ b/evm/src/main/java/org/hyperledger/besu/evm/worldstate/WorldUpdater.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Optional; +import java.util.Set; import org.apache.tuweni.bytes.Bytes; @@ -175,6 +176,19 @@ default void clearAccountsThatAreEmpty() { .stream().filter(Account::isEmpty).forEach(a -> deleteAccount(a.getAddress())); } + /** + * Clears any accounts that are empty, excluding those in the provided set + * + * @param excludedAddresses the addresses to exclude from deletion + */ + default void clearAccountsThatAreEmpty(final Set
excludedAddresses) { + new ArrayList<>(getTouchedAccounts()) + .stream() + .filter(a -> !excludedAddresses.contains(a.getAddress())) + .filter(Account::isEmpty) + .forEach(a -> deleteAccount(a.getAddress())); + } + /** Mark transaction boundary. */ default void markTransactionBoundary() { // default is to ignore