R3 Corda - java .lang.IllegalArgumentException: инициатор CollectSignaturesFlow должен был подписать транзакцию - PullRequest
0 голосов
/ 19 марта 2020

Я написал следующий поток для облегчения транзакции между двумя сторонами - issuer и subscriber. Я получаю эту ошибку на этапе Gathering the counterparty's signature.:

java.lang.IllegalArgumentException: The Initiator of CollectSignaturesFlow must have signed the transaction.

Stacktrace:

java.lang.IllegalArgumentException: The Initiator of CollectSignaturesFlow must have signed the transaction.
    at net.corda.core.flows.CollectSignaturesFlow.call(CollectSignaturesFlow.kt:89) ~[corda-core-3.3-corda.jar:?]
    at net.corda.core.flows.CollectSignaturesFlow.call(CollectSignaturesFlow.kt:64) ~[corda-core-3.3-corda.jar:?]
    at net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290) ~[corda-core-3.3-corda.jar:?]
    at com.sample.flow.sampleFlow$Initiator.call(sampleFlow.kt:106) ~[main/:?]
    at com.sample.flow.sampleFlow$Initiator.call(sampleFlow.kt:30) ~[main/:?]
    at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:96) [corda-node-3.3-corda.jar:?]
    at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:44) [corda-node-3.3-corda.jar:?]
    at co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    at co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    at co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_181]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_181]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_181]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
    at net.corda.node.utilities.AffinityExecutor$ServiceAffinityExecutor$1$thread$1.run(AffinityExecutor.kt:62) [corda-node-3.3-corda.jar:?]

Мой код: flow.kt

progressTracker.currentStep = GATHERING_SIGS
val participantsParties = sampleState.participants.map { serviceHub.identityService.wellKnownPartyFromAnonymous(it)!! }
val flowSessions = (participantsParties - serviceHub.myInfo.legalIdentities.get(0)).map { initiateFlow(it) }.toSet()
val fullySignedTx = subFlow(CollectSignaturesFlow(partSignedTx, flowSessions, listOf(ourSigningKey), GATHERING_SIGS.childProgressTracker()))

Я попробовал решения, которые были представлены онлайн, а именно:

  1. , чтобы добавить сеансы всех сторон в качестве параметра к CollectSignaturesFlow
  2. I пробовал со всеми конструкторами CollectSignaturesFlow, упомянутыми в документации

Я не могу понять, где я иду не так. Может ли кто-нибудь помочь мне с этим? Заранее спасибо!

1 Ответ

1 голос
/ 19 марта 2020

Ваше решение неверно; Используя поток cordapp-example, я продемонстрирую, как 2 (или более) стороны подписывают транзакцию:

  1. Во-первых, ваш поток должен состоять из 2 частей: Initiator и Responder.
  2. Если ваша issuer является стороной, которая начинает Initiator, то ваша subscriber является стороной, которая управляет Responder.
  3. issuer начинается с создания транзакции , которая идентифицирует входы, выходы, команды и необходимые подписывающие лица.
  4. issuer подписывает транзакцию, обратите внимание, как называется результат partSignedTx; это потому что subscriber еще не подписал.
  5. issuer создает сеанс с подписчиком для использования в качестве канала связи, через который они собирают подпись subscriber (вы не создаете сеанс с самим собой, как вы сделал, только с другими).
  6. issuer запрашивает подпись из subscriber, используя этот сеанс.
  7. subscriber внутри Responder поток подписывает транзакцию .
  8. issuer внутри Initiator поток получает подпись . CollectSignaturesFlow имеет send (для отправки транзакции на подпись) и receive (для получения подписи). Обратите внимание, как результат называется fullySignedTx, потому что теперь и 1053 *, и subscriber подписали транзакцию.
...