diff --git a/CHANGELOG.md b/CHANGELOG.md index fa4ce82bc8d..d4c52a56ba7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ # Changelog ## 23.1 +### Additions and Improvements +- Add access list to Transaction Call Object [#4802](https://github.com/hyperledger/besu/issues/4801) + ### Breaking Changes - GoQuorum-compatible privacy is deprecated and will be removed in 23.4 - IBFT 1.0 is deprecated and will be removed in 23.4 diff --git a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java index c1f87fe846f..a05dc40c274 100644 --- a/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java +++ b/consensus/merge/src/main/java/org/hyperledger/besu/consensus/merge/PostMergeContext.java @@ -139,7 +139,9 @@ public boolean isSyncing() { return Optional.ofNullable(syncState.get()).map(s -> !s.isInSync()).orElse(Boolean.TRUE) // this is necessary for when we do not have a sync target yet, like at startup. // not being stopped at ttd implies we are syncing. - && !syncState.get().hasReachedTerminalDifficulty().orElse(Boolean.FALSE); + && Optional.ofNullable(syncState.get()) + .map(s -> !(s.hasReachedTerminalDifficulty().orElse(Boolean.FALSE))) + .orElse(Boolean.TRUE); } @Override diff --git a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/PostMergeContextTest.java b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/PostMergeContextTest.java index fe9af337ecd..8a88d12d2e1 100644 --- a/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/PostMergeContextTest.java +++ b/consensus/merge/src/test/java/org/hyperledger/besu/consensus/merge/PostMergeContextTest.java @@ -202,6 +202,32 @@ public void tryingToRetrieveABlockPutButEvictedReturnsEmpty() { assertThat(postMergeContext.retrieveBlockById(evictedPayloadId)).isEmpty(); } + @Test + public void syncStateNullShouldNotThrowWhenIsSyncingIsCalled() { + // simulate a possible syncState null when we still have got a syncState set yet. + postMergeContext.setSyncState(null); + assertThat(postMergeContext.isSyncing()).isTrue(); + + // after setting a syncState things should progress as expected. + postMergeContext.setSyncState(mockSyncState); + + // Assuming we're not in sync + when(mockSyncState.isInSync()).thenReturn(Boolean.FALSE); + + when(mockSyncState.hasReachedTerminalDifficulty()).thenReturn(Optional.empty()); + assertThat(postMergeContext.isSyncing()).isTrue(); + + when(mockSyncState.hasReachedTerminalDifficulty()).thenReturn(Optional.of(Boolean.FALSE)); + assertThat(postMergeContext.isSyncing()).isTrue(); + + when(mockSyncState.hasReachedTerminalDifficulty()).thenReturn(Optional.of(Boolean.TRUE)); + assertThat(postMergeContext.isSyncing()).isFalse(); + + // if we're in sync reached ttd does not matter anymore + when(mockSyncState.isInSync()).thenReturn(Boolean.TRUE); + assertThat(postMergeContext.isSyncing()).isFalse(); + } + private static class MergeStateChangeCollector implements MergeStateHandler { final List stateChanges = new ArrayList<>();