Skip to content

Commit 799fceb

Browse files
fix: Only add synth action if INVALID_SOLIDITY_ADDRESS is due to invalid call target (#21439)
Signed-off-by: Lukasz Gasior <lukasz.gasior@swirldslabs.com>
1 parent df83a41 commit 799fceb

24 files changed

+139
-7
lines changed

hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/operations/BasicCustomCallOperation.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import com.hedera.node.app.service.contract.impl.exec.AddressChecks;
1010
import com.hedera.node.app.service.contract.impl.exec.FeatureFlags;
1111
import com.hedera.node.app.service.contract.impl.exec.processors.CustomMessageCallProcessor;
12+
import com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils;
13+
import com.hedera.node.app.service.contract.impl.exec.utils.InvalidAddressContext;
1214
import edu.umd.cs.findbugs.annotations.NonNull;
1315
import org.hyperledger.besu.datatypes.Address;
1416
import org.hyperledger.besu.evm.EVM;
@@ -89,6 +91,8 @@ default Operation.OperationResult executeChecked(@NonNull final MessageFrame fra
8991
final var address = to(frame);
9092
if (contractRequired(frame, address, featureFlags())
9193
&& addressChecks().isNeitherSystemNorPresent(address, frame)) {
94+
FrameUtils.invalidAddressContext(frame)
95+
.set(address, InvalidAddressContext.InvalidAddressType.InvalidCallTarget);
9296
return new Operation.OperationResult(cost(frame), INVALID_SOLIDITY_ADDRESS);
9397
}
9498
return executeUnchecked(frame, evm);

hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/operations/CustomBalanceOperation.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import com.hedera.node.app.service.contract.impl.exec.AddressChecks;
99
import com.hedera.node.app.service.contract.impl.exec.FeatureFlags;
10+
import com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils;
11+
import com.hedera.node.app.service.contract.impl.exec.utils.InvalidAddressContext;
1012
import edu.umd.cs.findbugs.annotations.NonNull;
1113
import org.apache.tuweni.units.bigints.UInt256;
1214
import org.hyperledger.besu.evm.EVM;
@@ -55,6 +57,8 @@ public OperationResult execute(@NonNull final MessageFrame frame, @NonNull final
5557
}
5658
// Otherwise continue to enforce existence checks for backward compatibility
5759
if (contractRequired(frame, address, featureFlags) && !addressChecks.isPresent(address, frame)) {
60+
FrameUtils.invalidAddressContext(frame)
61+
.set(address, InvalidAddressContext.InvalidAddressType.NonCallTarget);
5862
return new OperationResult(cost, INVALID_SOLIDITY_ADDRESS);
5963
}
6064
return super.execute(frame, evm);

hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/operations/CustomCallOperation.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import com.hedera.node.app.service.contract.impl.exec.FeatureFlags;
1111
import com.hedera.node.app.service.contract.impl.exec.scope.HandleHederaNativeOperations;
1212
import com.hedera.node.app.service.contract.impl.exec.scope.VerificationStrategy;
13+
import com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils;
14+
import com.hedera.node.app.service.contract.impl.exec.utils.InvalidAddressContext;
1315
import edu.umd.cs.findbugs.annotations.NonNull;
1416
import java.util.Objects;
1517
import org.hyperledger.besu.datatypes.Address;
@@ -65,6 +67,8 @@ public OperationResult execute(@NonNull final MessageFrame frame, @NonNull final
6567
final var toAddress = to(frame);
6668
final var isMissing = mustBePresent(frame, toAddress) && !addressChecks.isPresent(toAddress, frame);
6769
if (isMissing) {
70+
FrameUtils.invalidAddressContext(frame)
71+
.set(toAddress, InvalidAddressContext.InvalidAddressType.InvalidCallTarget);
6872
return new OperationResult(cost, INVALID_SOLIDITY_ADDRESS);
6973
}
7074
return super.execute(frame, evm);

hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/operations/CustomExtCodeCopyOperation.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.hedera.node.app.service.contract.impl.exec.AddressChecks;
99
import com.hedera.node.app.service.contract.impl.exec.FeatureFlags;
1010
import com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason;
11+
import com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils;
12+
import com.hedera.node.app.service.contract.impl.exec.utils.InvalidAddressContext;
1113
import edu.umd.cs.findbugs.annotations.NonNull;
1214
import org.apache.tuweni.bytes.Bytes;
1315
import org.hyperledger.besu.evm.EVM;
@@ -64,6 +66,8 @@ public OperationResult execute(@NonNull final MessageFrame frame, @NonNull final
6466
}
6567
// Otherwise the address must be present
6668
if (contractRequired(frame, address, featureFlags) && !addressChecks.isPresent(address, frame)) {
69+
FrameUtils.invalidAddressContext(frame)
70+
.set(address, InvalidAddressContext.InvalidAddressType.NonCallTarget);
6771
return new OperationResult(cost, CustomExceptionalHaltReason.INVALID_SOLIDITY_ADDRESS);
6872
}
6973
return super.execute(frame, evm);

hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/operations/CustomExtCodeHashOperation.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.hedera.node.app.service.contract.impl.exec.AddressChecks;
88
import com.hedera.node.app.service.contract.impl.exec.FeatureFlags;
99
import com.hedera.node.app.service.contract.impl.exec.failure.CustomExceptionalHaltReason;
10+
import com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils;
11+
import com.hedera.node.app.service.contract.impl.exec.utils.InvalidAddressContext;
1012
import edu.umd.cs.findbugs.annotations.NonNull;
1113
import java.util.Objects;
1214
import org.apache.tuweni.units.bigints.UInt256;
@@ -60,6 +62,8 @@ public OperationResult execute(@NonNull final MessageFrame frame, @NonNull final
6062
}
6163
// Otherwise the address must be present
6264
if (contractRequired(frame, address, featureFlags) && !addressChecks.isPresent(address, frame)) {
65+
FrameUtils.invalidAddressContext(frame)
66+
.set(address, InvalidAddressContext.InvalidAddressType.NonCallTarget);
6367
return new OperationResult(cost, CustomExceptionalHaltReason.INVALID_SOLIDITY_ADDRESS);
6468
}
6569
return super.execute(frame, evm);

hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/operations/CustomExtCodeSizeOperation.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import com.hedera.node.app.service.contract.impl.exec.AddressChecks;
99
import com.hedera.node.app.service.contract.impl.exec.FeatureFlags;
10+
import com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils;
11+
import com.hedera.node.app.service.contract.impl.exec.utils.InvalidAddressContext;
1012
import edu.umd.cs.findbugs.annotations.NonNull;
1113
import java.util.Objects;
1214
import org.apache.tuweni.units.bigints.UInt256;
@@ -57,6 +59,8 @@ public OperationResult execute(@NonNull final MessageFrame frame, @NonNull final
5759
return new OperationResult(cost, null);
5860
}
5961
if (contractRequired(frame, address, featureFlags) && !addressChecks.isPresent(address, frame)) {
62+
FrameUtils.invalidAddressContext(frame)
63+
.set(address, InvalidAddressContext.InvalidAddressType.NonCallTarget);
6064
return new OperationResult(cost, INVALID_SOLIDITY_ADDRESS);
6165
}
6266
return super.execute(frame, evm);

hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/operations/CustomSelfDestructOperation.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import static org.hyperledger.besu.evm.frame.ExceptionalHaltReason.INSUFFICIENT_GAS;
1212

1313
import com.hedera.node.app.service.contract.impl.exec.AddressChecks;
14+
import com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils;
15+
import com.hedera.node.app.service.contract.impl.exec.utils.InvalidAddressContext;
1416
import com.hedera.node.app.service.contract.impl.state.AbstractProxyEvmAccount;
1517
import com.hedera.node.app.service.contract.impl.state.ProxyWorldUpdater;
1618
import com.hedera.node.app.service.contract.impl.state.ScheduleEvmAccount;
@@ -188,7 +190,11 @@ public OperationResult execute(@NonNull final MessageFrame frame, @NonNull final
188190
beneficiaryAccount instanceof ScheduleEvmAccount)
189191
.filter(Boolean.TRUE::equals)
190192
.findFirst()
191-
.flatMap(op -> Optional.of(INVALID_SOLIDITY_ADDRESS));
193+
.flatMap(op -> {
194+
FrameUtils.invalidAddressContext(frame)
195+
.set(beneficiary, InvalidAddressContext.InvalidAddressType.NonCallTarget);
196+
return Optional.of(INVALID_SOLIDITY_ADDRESS);
197+
});
192198
}
193199

194200
protected @NonNull Optional<ExceptionalHaltReason> validateHederaRestrictionsOnContract(

hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/ActionStack.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,13 @@ private ContractAction finalFormOf(@NonNull final ContractAction action, @NonNul
214214
final var haltReason = maybeHaltReason.get();
215215
builder.error(Bytes.wrap(haltReason.name().getBytes(UTF_8)));
216216
if (CALL.equals(action.callType()) && haltReason == INVALID_SOLIDITY_ADDRESS) {
217-
allActions.add(new ActionWrapper(helper.createSynthActionForMissingAddressIn(frame)));
217+
final var invalidAddressContext = FrameUtils.invalidAddressContext(frame);
218+
// Only create the synth action if the invalid address was actually a call target
219+
if (InvalidAddressContext.InvalidAddressType.InvalidCallTarget.equals(
220+
invalidAddressContext.type())) {
221+
allActions.add(new ActionWrapper(helper.createSynthActionForMissingAddressIn(
222+
frame, invalidAddressContext.culpritAddress())));
223+
}
218224
}
219225
} else {
220226
builder.error(Bytes.EMPTY);

hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/ActionsHelper.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import edu.umd.cs.findbugs.annotations.NonNull;
1717
import java.util.function.BiConsumer;
1818
import java.util.function.Function;
19+
import org.hyperledger.besu.datatypes.Address;
1920
import org.hyperledger.besu.evm.frame.MessageFrame;
2021

2122
/**
@@ -30,13 +31,14 @@ public class ActionsHelper {
3031
* @param frame the frame to represent
3132
* @return the {@link ContractAction} representing the frame as a call to a missing address
3233
*/
33-
public ContractAction createSynthActionForMissingAddressIn(@NonNull final MessageFrame frame) {
34+
public ContractAction createSynthActionForMissingAddressIn(
35+
@NonNull final MessageFrame frame, @NonNull final Address targetAddress) {
3436
return ContractAction.newBuilder()
3537
.callType(ContractActionType.CALL)
3638
.gas(frame.getRemainingGas())
3739
.callDepth(frame.getDepth() + 1)
3840
.callingContract(contractIdWith(frame, hederaIdNumOfContractIn(frame)))
39-
.targetedAddress(tuweniToPbjBytes(frame.getStackItem(1)))
41+
.targetedAddress(tuweniToPbjBytes(targetAddress))
4042
.error(MISSING_ADDRESS_ERROR)
4143
.callOperationType(
4244
asCallOperationType(frame.getCurrentOperation().getOpcode()))

hedera-node/hedera-smart-contract-service-impl/src/main/java/com/hedera/node/app/service/contract/impl/exec/utils/FrameBuilder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.BYTECODE_SIDECARS_VARIABLE;
1212
import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.CONFIG_CONTEXT_VARIABLE;
1313
import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.HAPI_RECORD_BUILDER_CONTEXT_VARIABLE;
14+
import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.INVALID_ADDRESS_CONTEXT_VARIABLE;
1415
import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.IS_HOOK_VARIABLE;
1516
import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.OPS_DURATION_COUNTER;
1617
import static com.hedera.node.app.service.contract.impl.exec.utils.FrameUtils.PENDING_CREATION_BUILDER_CONTEXT_VARIABLE;
@@ -159,6 +160,7 @@ private Map<String, Object> contextVariablesFrom(
159160
if (hookDispatch) {
160161
contextEntries.put(IS_HOOK_VARIABLE, true);
161162
}
163+
contextEntries.put(INVALID_ADDRESS_CONTEXT_VARIABLE, new InvalidAddressContext());
162164
return contextEntries;
163165
}
164166

0 commit comments

Comments
 (0)