From 7050f783742d142e11d03b585d8a545347e74536 Mon Sep 17 00:00:00 2001 From: Kristiyan Selveliev Date: Mon, 24 Feb 2025 17:11:01 +0200 Subject: [PATCH 1/2] fix: Fix contract storage readable kv state slot values Signed-off-by: Kristiyan Selveliev --- .../main/java/com/hedera/mirror/web3/state/Utils.java | 11 +++++++++++ .../keyvalue/ContractStorageReadableKVState.java | 4 +++- .../keyvalue/ContractStorageReadableKVStateTest.java | 3 ++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/Utils.java b/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/Utils.java index 0a5fcb23d96..24cf2ab7ed7 100644 --- a/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/Utils.java +++ b/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/Utils.java @@ -24,6 +24,7 @@ import java.util.Arrays; import lombok.CustomLog; import lombok.experimental.UtilityClass; +import org.apache.tuweni.bytes.Bytes32; import org.hyperledger.besu.datatypes.Address; @CustomLog @@ -69,4 +70,14 @@ public static boolean isMirror(final byte[] address) { return Arrays.equals(MIRROR_PREFIX, 0, 12, address, 0, 12); } + + public static byte[] padToBytes32(byte[] input) { + if (input.length >= Bytes32.SIZE) { + return input; + } + byte[] padded = new byte[Bytes32.SIZE]; + int offset = Bytes32.SIZE - input.length; + System.arraycopy(input, 0, padded, offset, input.length); + return padded; + } } diff --git a/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVState.java b/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVState.java index 926b7295a6a..56af90bea46 100644 --- a/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVState.java +++ b/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVState.java @@ -16,6 +16,8 @@ package com.hedera.mirror.web3.state.keyvalue; +import static com.hedera.mirror.web3.state.Utils.padToBytes32; + import com.hedera.hapi.node.state.contract.SlotKey; import com.hedera.hapi.node.state.contract.SlotValue; import com.hedera.mirror.web3.common.ContractCallContext; @@ -49,7 +51,7 @@ protected SlotValue readFromDataSource(@Nonnull SlotKey slotKey) { return timestamp .map(t -> contractStateRepository.findStorageByBlockTimestamp(entityId, keyBytes, t)) .orElse(contractStateRepository.findStorage(entityId, keyBytes)) - .map(byteArr -> new SlotValue(Bytes.wrap(byteArr), Bytes.EMPTY, Bytes.EMPTY)) + .map(byteArr -> new SlotValue(Bytes.wrap(padToBytes32(byteArr)), Bytes.EMPTY, Bytes.EMPTY)) .orElse(null); } } diff --git a/hedera-mirror-web3/src/test/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVStateTest.java b/hedera-mirror-web3/src/test/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVStateTest.java index d06496aeab3..2de31870ce3 100644 --- a/hedera-mirror-web3/src/test/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVStateTest.java +++ b/hedera-mirror-web3/src/test/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVStateTest.java @@ -16,6 +16,7 @@ package com.hedera.mirror.web3.state.keyvalue; +import static com.hedera.mirror.web3.state.Utils.padToBytes32; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; @@ -49,7 +50,7 @@ class ContractStorageReadableKVStateTest { private static final ContractID CONTRACT_ID = new ContractID(1L, 0L, new OneOf<>(ContractOneOfType.CONTRACT_NUM, 1L)); - private static final Bytes BYTES = Bytes.fromBase64("123456"); + private static final Bytes BYTES = Bytes.wrap(padToBytes32("123456".getBytes())); private static final SlotKey SLOT_KEY = new SlotKey(CONTRACT_ID, BYTES); private static final EntityId ENTITY_ID = EntityId.of(CONTRACT_ID.shardNum(), CONTRACT_ID.realmNum(), CONTRACT_ID.contractNum()); From 96f17d35c3b559c9bfad4eaa932694c489f7eba9 Mon Sep 17 00:00:00 2001 From: Kristiyan Selveliev Date: Tue, 25 Feb 2025 10:56:21 +0200 Subject: [PATCH 2/2] fix: Addressing review comments Signed-off-by: Kristiyan Selveliev --- .../main/java/com/hedera/mirror/web3/state/Utils.java | 11 ----------- .../keyvalue/ContractStorageReadableKVState.java | 6 ++++-- .../keyvalue/ContractStorageReadableKVStateTest.java | 5 +++-- 3 files changed, 7 insertions(+), 15 deletions(-) diff --git a/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/Utils.java b/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/Utils.java index 24cf2ab7ed7..0a5fcb23d96 100644 --- a/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/Utils.java +++ b/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/Utils.java @@ -24,7 +24,6 @@ import java.util.Arrays; import lombok.CustomLog; import lombok.experimental.UtilityClass; -import org.apache.tuweni.bytes.Bytes32; import org.hyperledger.besu.datatypes.Address; @CustomLog @@ -70,14 +69,4 @@ public static boolean isMirror(final byte[] address) { return Arrays.equals(MIRROR_PREFIX, 0, 12, address, 0, 12); } - - public static byte[] padToBytes32(byte[] input) { - if (input.length >= Bytes32.SIZE) { - return input; - } - byte[] padded = new byte[Bytes32.SIZE]; - int offset = Bytes32.SIZE - input.length; - System.arraycopy(input, 0, padded, offset, input.length); - return padded; - } } diff --git a/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVState.java b/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVState.java index 56af90bea46..66212e5a3d2 100644 --- a/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVState.java +++ b/hedera-mirror-web3/src/main/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVState.java @@ -16,7 +16,7 @@ package com.hedera.mirror.web3.state.keyvalue; -import static com.hedera.mirror.web3.state.Utils.padToBytes32; +import static com.hedera.mirror.common.util.DomainUtils.leftPadBytes; import com.hedera.hapi.node.state.contract.SlotKey; import com.hedera.hapi.node.state.contract.SlotValue; @@ -26,6 +26,7 @@ import com.hedera.services.utils.EntityIdUtils; import jakarta.annotation.Nonnull; import jakarta.inject.Named; +import org.apache.tuweni.bytes.Bytes32; @Named public class ContractStorageReadableKVState extends AbstractReadableKVState { @@ -51,7 +52,8 @@ protected SlotValue readFromDataSource(@Nonnull SlotKey slotKey) { return timestamp .map(t -> contractStateRepository.findStorageByBlockTimestamp(entityId, keyBytes, t)) .orElse(contractStateRepository.findStorage(entityId, keyBytes)) - .map(byteArr -> new SlotValue(Bytes.wrap(padToBytes32(byteArr)), Bytes.EMPTY, Bytes.EMPTY)) + .map(byteArr -> + new SlotValue(Bytes.wrap(leftPadBytes(byteArr, Bytes32.SIZE)), Bytes.EMPTY, Bytes.EMPTY)) .orElse(null); } } diff --git a/hedera-mirror-web3/src/test/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVStateTest.java b/hedera-mirror-web3/src/test/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVStateTest.java index 2de31870ce3..db7629df778 100644 --- a/hedera-mirror-web3/src/test/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVStateTest.java +++ b/hedera-mirror-web3/src/test/java/com/hedera/mirror/web3/state/keyvalue/ContractStorageReadableKVStateTest.java @@ -16,7 +16,7 @@ package com.hedera.mirror.web3.state.keyvalue; -import static com.hedera.mirror.web3.state.Utils.padToBytes32; +import static com.hedera.mirror.common.util.DomainUtils.leftPadBytes; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; @@ -34,6 +34,7 @@ import com.hedera.pbj.runtime.io.buffer.Bytes; import java.util.Collections; import java.util.Optional; +import org.apache.tuweni.bytes.Bytes32; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -50,7 +51,7 @@ class ContractStorageReadableKVStateTest { private static final ContractID CONTRACT_ID = new ContractID(1L, 0L, new OneOf<>(ContractOneOfType.CONTRACT_NUM, 1L)); - private static final Bytes BYTES = Bytes.wrap(padToBytes32("123456".getBytes())); + private static final Bytes BYTES = Bytes.wrap(leftPadBytes("123456".getBytes(), Bytes32.SIZE)); private static final SlotKey SLOT_KEY = new SlotKey(CONTRACT_ID, BYTES); private static final EntityId ENTITY_ID = EntityId.of(CONTRACT_ID.shardNum(), CONTRACT_ID.realmNum(), CONTRACT_ID.contractNum());