Corda передача линейного состояния, сбор подписей - PullRequest
0 голосов
/ 05 мая 2019

Я реализовал несколько команд, где нотариальная подпись соответствует сценарию использования.Хотя есть 2 случая, когда у меня есть открытые вопросы:

  • У меня есть поле владельца, которое меняется из состояния ввода / вывода, все хорошо, но я хочу, чтобы новый владелец подписал егоНапример, мне нужен механизм для извлечения состояния через хранилище (последнее не использовалось?), я думаю, мне нужно пройти проверку подлинности и отфильтровать участников и заставить нового владельца подписать его, например, «нажать кнопку», как мне это сделать??

  • Как мне завершить линейное состояние, например, что оно не может принимать участие в какой-либо форме транзакции / команды после этого?

@InitiatingFlow
@StartableByRPC
class DeviceFlow(private val deviceState: DeviceState,
                 private val stateAndRef: Optional<StateAndRef<DeviceState>>,
                 private val command: DeviceContract.Commands)
    : FlowLogic<SignedTransaction>() {
    override val progressTracker = tracker()

    companion object {
        object GENERATING_TRANSACTION : Step("Generating transaction based on new IOU.")
        object VERIFYING_TRANSACTION : Step("Verifying contract constraints.")
        object SIGNING_TRANSACTION : Step("Signing transaction with our private key.")
        object GATHERING_SIGS : Step("Gathering the counterparty's signature.") {
            override fun childProgressTracker() = CollectSignaturesFlow.tracker()
        }

        object FINALISING_TRANSACTION : Step("Obtaining notary signature and recording transaction.") {
            override fun childProgressTracker() = FinalityFlow.tracker()
        }

        fun tracker() = ProgressTracker(
                GENERATING_TRANSACTION,
                VERIFYING_TRANSACTION,
                SIGNING_TRANSACTION,
                GATHERING_SIGS,
                FINALISING_TRANSACTION
        )
    }

    @Suspendable
    override fun call(): SignedTransaction {
        progressTracker.currentStep = GENERATING_TRANSACTION
        val notary = serviceHub.networkMapCache.getNotary(CordaX500Name("Notary", "London", "GB"))
        val transactionBuilder = TransactionBuilder(notary = notary)
                .addCommand(command, deviceState.participants.map { it.owningKey })
                .addOutputState(deviceState, DeviceContract.ID)
        if (stateAndRef.isPresent)
            transactionBuilder.addInputState(stateAndRef.get())
        progressTracker.currentStep = VERIFYING_TRANSACTION
        transactionBuilder.verify(serviceHub)
        progressTracker.currentStep = SIGNING_TRANSACTION
        val signedTransaction = serviceHub.signInitialTransaction(transactionBuilder)
        val otherPartySession = initiateFlow(notary!!)
        val fullySignedTx = subFlow(
                CollectSignaturesFlow(signedTransaction, setOf(otherPartySession), GATHERING_SIGS.childProgressTracker()))
        progressTracker.currentStep = FINALISING_TRANSACTION
        return subFlow(FinalityFlow(fullySignedTx, setOf(otherPartySession), FINALISING_TRANSACTION.childProgressTracker()))
    }
}

@InitiatedBy(DeviceFlow::class)
class DeviceCreateFlowResponder(val flowSession: FlowSession) : FlowLogic<SignedTransaction>() {
    @Suspendable
    override fun call(): SignedTransaction {
        val signTransactionFlow = object : SignTransactionFlow(flowSession) {
            override fun checkTransaction(stx: SignedTransaction) = requireThat {
                val output = stx.tx.outputs.single().data
                "This must be a Device transaction." using (output is DeviceState)
            }
        }
        val txId = subFlow(signTransactionFlow).id
        return subFlow(ReceiveFinalityFlow(flowSession, expectedTxId = txId))
    }
}

1 Ответ

0 голосов
/ 30 мая 2019

Выход нового владельца

  • Вы получите последнюю версию состояния из хранилища. Последняя версия должна быть неиспользованной.
  • Создайте TransactionBuilder и добавьте это состояние в качестве ввода.
  • Создайте реплику этого состояния, но измените свойство владельца, чтобы отразить нового владельца. Добавьте это как вывод в TransactionBuilder.
  • Убедитесь, что ваши контрактные правила, регулирующие состояние, обеспечивают, чтобы предыдущий владелец и новый владелец были обязательными подписывающими лицами.

Завершение линейного (или любого состояния)

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