Невозможно удалить участника из дальнейшей транзакции с тем же активом - PullRequest
0 голосов
/ 19 марта 2020

Стороны в бизнесе. . Стороны A, B, C

Актив: Заказ

Сторона A отправляет первую транзакцию обеим сторонам B, а C

Сторона B отправляет следующую транзакция к A и C (в том же порядке мы использовали запрос хранилища для получения состояния ввода)

Теперь мы хотим, чтобы Сторона C не получала никаких будущих транзакций по этому Заказу. Когда мы удаляем C из списка участников, мы получаем следующую ошибку. Похоже, Корда берет список участников из состояния ввода. Пожалуйста, предложите решение проблемы.

java .lang.IllegalArgumentException: сеансы потока не были предоставлены для следующих участников транзакции: [O = C, L = NV, C = US ]

1 Ответ

0 голосов
/ 19 марта 2020

Это сообщение об ошибке приходит от FinalityFlow: https://github.com/corda/corda/blob/56067acd208b1b58f17cca85c0eb40ad0e9a1ff5/core/src/main/kotlin/net/corda/core/flows/FinalityFlow.kt#L159 -L161

Чтобы объяснить, почему вы получили эту ошибку, давайте go вернемся к определению participants : https://github.com/corda/corda/blob/56067acd208b1b58f17cca85c0eb40ad0e9a1ff5/core/src/main/kotlin/net/corda/core/contracts/ContractState.kt#L19

A участник - любая сторона, которая должна быть уведомлена о создании или использовании состояния.

После этого утверждения, когда ваша транзакция имеет один (или более) входов и один (или более) выходов, тогда эта транзакция должна быть записана (то есть finalized) в объединении всех participants всех входных и выходных состояний, потому что снова; следуя определению participants, они должны быть уведомлены о создании или использовании их состояний.

Вот почему поток завершения ожидает FlowSession для каждого участника транзакции и выдает ошибку, которую вы видели, когда обнаруживает пропущенную.

Теперь о проблемах конфиденциальности (другая часть вашего вопроса); хотя FinalityFlow записывает завершенную транзакцию в объединении всех участников; он не записывает все выходные состояния во всех хранилищах, у него есть параметр с именем StatesToRecord, который по умолчанию равен ONLY_RELEVANT:
https://github.com/corda/corda/blob/56067acd208b1b58f17cca85c0eb40ad0e9a1ff5/core/src/main/kotlin/net/corda/core/flows/FinalityFlow.kt#L47

Что означает узел будет регистрировать только те состояния, в которых он участвует.

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

Важно: Узел равноправного доступа, который вызывает ReceiveFinalityFlow, может переопределить значение по умолчанию statesToRecord и выбрать ALL_VISIBLE, что означает запись всех состояний вывода транзакции, независимо от того, участник это или нет: https://github.com/corda/corda/blob/56067acd208b1b58f17cca85c0eb40ad0e9a1ff5/core/src/main/kotlin/net/corda/core/flows/FinalityFlow.kt#L272 -L274

Предлагаю вам прочитать мою статью об анализе конфиденциальности с использованием CDL здесь; подробнее об этом топи c: https://blog.b9lab.com/how-to-design-a-cordapp-and-analyze-privacy-leaks-using-cdl-views-da825953ff54

...