Не может ли узел наблюдателя Корда переиздать деньги? - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь сохранить только определенные состояния в состоянии хранилища узла Observer.

В моем сценарии использования Observer является эмитентом денежных средств, где наблюдатель выдает наличные и передает их на другие узлы в сети Corda.Когда узлы Corda выполняют транзакцию, в качестве наблюдателя все денежные состояния узлов также сохраняются на узле-наблюдателе.

При попытке перевыпуска денежных средств от Observer выдает ошибку ниже:

java.util.NoSuchElementException: Collection contains no element matching the predicate.
        at net.corda.node.services.keys.PersistentKeyManagementService.getSigningKeyPair(PersistentKeyManagementService.kt:110) ~[corda-node-3.3-corda.jar:?]
        at net.corda.node.services.keys.PersistentKeyManagementService.sign(PersistentKeyManagementService.kt:101) ~[corda-node-3.3-corda.jar:?]
        at net.corda.core.transactions.TransactionBuilder.toSignedTransaction(TransactionBuilder.kt:224) ~[corda-core-3.3-corda.jar:?]
        at net.corda.core.node.ServiceHub$DefaultImpls.signInitialTransaction(ServiceHub.kt:219) ~[corda-core-3.3-corda.jar:?]
        at net.corda.core.node.ServiceHub$DefaultImpls.signInitialTransaction(ServiceHub.kt:233) ~[corda-core-3.3-corda.jar:?]
        at net.corda.node.services.api.ServiceHubInternal$DefaultImpls.signInitialTransaction(ServiceHubInternal.kt) ~[corda-node-3.3-corda.jar:?]
        at net.corda.node.internal.AbstractNode$ServiceHubInternalImpl.signInitialTransaction(AbstractNode.kt:836) ~[corda-node-3.3-corda.jar:?]
        at net.corda.core.node.ServiceHub$DefaultImpls.signInitialTransaction(ServiceHub.kt:255) ~[corda-core-3.3-corda.jar:?]
        at net.corda.node.services.api.ServiceHubInternal$DefaultImpls.signInitialTransaction(ServiceHubInternal.kt) ~[corda-node-3.3-corda.jar:?]
        at net.corda.node.internal.AbstractNode$ServiceHubInternalImpl.signInitialTransaction(AbstractNode.kt:836) ~[corda-node-3.3-corda.jar:?]
        at net.corda.finance.flows.CashPaymentFlow.call(CashPaymentFlow.kt:66) ~[corda-finance-3.3-corda.jar:?]
        at net.corda.finance.flows.CashPaymentFlow.call(CashPaymentFlow.kt:26) ~[corda-finance-3.3-corda.jar:?]
        at net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290) ~[corda-core-3.3-corda.jar:?]
        at net.corda.finance.flows.CashIssueAndPaymentFlow.call(CashIssueAndPaymentFlow.kt:41) ~[corda-finance-3.3-corda.jar:?]
        at net.corda.finance.flows.CashIssueAndPaymentFlow.call(CashIssueAndPaymentFlow.kt:24) ~[corda-finance-3.3-corda.jar:?]
        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]

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

Редактировать:

На узле регулятора, вызывая CashIssueAndPaymentFlow через API, как показано ниже:

rpcOps.startFlow(::CashIssueAndPaymentFlow, issueAmount, OpaqueBytes.of(0), toTransferNode, false, notaryIdentity).returnValue.get()

При отправке потока других узловтранзакция для наблюдателя:

val observer = serviceHub.networkMapCache.getPeerByLegalName(CordaX500Name.parse(FundTransferConstants.OBSERVER_NAME)) ?: throw IllegalArgumentException("Unknown observer name.")
        subFlow(BroadcastTransactionTransfer.BroadcastTransactionToObserversTransfer(finalTx, listOf(observer)))

Сценарий приведен ниже:

  1. Выпуск наличных и перевод в узел с использованием CashIssueAndPaymentFlow на узле регулятора.

  2. Выполните транзакцию с использованием денежных средств и отправьте транзакцию наблюдателю (регулирующему органу).Денежные средства тратятся на другую сторону с помощью Cash.generateSpend ()

  3. Снова попробуйте перевыпустить денежные средства, выдает вышеуказанный вопрос.

Я думаю, что аналогичная проблемаопубликовано в git на https://github.com/corda/corda/issues/4368

Нужна помощь в этом отношении.

1 Ответ

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

Когда вы вызываете ServiceHub.signInitialTransaction без передачи определенного ключа, платформа пытается подписать транзакцию с помощью ключа по умолчанию вашего узла:

fun signInitialTransaction(builder: TransactionBuilder): SignedTransaction = 
    signInitialTransaction(builder, legalIdentityKey)

private val legalIdentityKey: PublicKey get() = 
    this.myInfo.legalIdentitiesAndCerts.first().owningKey

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

...