cardano-foundation / cardano-foundation/cardano-rosetta-java

/construct/parse should fail more gracefully

Open
#383 1 comment 0 reactions 1 assignee Claimed by @linconvidal View on GitHub
Make Robust needs investigation pre-cip113 prep Tech Excellence
Dominant language
Java
Stars
26
Forks
15
Avg merge
5d 3h
Merged PRs (30d)
2

Description

We should likely return a more descriptive information when failing to parse, right now when a broken transaction such that what is in the serialized transaction does not match with what are the operations is passed to Rosetta Java /construct/parse it will fail but with a http 500 and not very descriptive error.

```
2025-04-02T09:06:58.756Z INFO 1 --- [nio-8082-exec-8] o.c.r.common.util.ParseConstructionUtil : [parseCertsToOperations] About to parse 1 certs
2025-04-02T09:06:58.758Z ERROR 1 --- [nio-8082-exec-8] o.c.r.c.e.GlobalExceptionHandler : An error occurred during the request

java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at java.base/java.util.ImmutableCollections$ListN.get(ImmutableCollections.java:687) ~[na:na]
at org.cardanofoundation.rosetta.common.util.ParseConstructionUtil.parseCertsToOperations(ParseConstructionUtil.java:240) ~[!/:na]
at org.cardanofoundation.rosetta.api.construction.service.OperationService.fillCertOperations(OperationService.java:121) ~[!/:na]
at org.cardanofoundation.rosetta.api.construction.service.OperationService.getOperationsFromTransactionData(OperationService.java:52) ~[!/:na]
at org.cardanofoundation.rosetta.api.construction.service.CardanoConstructionServiceImpl.parseTransaction(CardanoConstructionServiceImpl.java:91) ~[!/:na]
at org.cardanofoundation.rosetta.api.construction.service.ConstructionApiServiceImpl.constructionParseService(ConstructionApiServiceImpl.java:285) ~[!/:na]
at org.cardanofoundation.rosetta.api.construction.controller.ConstructionApiImplementation.constructionParse(ConstructionApiImplementation.java:63) ~[!/:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
```

we observed this error based on wrong input:
```
{
"network_identifier": {
"blockchain": "cardano",
"network": "preprod"
},
"signed": false,
"transaction": "82790180613530306439303130323831383235383230663030376335373637626466623664393530666662646436613937353536356135313630303237343936346562363237303238653638656664356265623238363036303138313832353833393030643664626661383766313035346461396434376436313262383236333465666634343837316333373135353463386536373332643533663436626330666237626633666236333231336462383136353561333364386334613763316337653462643735666333336666313736373834623161303031343366323730323161303030326134333930333161303533313930386530346439303130323831383330393832303035383163366263306662376266336662363332313364623831363535613333643863346137633163376534626437356663333366663137363738346238323030353831633033636361653739346166666265323761356635663734646136323636303032646231316461613661653434366165613738336239373264a16a6f7065726174696f6e7381a7746f7065726174696f6e5f6964656e746966696572a165696e64657800676163636f756e74a16761646472657373786c616464725f7465737431717274646837353837797a356d3277353034736a68716e72666d6c356670637578753234666a387877766b34386172746372616868756c6d7676736e6d77716b326b336e6d727a3230737738756a3768746c706e6c75746b307039736a666e64336e66616d6f756e74a26863757272656e6379a26673796d626f6c6341444168646563696d616c73066576616c7565682d313530303030306b636f696e5f6368616e6765a26f636f696e5f6964656e746966696572a16a6964656e7469666965727842663030376335373637626466623664393530666662646436613937353536356135313630303237343936346562363237303238653638656664356265623238363a366b636f696e5f616374696f6e6a636f696e5f7370656e74686d65746164617461a06673746174757360647479706565696e707574"
}
```

revelant code to look at:

```
public static List parseCertsToOperations(
TransactionBody transactionBody,
List certOps,
Network network)
throws CborException, CborSerializationException {
List parsedOperations = new ArrayList<>();
List certs = transactionBody.getCerts();

int certsCount = getCertSize(certs);
log.info("[parseCertsToOperations] About to parse {} certs", certsCount);

if (certOps.size() != certsCount) {
log.error("[parseCertsToOperations] Certs count mismatch, this doesn't bode well");

//throw ExceptionFactory.certCountMismatchError();
}

```

we can't fix this issue without knowing what is the outcome of #380 investigation since in some cases the mismatch between certs and operations is expected perhaps.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.