corda - 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 使用自己的序列化框架在不同的点(例如,当它们在流中的节点之间发送或接收时,当它们通过 RPC 发送时)序列化对象。
在 Java 中,如果您收到其中一个字段为 a 的序列化对象List
,则无法检查相关列表最初是可变的还是不可变的。因此,在 Corda 中,我们默认将此类列表反序列化为不可变列表。
您应该复制原件TransactionBuilder
,就像您已经在做的那样。
推荐阅读
- aws-lambda - Okta JWT 令牌解码问题
- sql - 按性别列出员工人数
- reactjs - 将 React 应用程序部署到 GitHub 页面:找不到 404 页面
- javascript - 如何在 Typescript 中导入自定义文件类型
- php - 如何在php中将两个数组添加为一个多维数组
- python - 使用 .append 在 Python 中迭代一个扩展的数字列表
- max - 在 Access 中使用 Min/Max 时如何解决差距?
- c++ - 即使正确设置,我的 consoleHandler 也不处理 CTRL+C
- opengl - glGetTexParameterIiv 和 glGetTexParameterIuiv 有什么用?
- r - 如何用 plot() 去除圆周上的水平线