From e98412697bed48e471c375f48a351058d7b19c09 Mon Sep 17 00:00:00 2001 From: Gabriel-Trintinalia Date: Fri, 31 Jan 2025 14:19:47 +0800 Subject: [PATCH] Prague Devnet5 - EIP2935 - Fix edge case when the contract is deployed after the fork (#8211) Signed-off-by: Gabriel-Trintinalia --- .../blockhash/PragueBlockHashProcessor.java | 6 ++++-- .../blockhash/BlockHashProcessorTest.java | 19 +++++++++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java index 5b772f1cd63..4e272a5212d 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/mainnet/blockhash/PragueBlockHashProcessor.java @@ -68,9 +68,11 @@ public void processBlockHashes( super.processBlockHashes(mutableWorldState, currentBlockHeader); WorldUpdater worldUpdater = mutableWorldState.updater(); - final MutableAccount historyStorageAccount = worldUpdater.getOrCreate(historyStorageAddress); + final MutableAccount historyStorageAccount = worldUpdater.getAccount(historyStorageAddress); - if (currentBlockHeader.getNumber() > 0) { + if (historyStorageAccount != null + && historyStorageAccount.getNonce() > 0 + && currentBlockHeader.getNumber() > 0) { storeParentHash(historyStorageAccount, currentBlockHeader); } worldUpdater.commit(); diff --git a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessorTest.java b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessorTest.java index b558b0f2759..98f3788b909 100644 --- a/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessorTest.java +++ b/ethereum/core/src/test/java/org/hyperledger/besu/ethereum/mainnet/blockhash/BlockHashProcessorTest.java @@ -45,8 +45,9 @@ void setUp() { mutableWorldState = mock(MutableWorldState.class); worldUpdater = mock(WorldUpdater.class); account = mock(MutableAccount.class); + when(account.getNonce()).thenReturn(1L); when(mutableWorldState.updater()).thenReturn(worldUpdater); - when(worldUpdater.getOrCreate(PragueBlockHashProcessor.HISTORY_STORAGE_ADDRESS)) + when(worldUpdater.getAccount(PragueBlockHashProcessor.HISTORY_STORAGE_ADDRESS)) .thenReturn(account); } @@ -72,7 +73,7 @@ void shouldNotStoreBlockHashForGenesisBlock() { mockAncestorHeaders(currentBlockHeader, 0); processor.processBlockHashes(mutableWorldState, currentBlockHeader); - verifyNoInteractions(account); + verify(account, times(0)).setStorageValue(any(), any()); } @Test @@ -89,6 +90,20 @@ void shouldStoreAncestorBlockHashesAtForkCorrectlyParentIsGenesis() { verifyAccount(0, historicalWindow); } + @Test + void shouldNotStoreBlockHashIfContractIsNotDeployed() { + when(worldUpdater.getAccount(PragueBlockHashProcessor.HISTORY_STORAGE_ADDRESS)) + .thenReturn(null); + + long currentBlock = 1; + processor = new PragueBlockHashProcessor(); + BlockHeader currentBlockHeader = mockBlockHeader(currentBlock); + mockAncestorHeaders(currentBlockHeader, 0); + + processor.processBlockHashes(mutableWorldState, currentBlockHeader); + verifyNoInteractions(account); + } + @Test void shouldWriteGenesisHashAtSlot0() { processor = new PragueBlockHashProcessor();