TransactionBuilder становится неизменным после отправки - PullRequest
0 голосов
/ 12 декабря 2018

Мне нужно несколько узлов для построения одной транзакции.Чтобы добиться этого, я создаю TransactionBuilder и передаю его узлам, которые затем добавляют к нему свои состояния.

Это кажется законной практикой, поскольку в официальной документации 1005 * упоминается 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

1 Ответ

0 голосов
/ 13 декабря 2018

Corda сериализует объекты в различных точках (например, когда они отправляются или принимаются между узлами в потоках, когда они отправляются через RPC), используя собственную платформу сериализации.

В Java, если вы получаете сериализованный объектгде одно из полей - List, невозможно проверить, был ли рассматриваемый список изначально изменяемым или неизменным.Поэтому в Corda мы по умолчанию десериализуем такие списки как неизменяемые списки.

Вы должны сделать копию оригинала TransactionBuilder, как вы уже делаете.

...