我有甲方创建了一个交易并添加了一个参与者乙方。在交易中创建的状态与乙方共享。有一些状态属性,如FirstName,LastName和Status。 乙方将状态更改为绿色,然后交易完成并记录到乙方和甲方的保险库中。
甲方和丙方之间遵循相同的程序。 甲方和甲方之间也遵循同样的过程。
------Party B
/
Party A /-------Party C
\
\------Party D
我有一个用例,其中乙方,丙方,甲方可以将状态中的状态更改为绿色。一旦所有状态变为绿色,我想在甲方启动流程。
在Corda中实现此功能的最佳方法是什么?
答案 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())
}
}
}