当交易对手的状态属性发生变化时自动触发流

时间:2018-04-04 09:08:48

标签: corda

我有甲方创建了一个交易并添加了一个参与者乙方。在交易中创建的状态与乙方共享。有一些状态属性,如FirstName,LastName和Status。 乙方将状态更改为绿色,然后交易完成并记录到乙方和甲方的保险库中。

甲方和丙方之间遵循相同的程序。 甲方和甲方之间也遵循同样的过程。

           ------Party B
         /
Party A /-------Party C
        \
         \------Party D

我有一个用例,其中乙方,丙方,甲方可以将状态中的状态更改为绿色。一旦所有状态变为绿色,我想在甲方启动流程。

在Corda中实现此功能的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

有两种方法可以做到这一点:

使用Corda服务:

服务是节点初始化时创建的节点中的长期对象,允许跨流共享状态和功能。

我们可以按如下方式定义我们的服务。每当引发一个标志时它会递增一个计数器,并在标志被引发三次后触发一个流程:

@CordaService
class FlagService(private val services: AppServiceHub) : SingletonSerializeAsToken() {
    var flagCount = 0

    fun incrementFlagCount() {
        flagCount++

        if (flagCount == 3) {
            val flagsRaisedFlow = FlagsRaised()
            services.startFlow(flagsRaisedFlow)
        }
    }
}

一旦标志被提升三次,服务将开始的流程如下:

@InitiatingFlow
@StartableByService
class FlagsRaised : FlowLogic<Unit>() {
    @Suspendable
    override fun call() {
        logger.info("FlagsRaised flow called.")
        // TODO: Flow activity after all flags are raised.
    }
}

缔约方B,C和D使用以下流程举起一面旗帜:

@InitiatingFlow
@StartableByRPC
class Initiator(val counterparty: Party) : FlowLogic<Unit>() {
    @Suspendable
    override fun call() {
        // TODO: Other flow activity before flag is raised.
        val session = initiateFlow(counterparty)
        session.send(true)
    }
}

甲方通过调用以下流程进行响应,该流程检索FlagService并调用incrementFlagCount

@InitiatedBy(Initiator::class)
class Responder(val counterpartySession: FlowSession) : FlowLogic<Unit>() {
    @Suspendable
    override fun call() {
        counterpartySession.receive<Boolean>()
        val flagService = serviceHub.cordaService(FlagService::class.java)
        flagService.incrementFlagCount()
    }
}

通过检查每个流程的结尾:

我们还可以在每个标志被引发之后检查是否所有三个标志都被引发。如果有,我们开始一个子流程:

@InitiatingFlow
@StartableByRPC
class Initiator(val counterparty: Party) : FlowLogic<Unit>() {
    @Suspendable
    override fun call() {
        // TODO: Other flow activity before flag is raised.
        val session = initiateFlow(counterparty)
        session.send(true)
    }
}

@InitiatedBy(Initiator::class)
class Responder(val counterpartySession: FlowSession) : FlowLogic<Unit>() {
    @Suspendable
    override fun call() {
        counterpartySession.receive<Boolean>()
        val allFlagsRaised =
                TODO("Check (e.g. using the vault) whether all three flags have been raised.")
        if (allFlagsRaised) {
            subFlow(FlagsRaised())
        }
    }
}