将状态发送给流程中的另一方后无法将状态添加到 TransactionBuilder
Cannot add state to TransactionBuilder after sending it to another party in a flow
我有一个发生以下情况的流程:
PartyA
创建一个 TransactionBuilder
PartyA
将 TransactionBuilder
发送到 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
?
在 Corda 中,对象在通过网络发送之前被序列化。反序列化接收到的对象时,无法检测任何正在反序列化的 List
s 最初是可变的还是不可变的。总而言之,我们决定我们的序列化引擎应该使它反序列化的任何 List
不可变,而不是可变的。
这是导致您在上面看到的问题的原因。在幕后,您在不可变列表上调用 add
。
您可以使用 TransactionBuilder.copy
再次复制具有可变状态列表的 TransactionBuilder
来绕过此问题。
问题仅出现在 Corda V3 中,其中往返序列化将可变对象转换为非可变对象。在 Corda V2 或更低版本中不是这种情况。
我有一个发生以下情况的流程:
PartyA
创建一个TransactionBuilder
PartyA
将TransactionBuilder
发送到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
?
在 Corda 中,对象在通过网络发送之前被序列化。反序列化接收到的对象时,无法检测任何正在反序列化的 List
s 最初是可变的还是不可变的。总而言之,我们决定我们的序列化引擎应该使它反序列化的任何 List
不可变,而不是可变的。
这是导致您在上面看到的问题的原因。在幕后,您在不可变列表上调用 add
。
您可以使用 TransactionBuilder.copy
再次复制具有可变状态列表的 TransactionBuilder
来绕过此问题。
问题仅出现在 Corda V3 中,其中往返序列化将可变对象转换为非可变对象。在 Corda V2 或更低版本中不是这种情况。