在将流发送给流中的另一方之后,无法向TransactionBuilder添加状态

时间:2018-03-20 16:59:57

标签: corda

我有一个流程,其中发生以下情况:

  • PartyA创建TransactionBuilder
  • PartyATransactionBuilder发送给PartyB
  • PartyB将状态添加到TransactionBuilder

但是,当PartyB向构建器尝试某个状态时,它们会出现以下异常:

[WARN ] 2018-03-20T16:02:35,932Z [Node thread-1] flow.[99246baf-1a1d-44e5-b2f9-f4eb341b97d4].run - Terminated by unexpected exception {}
java.lang.UnsupportedOperationException: null
    at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055) ~[?:1.8.0_162]
    at net.corda.core.transactions.TransactionBuilder.addInputState(TransactionBuilder.kt:149) ~[corda-core-corda-3.0.jar:?]

这里发生了什么?为什么PartyB无法TransactionBuilder添加项目?

2 个答案:

答案 0 :(得分:5)

在Corda中,对象在通过线路发送之前被序列化。在对接收的对象进行反序列化时,无法检测正在反序列化的任何List是否最初是可变的或不可变的。总的来说,我们决定我们的序列化引擎应该使任何List反序列化为不可变的,而不是可变的。

这导致您在上面发现的问题。在引擎盖下,您在不可变列表上调用add

您可以使用TransactionBuilder.copy绕过此问题,以复制具有可变状态列表的TransactionBuilder

答案 1 :(得分:1)

问题仅发生在Corda V3中,其中往返序列化将可变对象转换为非可变对象。在Corda V2或更低版本中不是这种情况。