Uploaded image for project: 'Corda'
  1. CORDA-2422

V3 node unable to record finalised transaction containing a V3 FungibleAsset state created by a V4 node

    Details

    • Type: Bug
    • Status: Done (View workflow)
    • Priority: High
    • Resolution: Done
    • Affects Version/s: Corda Enterprise 3.2, Corda 3.3
    • Fix Version/s: Corda 3.4
    • Component/s: None
    • Labels:
      None
    • Severity:
      Medium
    • Feature Team:
      Corda Core
    • Sprint:

      Description

      Steps to reproduce:

      1. git checkout M19-RC02
      2. ./gradlew buildCordaJAR
      3. cp node/capsule/build/libs/corda-4.0-RC02.jar /tmp
      4. git checkout release-V3
      5. set validating = false in net.corda.bank.BankOfCordaCordform to make the notary non-validating
      6. ./gradlew samples:bank-of-corda-demo:deployNodes
      7. cd samples/bank-of-corda-demo/build/nodes
      8. cp /tmp/corda-4.0-RC02.jar BankOfCorda/corda.jar
      9. rm BankOfCorda/cordapps/bank-of-corda-demo-*.jar
      10. remove issuableCurrencies and webAddress entries from BankOfCorda/node.conf
      11. ./runnodes

      In BankOfCorda (V4 node) shell:

      1. start CashIssueFlow amount: £1000, issuerBankPartyRef: 123, notary: "Notary Service"
      2. start CashPayment amount: £500, recipient: BigCorporation, anonymous: false

      The flow will fail with Counter-flow errored message. In BigCorporation's logs (the V3 node) you will see the following error:

      java.io.NotSerializableException: Unexpected throwable: net.corda.core.transactions.WireTransaction -> net.corda.core.transactions.WireTransaction -> null java.lang.reflect.InvocationTargetException: net.corda.core.transactions.WireTransaction -> net.corda.core.trans
      actions.WireTransaction -> null
              at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
              at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
              at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
              at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
              at net.corda.nodeapi.internal.serialization.amqp.ObjectSerializer.construct(ObjectSerializer.kt:138)
              at net.corda.nodeapi.internal.serialization.amqp.ObjectSerializer.readObjectBuildViaConstructor(ObjectSerializer.kt:97)
              at net.corda.nodeapi.internal.serialization.amqp.ObjectSerializer.readObject(ObjectSerializer.kt:82)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput.readObject$node_api(DeserializationInput.kt:135)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput.readObjectOrNull$node_api(DeserializationInput.kt:109)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput.readObjectOrNull$node_api$default(DeserializationInput.kt:108)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput$deserialize$1.invoke(DeserializationInput.kt:98)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput.des(DeserializationInput.kt:80)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput.deserialize(DeserializationInput.kt:96)
              at net.corda.nodeapi.internal.serialization.amqp.AbstractAMQPSerializationScheme.deserialize(AMQPSerializationScheme.kt:123)
              at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize$1$1.invoke(SerializationScheme.kt:111)
              at net.corda.core.serialization.SerializationFactory.withCurrentContext(SerializationAPI.kt:66)
              at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize$1.invoke(SerializationScheme.kt:111)
              at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize$1.invoke(SerializationScheme.kt:86)
              at net.corda.core.serialization.SerializationFactory.asCurrent(SerializationAPI.kt:80)
              at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl.deserialize(SerializationScheme.kt:111)
              at net.corda.core.transactions.SignedTransaction.getCoreTransaction(SignedTransaction.kt:273)
              at net.corda.core.transactions.SignedTransaction.getInputs(SignedTransaction.kt:71)
              at net.corda.core.internal.ResolveTransactionsFlow$Companion.dependencyIDs(ResolveTransactionsFlow.kt:36)
              at net.corda.core.internal.ResolveTransactionsFlow$Companion.access$dependencyIDs(ResolveTransactionsFlow.kt:35)
              at net.corda.core.internal.ResolveTransactionsFlow.<init>(ResolveTransactionsFlow.kt:31)
              at net.corda.core.flows.ReceiveTransactionFlow.call(ReceiveTransactionFlow.kt:41)
              at net.corda.core.flows.ReceiveTransactionFlow.call(ReceiveTransactionFlow.kt:24)
              at net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290)
              at net.corda.node.services.FinalityHandler.call(CoreFlowHandlers.kt:21)
              at net.corda.node.services.FinalityHandler.call(CoreFlowHandlers.kt:18)
              at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:96)
              at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:44)
              at co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092)
              at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788)
              at co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100)
              at co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91)
              at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
              at java.util.concurrent.FutureTask.run(FutureTask.java:266)
              at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
              at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
              at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
              at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
              at net.corda.node.utilities.AffinityExecutor$ServiceAffinityExecutor$1$thread$1.run(AffinityExecutor.kt:62)
      
      Caused by: java.lang.Exception: Malformed transaction, OUTPUTS_GROUP at index 0 cannot be deserialised
              at net.corda.core.transactions.TraversableTransaction.deserialiseComponentGroup(MerkleTransaction.kt:70)
              at net.corda.core.transactions.TraversableTransaction.<init>(MerkleTransaction.kt:25)
              at net.corda.core.transactions.WireTransaction.<init>(WireTransaction.kt:43)
              ... 43 more
      
      Caused by: java.io.NotSerializableException: Unexpected throwable: Not a valid Java name: net.corda.core.contracts.FungibleState<net.corda.core.contracts.Issued<java.util.Currency>> java.lang.IllegalArgumentException: Not a valid Java name: net.corda.core.contracts.F
      ungibleState<net.corda.core.contracts.Issued<java.util.Currency>>
              at net.corda.nodeapi.internal.serialization.carpenter.ClassCarpenter.validateSchema(ClassCarpenter.kt:410)
              at net.corda.nodeapi.internal.serialization.carpenter.ClassCarpenter.build(ClassCarpenter.kt:108)
              at net.corda.nodeapi.internal.serialization.carpenter.MetaCarpenterBase.step(MetaCarpenter.kt:69)
              at net.corda.nodeapi.internal.serialization.carpenter.MetaCarpenter.build(MetaCarpenter.kt:98)
              at net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.processSchema(SerializerFactory.kt:236)
              at net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.access$processSchema(SerializerFactory.kt:42)
              at net.corda.nodeapi.internal.serialization.amqp.SerializerFactory$get$1.invoke(SerializerFactory.kt:190)
              at net.corda.nodeapi.internal.serialization.amqp.SerializerFactory$get$1.invoke(SerializerFactory.kt:42)
              at net.corda.nodeapi.internal.serialization.amqp.SerializerFactory.get(SerializerFactory.kt:189)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput.readObject$node_api(DeserializationInput.kt:131)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput.readObjectOrNull$node_api(DeserializationInput.kt:109)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput.readObjectOrNull$node_api$default(DeserializationInput.kt:108)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput$deserialize$1.invoke(DeserializationInput.kt:98)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput.des(DeserializationInput.kt:80)
              at net.corda.nodeapi.internal.serialization.amqp.DeserializationInput.deserialize(DeserializationInput.kt:96)
              at net.corda.nodeapi.internal.serialization.amqp.AbstractAMQPSerializationScheme.deserialize(AMQPSerializationScheme.kt:123)
              at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize$1$1.invoke(SerializationScheme.kt:111)
              at net.corda.core.serialization.SerializationFactory.withCurrentContext(SerializationAPI.kt:66)
              at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize$1.invoke(SerializationScheme.kt:111)
              at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize$1.invoke(SerializationScheme.kt:86)
              at net.corda.core.serialization.SerializationFactory.asCurrent(SerializationAPI.kt:80)
              at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl.deserialize(SerializationScheme.kt:111)
              at net.corda.core.transactions.TraversableTransaction$outputs$1.invoke(MerkleTransaction.kt:357)
              at net.corda.core.transactions.TraversableTransaction$outputs$1.invoke(MerkleTransaction.kt:18)
              at net.corda.core.transactions.TraversableTransaction.deserialiseComponentGroup(MerkleTransaction.kt:66)
              at net.corda.core.transactions.TraversableTransaction.<init>(MerkleTransaction.kt:25)
              at net.corda.core.transactions.WireTransaction.<init>(WireTransaction.kt:43)
      ...
      

        Attachments

          Issue links

            Activity

              People

              • Assignee:
                dimos.raptis Dimos Raptis
                Reporter:
                shams.asari Shams Asari
              • Votes:
                0 Vote for this issue
                Watchers:
                5 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: