Search code examples
kotlinclassloadercorda

Corda notary ClassNotFoundException : Malformed transaction, OUTPUTS_GROUP at index 0 cannot be deserialised


When running an InitiatingFlow/InitiatedBy between two nodes, my notary node threw an error: java.lang.Exception: Malformed transaction, OUTPUTS_GROUP at index 0 cannot be deserialised And a bit further down the trace: Caused by: java.lang.ClassNotFoundException: xxx.xxx.xxx.shared.states.OrderItemState

Including the 'shared' CordApp where this state was defined in my notary fixes the issue, but I don't understand why this is necessary?

I was able to send other states back and forth between the nodes just fine without including that CordApp Only difference is that the OrderItemState is a LinearState where the other ones were FungibleAsset, am I to look for an answer there?


Solution

  • I assume you're using a validating notary. A validating notary is one that checks that the transaction is valid, as well as checking that it does not contain a double-spend attempt. This has a cost in terms of privacy. See https://docs.corda.net/key-concepts-notaries.html#validation.

    If you look at the code that sends the transaction to the notary in NotaryFlow.Client, you can see that a validating notary is sent the entire transaction, and therefore needs the CorDapp defining the involved states in its cordapps folder:

    if (serviceHub.networkMapCache.isValidatingNotary(notaryParty)) {
        subFlow(SendTransactionWithRetry(session, stx))
        session.receive<List<TransactionSignature>>()
    }