Skip to content

Commit

Permalink
Honour code hash or account hash config for storing code. Add tests f…
Browse files Browse the repository at this point in the history
…or DB mode

Signed-off-by: Matthew Whitehead <matthew1001@gmail.com>
  • Loading branch information
matthew1001 committed Sep 30, 2024
1 parent f23a8b7 commit 518bb6d
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 107 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import static org.hyperledger.besu.ethereum.trie.diffbased.common.storage.DiffBasedWorldStateKeyValueStorage.WORLD_ROOT_HASH_KEY;

import org.hyperledger.besu.ethereum.bonsai.BonsaiContext;
import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.flat.ArchiveCodeStorageStrategy;
import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.flat.ArchiveFlatDbStrategy;
import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.flat.FullFlatDbStrategy;
import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.flat.PartialFlatDbStrategy;
Expand Down Expand Up @@ -70,8 +69,7 @@ public void loadFlatDbStrategy(final SegmentedKeyValueStorage composedWorldState
} else if (flatDbMode == FlatDbMode.ARCHIVE) {
final BonsaiContext context = new BonsaiContext();
this.flatDbStrategy =
new ArchiveFlatDbStrategy(
context, metricsSystem, new ArchiveCodeStorageStrategy(context));
new ArchiveFlatDbStrategy(context, metricsSystem, codeStorageStrategy);
} else {
this.flatDbStrategy = new PartialFlatDbStrategy(metricsSystem, codeStorageStrategy);
}
Expand Down Expand Up @@ -175,9 +173,16 @@ public FlatDbStrategy getFlatDbStrategy(
public void upgradeToFullFlatDbMode(final SegmentedKeyValueStorage composedWorldStateStorage) {
final SegmentedKeyValueStorageTransaction transaction =
composedWorldStateStorage.startTransaction();
LOG.info("setting FlatDbStrategy to FULL");
transaction.put(
TRIE_BRANCH_STORAGE, FLAT_DB_MODE, FlatDbMode.FULL.getVersion().toArrayUnsafe());
if (dataStorageConfiguration.getDataStorageFormat() == DataStorageFormat.BONSAI) {
LOG.info("setting FlatDbStrategy to FULL");
transaction.put(
TRIE_BRANCH_STORAGE, FLAT_DB_MODE, FlatDbMode.FULL.getVersion().toArrayUnsafe());
} else if (dataStorageConfiguration.getDataStorageFormat()
== DataStorageFormat.BONSAI_ARCHIVE) {
LOG.info("setting FlatDbStrategy to ARCHIVE");
transaction.put(
TRIE_BRANCH_STORAGE, FLAT_DB_MODE, FlatDbMode.ARCHIVE.getVersion().toArrayUnsafe());
}
transaction.commit();
loadFlatDbStrategy(composedWorldStateStorage); // force reload of flat db reader strategy
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import org.hyperledger.besu.datatypes.Hash;
import org.hyperledger.besu.ethereum.storage.keyvalue.KeyValueSegmentIdentifier;
import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.flat.ArchiveFlatDbStrategy;
import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.flat.FullFlatDbStrategy;
import org.hyperledger.besu.ethereum.trie.diffbased.bonsai.storage.flat.PartialFlatDbStrategy;
import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration;
Expand All @@ -45,6 +46,9 @@
class FlatDbStrategyProviderTest {
private final FlatDbStrategyProvider flatDbStrategyProvider =
new FlatDbStrategyProvider(new NoOpMetricsSystem(), DataStorageConfiguration.DEFAULT_CONFIG);
private final FlatDbStrategyProvider archiveFlatDbStrategyProvider =
new FlatDbStrategyProvider(
new NoOpMetricsSystem(), DataStorageConfiguration.DEFAULT_BONSAI_ARCHIVE_CONFIG);
private final SegmentedKeyValueStorage composedWorldStateStorage =
new SegmentedInMemoryKeyValueStorage(
List.of(
Expand Down Expand Up @@ -75,10 +79,25 @@ void upgradesFlatDbStrategyToFullFlatDbMode() {
assertThat(flatDbStrategyProvider.flatDbStrategy).isNotNull();
assertThat(flatDbStrategyProvider.getFlatDbStrategy(composedWorldStateStorage))
.isInstanceOf(FullFlatDbStrategy.class);
assertThat(flatDbStrategyProvider.getFlatDbStrategy(composedWorldStateStorage))
.isNotInstanceOf(ArchiveFlatDbStrategy.class);
assertThat(flatDbStrategyProvider.flatDbStrategy.codeStorageStrategy)
.isInstanceOf(CodeHashCodeStorageStrategy.class);
}

@Test
void upgradesFlatDbStrategyToArchiveFlatDbMode() {
updateFlatDbMode(FlatDbMode.PARTIAL);

archiveFlatDbStrategyProvider.upgradeToFullFlatDbMode(composedWorldStateStorage);
assertThat(archiveFlatDbStrategyProvider.flatDbMode).isEqualTo(FlatDbMode.ARCHIVE);
assertThat(archiveFlatDbStrategyProvider.flatDbStrategy).isNotNull();
assertThat(archiveFlatDbStrategyProvider.getFlatDbStrategy(composedWorldStateStorage))
.isInstanceOf(ArchiveFlatDbStrategy.class);
assertThat(archiveFlatDbStrategyProvider.flatDbStrategy.codeStorageStrategy)
.isInstanceOf(CodeHashCodeStorageStrategy.class);
}

@ParameterizedTest
@ValueSource(booleans = {false, true})
void emptyDbCreatesFlatDbStrategyUsingCodeByHashConfig(final boolean codeByHashEnabled) {
Expand All @@ -104,6 +123,31 @@ void emptyDbCreatesFlatDbStrategyUsingCodeByHashConfig(final boolean codeByHashE
.isInstanceOf(expectedCodeStorageClass);
}

@ParameterizedTest
@ValueSource(booleans = {false, true})
void emptyDbCreatesArchiveFlatDbStrategyUsingCodeByHashConfig(final boolean codeByHashEnabled) {
final DataStorageConfiguration dataStorageConfiguration =
ImmutableDataStorageConfiguration.builder()
.dataStorageFormat(DataStorageFormat.BONSAI_ARCHIVE)
.bonsaiMaxLayersToLoad(DEFAULT_BONSAI_MAX_LAYERS_TO_LOAD)
.unstable(
ImmutableDataStorageConfiguration.Unstable.builder()
.bonsaiCodeStoredByCodeHashEnabled(codeByHashEnabled)
.build())
.build();
final FlatDbStrategyProvider flatDbStrategyProvider =
new FlatDbStrategyProvider(new NoOpMetricsSystem(), dataStorageConfiguration);

flatDbStrategyProvider.loadFlatDbStrategy(composedWorldStateStorage);
final Class<? extends CodeStorageStrategy> expectedCodeStorageClass =
codeByHashEnabled
? CodeHashCodeStorageStrategy.class
: AccountHashCodeStorageStrategy.class;
assertThat(flatDbStrategyProvider.flatDbMode).isEqualTo(FlatDbMode.ARCHIVE);
assertThat(flatDbStrategyProvider.flatDbStrategy.codeStorageStrategy)
.isInstanceOf(expectedCodeStorageClass);
}

@ParameterizedTest
@ValueSource(booleans = {false, true})
void existingAccountHashDbUsesAccountHash(final boolean codeByHashEnabled) {
Expand Down Expand Up @@ -134,6 +178,36 @@ void existingAccountHashDbUsesAccountHash(final boolean codeByHashEnabled) {
.isInstanceOf(AccountHashCodeStorageStrategy.class);
}

@ParameterizedTest
@ValueSource(booleans = {false, true})
void existingAccountHashArchiveDbUsesAccountHash(final boolean codeByHashEnabled) {
final DataStorageConfiguration dataStorageConfiguration =
ImmutableDataStorageConfiguration.builder()
.dataStorageFormat(DataStorageFormat.BONSAI_ARCHIVE)
.bonsaiMaxLayersToLoad(DEFAULT_BONSAI_MAX_LAYERS_TO_LOAD)
.unstable(
ImmutableDataStorageConfiguration.Unstable.builder()
.bonsaiCodeStoredByCodeHashEnabled(codeByHashEnabled)
.build())
.build();
final FlatDbStrategyProvider flatDbStrategyProvider =
new FlatDbStrategyProvider(new NoOpMetricsSystem(), dataStorageConfiguration);

final SegmentedKeyValueStorageTransaction transaction =
composedWorldStateStorage.startTransaction();
final AccountHashCodeStorageStrategy accountHashCodeStorageStrategy =
new AccountHashCodeStorageStrategy();
// key representing account hash just needs to not be the code hash
final Hash accountHash = Hash.wrap(Bytes32.fromHexString("0001"));
accountHashCodeStorageStrategy.putFlatCode(transaction, accountHash, null, Bytes.of(2));
transaction.commit();

flatDbStrategyProvider.loadFlatDbStrategy(composedWorldStateStorage);
assertThat(flatDbStrategyProvider.flatDbMode).isEqualTo(FlatDbMode.ARCHIVE);
assertThat(flatDbStrategyProvider.flatDbStrategy.codeStorageStrategy)
.isInstanceOf(AccountHashCodeStorageStrategy.class);
}

@ParameterizedTest
@ValueSource(booleans = {false, true})
void existingCodeHashDbUsesCodeHash(final boolean codeByHashEnabled) {
Expand Down Expand Up @@ -163,6 +237,35 @@ void existingCodeHashDbUsesCodeHash(final boolean codeByHashEnabled) {
.isInstanceOf(CodeHashCodeStorageStrategy.class);
}

@ParameterizedTest
@ValueSource(booleans = {false, true})
void existingCodeHashArchiveDbUsesCodeHash(final boolean codeByHashEnabled) {
final DataStorageConfiguration dataStorageConfiguration =
ImmutableDataStorageConfiguration.builder()
.dataStorageFormat(DataStorageFormat.BONSAI_ARCHIVE)
.bonsaiMaxLayersToLoad(DEFAULT_BONSAI_MAX_LAYERS_TO_LOAD)
.unstable(
ImmutableDataStorageConfiguration.Unstable.builder()
.bonsaiCodeStoredByCodeHashEnabled(codeByHashEnabled)
.build())
.build();
final FlatDbStrategyProvider flatDbStrategyProvider =
new FlatDbStrategyProvider(new NoOpMetricsSystem(), dataStorageConfiguration);

final SegmentedKeyValueStorageTransaction transaction =
composedWorldStateStorage.startTransaction();

final CodeHashCodeStorageStrategy codeHashCodeStorageStrategy =
new CodeHashCodeStorageStrategy();
codeHashCodeStorageStrategy.putFlatCode(transaction, null, Hash.hash(Bytes.of(1)), Bytes.of(1));
transaction.commit();

flatDbStrategyProvider.loadFlatDbStrategy(composedWorldStateStorage);
assertThat(flatDbStrategyProvider.flatDbMode).isEqualTo(FlatDbMode.ARCHIVE);
assertThat(flatDbStrategyProvider.flatDbStrategy.codeStorageStrategy)
.isInstanceOf(CodeHashCodeStorageStrategy.class);
}

@Test
void downgradesFlatDbStrategyToPartiallyFlatDbMode() {
updateFlatDbMode(FlatDbMode.FULL);
Expand All @@ -174,6 +277,17 @@ void downgradesFlatDbStrategyToPartiallyFlatDbMode() {
.isInstanceOf(PartialFlatDbStrategy.class);
}

@Test
void downgradesArchiveFlatDbStrategyToPartiallyFlatDbMode() {
updateFlatDbMode(FlatDbMode.ARCHIVE);

flatDbStrategyProvider.downgradeToPartialFlatDbMode(composedWorldStateStorage);
assertThat(flatDbStrategyProvider.flatDbMode).isEqualTo(FlatDbMode.PARTIAL);
assertThat(flatDbStrategyProvider.flatDbStrategy).isNotNull();
assertThat(flatDbStrategyProvider.getFlatDbStrategy(composedWorldStateStorage))
.isInstanceOf(PartialFlatDbStrategy.class);
}

private void updateFlatDbMode(final FlatDbMode flatDbMode) {
final SegmentedKeyValueStorageTransaction transaction =
composedWorldStateStorage.startTransaction();
Expand Down

0 comments on commit 518bb6d

Please sign in to comment.