首页 > 解决方案 > TransactionBuilder 发送后变得不可变

问题描述

我需要几个节点来构建一个事务。为了实现这一点,我创建了一个TransactionBuilder并将其传递给节点,然后将它们的状态添加到其中。

这似乎是一种合法的做法,因为官方文档中提到TransactionBuilder的目的是传递合同,这些合同可以通过添加新的状态/命令来编辑它。

我已添加TransactionBuilder到序列化白名单中,以便 Corda 可以发送/接收它。

但是,在运行单元测试时,网络会抛出此异常:

java.lang.UnsupportedOperationException: null
at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
at net.corda.core.transactions.TransactionBuilder.addInputState(TransactionBuilder.kt:149)

我在调试器中查看了它,收到后构建器的类型是UnmodifiableList.

我的工作是在收到构建器后复制它。

但为什么它会这样工作?我对文档的解释有误吗?

我们使用 Corda 3.3

标签: corda

解决方案


Corda 使用自己的序列化框架在不同的点(例如,当它们在流中的节点之间发送或接收时,当它们通过 RPC 发送时)序列化对象。

在 Java 中,如果您收到其中一个字段为 a 的序列化对象List,则无法检查相关列表最初是可变的还是不可变的。因此,在 Corda 中,我们默认将此类列表反序列化为不可变列表。

您应该复制原件TransactionBuilder,就像您已经在做的那样。


推荐阅读