Skip to content

Commit d02ca30

Browse files
Bump hedera.app to 0.71.0 (#12936)
This PR fixes the compilation issues when bumping hedera.app to 0.71.0-rc3. Also CustomMessageCallProcessor and RootProxyWorldUpdater overriden classes are removed. The OpcodeActionTracer now tracks the gasUsage for precompiles using a field in the ContractCallContext. Precompile calls with null output now have tracked gasUsage. Previously if the output was null, the gasCost was directly set to 0. --------- Signed-off-by: Ivan Kavaldzhiev <ivankavaldzhiev@gmail.com>
1 parent 380f63d commit d02ca30

File tree

11 files changed

+166
-691
lines changed

11 files changed

+166
-691
lines changed

.github/workflows/releases-comparator.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,6 @@ jobs:
9494
"com/swirlds/state/spi/ReadableKVStateBase.java"
9595
"com/swirlds/state/spi/WritableKVStateBase.java"
9696
"com/swirlds/state/spi/WritableSingletonStateBase.java"
97-
"com/hedera/node/app/service/contract/impl/exec/processors/CustomMessageCallProcessor.java"
98-
"com/hedera/node/app/service/contract/impl/state/RootProxyWorldUpdater.java"
9997
)
10098
10199
# Compare the schemas - in case there is a new version we might need to register a new state.

build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ extra.apply {
1919
set("assertj.version", "3.27.7") // Temporary until next Spring Boot
2020
set("besuVersion", "25.2.2")
2121
set("blockNodeVersion", "0.24.2")
22-
set("consensusNodeVersion", "0.70.0")
22+
set("consensusNodeVersion", "0.71.0")
2323
set("grpcVersion", "1.79.0")
2424
set("jooq.version", "3.20.11") // Must match buildSrc/build.gradle.kts
2525
set("mapStructVersion", "1.6.3")
@@ -55,7 +55,7 @@ dependencies {
5555
api("com.graphql-java:graphql-java-extended-validation:24.0")
5656
api("com.hedera.hashgraph:app:$consensusNodeVersion")
5757
api("com.hedera.hashgraph:app-service-entity-id-impl:$consensusNodeVersion")
58-
api("com.hedera.hashgraph:hedera-protobuf-java-api:0.71.0-rc.3") // verify no issues
58+
api("com.hedera.hashgraph:hedera-protobuf-java-api:$consensusNodeVersion")
5959
api("com.hedera.hashgraph:sdk:2.66.0")
6060
api("com.ongres.scram:client:2.1")
6161
api("commons-beanutils:commons-beanutils:1.11.0")

web3/src/main/java/com/hedera/node/app/service/contract/impl/exec/processors/CustomMessageCallProcessor.java

Lines changed: 0 additions & 404 deletions
This file was deleted.

web3/src/main/java/com/hedera/node/app/service/contract/impl/state/RootProxyWorldUpdater.java

Lines changed: 0 additions & 191 deletions
This file was deleted.

web3/src/main/java/org/hiero/mirror/web3/common/ContractCallContext.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ public class ContractCallContext {
6161
@Setter
6262
private boolean isBalanceCall;
6363

64+
@Setter
65+
private long gasRemaining;
66+
6467
@Setter
6568
private long gasRequirement;
6669

web3/src/main/java/org/hiero/mirror/web3/evm/contracts/execution/traceability/AbstractOpcodeTracer.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,20 @@
22

33
package org.hiero.mirror.web3.evm.contracts.execution.traceability;
44

5+
import com.hedera.node.app.service.contract.impl.state.RootProxyWorldUpdater;
56
import com.hederahashgraph.api.proto.java.ResponseCodeEnum;
67
import java.util.ArrayList;
78
import java.util.Collections;
89
import java.util.List;
10+
import java.util.Map;
911
import java.util.Optional;
12+
import java.util.TreeMap;
13+
import java.util.stream.Collectors;
1014
import org.apache.tuweni.bytes.Bytes;
1115
import org.hiero.mirror.common.domain.contract.ContractAction;
1216
import org.hiero.mirror.web3.common.ContractCallContext;
1317
import org.hiero.mirror.web3.convert.BytesDecoder;
18+
import org.hyperledger.besu.evm.ModificationNotAllowedException;
1419
import org.hyperledger.besu.evm.frame.MessageFrame;
1520
import org.springframework.util.CollectionUtils;
1621

@@ -44,6 +49,45 @@ protected final List<Bytes> captureStack(final MessageFrame frame, final OpcodeT
4449
return stack;
4550
}
4651

52+
protected Map<Bytes, Bytes> captureStorage(final MessageFrame frame, final OpcodeTracerOptions options) {
53+
if (!options.isStorage()) {
54+
return Collections.emptyMap();
55+
}
56+
57+
try {
58+
var worldUpdater = frame.getWorldUpdater();
59+
while (worldUpdater.parentUpdater().isPresent()) {
60+
worldUpdater = worldUpdater.parentUpdater().get();
61+
}
62+
63+
if (!(worldUpdater instanceof RootProxyWorldUpdater rootProxyWorldUpdater)) {
64+
// The storage updates are kept only in the RootProxyWorldUpdater.
65+
// If we don't have one -> something unexpected happened and an attempt to
66+
// get the storage changes from a ProxyWorldUpdater would result in a
67+
// NullPointerException, so in this case just return an empty map.
68+
return Collections.emptyMap();
69+
}
70+
final var updates = rootProxyWorldUpdater
71+
.getEvmFrameState()
72+
.getTxStorageUsage(true)
73+
.accesses();
74+
return updates.stream()
75+
.flatMap(storageAccesses ->
76+
storageAccesses.accesses().stream()) // Properly flatten the nested structure
77+
.collect(Collectors.toMap(
78+
e -> Bytes.wrap(e.key().toArray()),
79+
e -> Bytes.wrap(
80+
e.writtenValue() != null
81+
? e.writtenValue().toArray()
82+
: e.value().toArray()),
83+
(v1, v2) -> v1, // in case of duplicates, keep the first value
84+
TreeMap::new));
85+
86+
} catch (final ModificationNotAllowedException e) {
87+
return Collections.emptyMap();
88+
}
89+
}
90+
4791
protected final Optional<Bytes> getRevertReasonFromContractActions(final ContractCallContext context) {
4892
final var contractActions = context.getContractActions();
4993

web3/src/main/java/org/hiero/mirror/web3/evm/contracts/execution/traceability/MirrorOperationActionTracer.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
import static org.hiero.mirror.common.util.DomainUtils.toEvmAddress;
66
import static org.hiero.mirror.web3.utils.Constants.BALANCE_OPERATION_NAME;
77

8+
import com.hedera.hapi.streams.ContractAction;
9+
import com.hedera.hapi.streams.ContractActionType;
10+
import com.hedera.node.app.service.contract.impl.exec.ActionSidecarContentTracer;
811
import jakarta.inject.Named;
12+
import java.util.List;
913
import java.util.Optional;
1014
import lombok.CustomLog;
1115
import lombok.RequiredArgsConstructor;
@@ -17,13 +21,12 @@
1721
import org.hiero.mirror.web3.state.CommonEntityAccessor;
1822
import org.hyperledger.besu.evm.frame.MessageFrame;
1923
import org.hyperledger.besu.evm.operation.Operation;
20-
import org.hyperledger.besu.evm.tracing.OperationTracer;
2124
import org.jspecify.annotations.NonNull;
2225

2326
@Named
2427
@CustomLog
2528
@RequiredArgsConstructor
26-
public class MirrorOperationActionTracer implements OperationTracer {
29+
public class MirrorOperationActionTracer implements ActionSidecarContentTracer {
2730

2831
private final TraceProperties traceProperties;
2932
private final CommonEntityAccessor commonEntityAccessor;
@@ -76,4 +79,24 @@ public void tracePostExecution(
7679
frame.getOutputData().toShortHexString(),
7780
frame.getReturnData().toShortHexString());
7881
}
82+
83+
@Override
84+
public void traceOriginAction(@NonNull MessageFrame frame) {
85+
// NO-OP
86+
}
87+
88+
@Override
89+
public void sanitizeTracedActions(@NonNull MessageFrame frame) {
90+
// NO-OP
91+
}
92+
93+
@Override
94+
public void tracePrecompileResult(@NonNull MessageFrame frame, @NonNull ContractActionType type) {
95+
// NO-OP
96+
}
97+
98+
@Override
99+
public List<ContractAction> contractActions() {
100+
return List.of();
101+
}
79102
}

0 commit comments

Comments
 (0)