Skip to content

/construct/parse should fail more gracefully #383

Open
@matiwinnetou

Description

@matiwinnetou

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<Operation> parseCertsToOperations(
          TransactionBody transactionBody,
          List<Operation> certOps,
          Network network)
      throws CborException, CborSerializationException {
    List<Operation> parsedOperations = new ArrayList<>();
    List<Certificate> 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.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    Status

    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions