From 3194987054ea19c800867eda01e372217cbda8d0 Mon Sep 17 00:00:00 2001 From: Luis Pinto Date: Wed, 4 Sep 2024 16:10:02 +0100 Subject: [PATCH] Adapt leaf key types to follow new eip-6800 spec (#67) Signed-off-by: Luis Pinto --- .../trie/verkle/adapter/TrieKeyAdapter.java | 49 ++---------- .../ethereum/trie/verkle/util/Parameters.java | 11 +-- .../trie/verkle/TrieKeyAdapterTest.java | 32 +------- .../trie/verkle/TrieKeyBatchAdapterTest.java | 75 ++++--------------- 4 files changed, 31 insertions(+), 136 deletions(-) diff --git a/src/main/java/org/hyperledger/besu/ethereum/trie/verkle/adapter/TrieKeyAdapter.java b/src/main/java/org/hyperledger/besu/ethereum/trie/verkle/adapter/TrieKeyAdapter.java index 9d54aa1..591f047 100644 --- a/src/main/java/org/hyperledger/besu/ethereum/trie/verkle/adapter/TrieKeyAdapter.java +++ b/src/main/java/org/hyperledger/besu/ethereum/trie/verkle/adapter/TrieKeyAdapter.java @@ -15,17 +15,14 @@ */ package org.hyperledger.besu.ethereum.trie.verkle.adapter; -import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.BALANCE_LEAF_KEY; -import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.CODE_KECCAK_LEAF_KEY; +import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.BASIC_DATA_LEAF_KEY; +import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.CODE_HASH_LEAF_KEY; import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.CODE_OFFSET; -import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.CODE_SIZE_LEAF_KEY; import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.HEADER_STORAGE_OFFSET; import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.HEADER_STORAGE_SIZE; import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.MAIN_STORAGE_OFFSET_SHIFT_LEFT_VERKLE_NODE_WIDTH; -import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.NONCE_LEAF_KEY; import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.VERKLE_NODE_WIDTH; import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.VERKLE_NODE_WIDTH_LOG2; -import static org.hyperledger.besu.ethereum.trie.verkle.util.Parameters.VERSION_LEAF_KEY; import org.hyperledger.besu.ethereum.trie.verkle.hasher.Hasher; @@ -145,53 +142,23 @@ public Bytes32 swapLastByte(Bytes32 base, Bytes subIndex) { } /** - * Generates a version key for a given address. + * Generates a basic data key for a given address. * * @param address The address. * @return The generated version key. */ - public Bytes32 versionKey(Bytes address) { - return headerKey(address, VERSION_LEAF_KEY); + public Bytes32 basicDataKey(Bytes address) { + return headerKey(address, BASIC_DATA_LEAF_KEY); } /** - * Generates a balance key for a given address. - * - * @param address The address. - * @return The generated balance key. - */ - public Bytes32 balanceKey(Bytes address) { - return headerKey(address, BALANCE_LEAF_KEY); - } - - /** - * Generates a nonce key for a given address. - * - * @param address The address. - * @return The generated nonce key. - */ - public Bytes32 nonceKey(Bytes address) { - return headerKey(address, NONCE_LEAF_KEY); - } - - /** - * Generates a code Keccak key for a given address. + * Generates a code hash key for a given address. * * @param address The address. * @return The generated code Keccak key. */ - public Bytes32 codeKeccakKey(Bytes address) { - return headerKey(address, CODE_KECCAK_LEAF_KEY); - } - - /** - * Generates a code size key for a given address. - * - * @param address The address. - * @return The generated code size key. - */ - public Bytes32 codeSizeKey(Bytes address) { - return (headerKey(address, CODE_SIZE_LEAF_KEY)); + public Bytes32 codeHashKey(Bytes address) { + return headerKey(address, CODE_HASH_LEAF_KEY); } public int getNbChunk(Bytes bytecode) { diff --git a/src/main/java/org/hyperledger/besu/ethereum/trie/verkle/util/Parameters.java b/src/main/java/org/hyperledger/besu/ethereum/trie/verkle/util/Parameters.java index 7c8acae..10f9e4c 100644 --- a/src/main/java/org/hyperledger/besu/ethereum/trie/verkle/util/Parameters.java +++ b/src/main/java/org/hyperledger/besu/ethereum/trie/verkle/util/Parameters.java @@ -18,16 +18,13 @@ import org.apache.tuweni.units.bigints.UInt256; public class Parameters { - public static final UInt256 VERSION_LEAF_KEY = UInt256.valueOf(0); - public static final UInt256 BALANCE_LEAF_KEY = UInt256.valueOf(1); - public static final UInt256 NONCE_LEAF_KEY = UInt256.valueOf(2); - public static final UInt256 CODE_KECCAK_LEAF_KEY = UInt256.valueOf(3); - public static final UInt256 CODE_SIZE_LEAF_KEY = UInt256.valueOf(4); + public static final UInt256 BASIC_DATA_LEAF_KEY = UInt256.valueOf(0); + public static final UInt256 CODE_HASH_LEAF_KEY = UInt256.valueOf(1); + public static final UInt256 HEADER_STORAGE_OFFSET = UInt256.valueOf(64); + public static final UInt256 CODE_OFFSET = UInt256.valueOf(128); public static final UInt256 VERKLE_NODE_WIDTH = UInt256.valueOf(256); public static final UInt256 VERKLE_NODE_WIDTH_LOG2 = UInt256.valueOf(8); - public static final UInt256 HEADER_STORAGE_OFFSET = UInt256.valueOf(64); public static final UInt256 MAIN_STORAGE_OFFSET_SHIFT_LEFT_VERKLE_NODE_WIDTH = UInt256.ONE.shiftLeft(UInt256.valueOf(8 * 31).subtract(VERKLE_NODE_WIDTH_LOG2).intValue()); - public static final UInt256 CODE_OFFSET = UInt256.valueOf(128); public static final UInt256 HEADER_STORAGE_SIZE = CODE_OFFSET.subtract(HEADER_STORAGE_OFFSET); } diff --git a/src/test/java/org/hyperledger/besu/ethereum/trie/verkle/TrieKeyAdapterTest.java b/src/test/java/org/hyperledger/besu/ethereum/trie/verkle/TrieKeyAdapterTest.java index f9ebc36..1eb6240 100644 --- a/src/test/java/org/hyperledger/besu/ethereum/trie/verkle/TrieKeyAdapterTest.java +++ b/src/test/java/org/hyperledger/besu/ethereum/trie/verkle/TrieKeyAdapterTest.java @@ -84,43 +84,19 @@ public void testCodeChunkKey2() { } @Test - public void testVersionKey() { + public void testBasicDataKey() { // Need to change this once commit is fixed Bytes32 expected = Bytes32.fromHexString("0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034400"); - assertThat(adapter.versionKey(address)).isEqualTo(expected); + assertThat(adapter.basicDataKey(address)).isEqualTo(expected); } @Test - public void testBalanceKey() { + public void testCodeHashKey() { // Need to change this once commit is fixed Bytes32 expected = Bytes32.fromHexString("0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034401"); - assertThat(adapter.balanceKey(address)).isEqualTo(expected); - } - - @Test - public void testNonceKey() { - // Need to change this once commit is fixed - Bytes32 expected = - Bytes32.fromHexString("0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034402"); - assertThat(adapter.nonceKey(address)).isEqualTo(expected); - } - - @Test - public void testCodeKeccakKey() { - // Need to change this once commit is fixed - Bytes32 expected = - Bytes32.fromHexString("0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034403"); - assertThat(adapter.codeKeccakKey(address)).isEqualTo(expected); - } - - @Test - public void testCodeSizeKey() { - // Need to change this once commit is fixed - Bytes32 expected = - Bytes32.fromHexString("0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034404"); - assertThat(adapter.codeSizeKey(address)).isEqualTo(expected); + assertThat(adapter.codeHashKey(address)).isEqualTo(expected); } private static final ObjectMapper objectMapper = new ObjectMapper(); diff --git a/src/test/java/org/hyperledger/besu/ethereum/trie/verkle/TrieKeyBatchAdapterTest.java b/src/test/java/org/hyperledger/besu/ethereum/trie/verkle/TrieKeyBatchAdapterTest.java index 0a9b5ee..0083382 100644 --- a/src/test/java/org/hyperledger/besu/ethereum/trie/verkle/TrieKeyBatchAdapterTest.java +++ b/src/test/java/org/hyperledger/besu/ethereum/trie/verkle/TrieKeyBatchAdapterTest.java @@ -46,46 +46,28 @@ public class TrieKeyBatchAdapterTest { @Test public void testAccountKeys() { final List expectedIndexes = new ArrayList<>(); - expectedIndexes.add(Parameters.VERSION_LEAF_KEY); - expectedIndexes.add(Parameters.BALANCE_LEAF_KEY); - expectedIndexes.add(Parameters.NONCE_LEAF_KEY); - expectedIndexes.add(Parameters.CODE_KECCAK_LEAF_KEY); - expectedIndexes.add(Parameters.CODE_SIZE_LEAF_KEY); + expectedIndexes.add(Parameters.BASIC_DATA_LEAF_KEY); + expectedIndexes.add(Parameters.CODE_HASH_LEAF_KEY); final Map generatedHashes = adapter.manyTrieKeyHashes(address, expectedIndexes, new ArrayList<>(), new ArrayList<>()); final TrieKeyAdapter cachedTrieKeyAdapter = new TrieKeyAdapter(new CachedPedersenHasher(generatedHashes, new FailedHasher())); - assertThat(cachedTrieKeyAdapter.versionKey(address)) + assertThat(cachedTrieKeyAdapter.basicDataKey(address)) .isEqualTo( Bytes32.fromHexString( "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034400")); - assertThat(cachedTrieKeyAdapter.balanceKey(address)) + assertThat(cachedTrieKeyAdapter.codeHashKey(address)) .isEqualTo( Bytes32.fromHexString( "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034401")); - assertThat(cachedTrieKeyAdapter.nonceKey(address)) - .isEqualTo( - Bytes32.fromHexString( - "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034402")); - assertThat(cachedTrieKeyAdapter.codeKeccakKey(address)) - .isEqualTo( - Bytes32.fromHexString( - "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034403")); - assertThat(cachedTrieKeyAdapter.codeSizeKey(address)) - .isEqualTo( - Bytes32.fromHexString( - "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034404")); } @Test public void testAccountKeysWithStorage() { final List expectedIndexes = new ArrayList<>(); - expectedIndexes.add(Parameters.VERSION_LEAF_KEY); - expectedIndexes.add(Parameters.BALANCE_LEAF_KEY); - expectedIndexes.add(Parameters.NONCE_LEAF_KEY); - expectedIndexes.add(Parameters.CODE_KECCAK_LEAF_KEY); - expectedIndexes.add(Parameters.CODE_SIZE_LEAF_KEY); + expectedIndexes.add(Parameters.BASIC_DATA_LEAF_KEY); + expectedIndexes.add(Parameters.CODE_HASH_LEAF_KEY); final UInt256 storage = UInt256.valueOf(64); final UInt256 storage2 = @@ -100,26 +82,14 @@ public void testAccountKeysWithStorage() { final TrieKeyAdapter cachedTrieKeyAdapter = new TrieKeyAdapter(new CachedPedersenHasher(generatedHashes, new FailedHasher())); - assertThat(cachedTrieKeyAdapter.versionKey(address)) + assertThat(cachedTrieKeyAdapter.basicDataKey(address)) .isEqualTo( Bytes32.fromHexString( "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034400")); - assertThat(cachedTrieKeyAdapter.balanceKey(address)) + assertThat(cachedTrieKeyAdapter.codeHashKey(address)) .isEqualTo( Bytes32.fromHexString( "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034401")); - assertThat(cachedTrieKeyAdapter.nonceKey(address)) - .isEqualTo( - Bytes32.fromHexString( - "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034402")); - assertThat(cachedTrieKeyAdapter.codeKeccakKey(address)) - .isEqualTo( - Bytes32.fromHexString( - "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034403")); - assertThat(cachedTrieKeyAdapter.codeSizeKey(address)) - .isEqualTo( - Bytes32.fromHexString( - "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034404")); assertThat(cachedTrieKeyAdapter.storageKey(address, storage)) .isEqualTo( Bytes32.fromHexString( @@ -133,11 +103,8 @@ public void testAccountKeysWithStorage() { @Test public void testAccountKeysWithCode() { final List expectedIndexes = new ArrayList<>(); - expectedIndexes.add(Parameters.VERSION_LEAF_KEY); - expectedIndexes.add(Parameters.BALANCE_LEAF_KEY); - expectedIndexes.add(Parameters.NONCE_LEAF_KEY); - expectedIndexes.add(Parameters.CODE_KECCAK_LEAF_KEY); - expectedIndexes.add(Parameters.CODE_SIZE_LEAF_KEY); + expectedIndexes.add(Parameters.BASIC_DATA_LEAF_KEY); + expectedIndexes.add(Parameters.CODE_HASH_LEAF_KEY); final UInt256 chunkId = UInt256.valueOf(24); expectedIndexes.add(chunkId); @@ -146,26 +113,14 @@ public void testAccountKeysWithCode() { adapter.manyTrieKeyHashes(address, expectedIndexes, new ArrayList<>(), List.of(chunkId)); final TrieKeyAdapter cachedTrieKeyAdapter = new TrieKeyAdapter(new CachedPedersenHasher(generatedHashes, new FailedHasher())); - assertThat(cachedTrieKeyAdapter.versionKey(address)) + assertThat(cachedTrieKeyAdapter.basicDataKey(address)) .isEqualTo( Bytes32.fromHexString( "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034400")); - assertThat(cachedTrieKeyAdapter.balanceKey(address)) + assertThat(cachedTrieKeyAdapter.codeHashKey(address)) .isEqualTo( Bytes32.fromHexString( "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034401")); - assertThat(cachedTrieKeyAdapter.nonceKey(address)) - .isEqualTo( - Bytes32.fromHexString( - "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034402")); - assertThat(cachedTrieKeyAdapter.codeKeccakKey(address)) - .isEqualTo( - Bytes32.fromHexString( - "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034403")); - assertThat(cachedTrieKeyAdapter.codeSizeKey(address)) - .isEqualTo( - Bytes32.fromHexString( - "0x46b95e4e504b92d984c91d6f17eba4b60b904fb370818f0b6e74bc3ae5034404")); assertThat(cachedTrieKeyAdapter.codeChunkKey(address, chunkId)) .isEqualTo( Bytes32.fromHexString( @@ -174,12 +129,12 @@ public void testAccountKeysWithCode() { private static final ObjectMapper objectMapper = new ObjectMapper(); - static class KeyValueData { + public static class KeyValueData { public String key; public String value; } - static class TestCodeData { + public static class TestCodeData { public String address; public String bytecode; public ArrayList chunks; @@ -188,7 +143,7 @@ static class TestCodeData { public static List JsonContractCodeData() throws IOException { InputStream inputStream = TrieKeyBatchAdapterTest.class.getResourceAsStream("/contractCode.json"); - return objectMapper.readValue(inputStream, new TypeReference>() {}); + return objectMapper.readValue(inputStream, new TypeReference<>() {}); } @ParameterizedTest