在Corda中如何实现跨节点状态共享?以Alice、Bob、Daniel节点为例
在Corda中向Daniel节点共享Alice与Bob的状态数据
以下是几种可行的实现方式,根据你的业务需求选择即可:
1. 创建状态时直接将Daniel设为参与者
当Alice和Bob初始化共享状态时,直接把Daniel的Party对象加入状态的participants列表。Corda会自动将状态分发给所有参与者节点,Daniel的vault中会同步出现该状态。
示例代码片段:
data class SharedState( val dataValue: String, override val participants: List<Party> ) : ContractState // 创建状态时包含Daniel val targetState = SharedState( dataValue = "需要共享的内容", participants = listOf(aliceParty, bobParty, danielParty) )
2. 通过自定义Flow主动发送状态给Daniel
如果状态已经创建(仅Alice和Bob为参与者),可以由任意一方发起自定义Flow,将状态直接发送给Daniel:
- 发起方(如Alice)先在本地vault中查询目标状态
- 使用
SendStateAndRefFlow将状态发送给Daniel对应的节点 - Daniel端可通过内置的
ReceiveStateAndRefFlow接收状态
示例发起方Flow代码:
@InitiatingFlow @StartableByRPC class SendStateToDaniel(private val stateLinearId: UniqueIdentifier) : FlowLogic<Unit>() { override fun call() { // 查询本地vault中的目标状态 val targetState = serviceHub.vaultService.queryBy<SharedState>() .states.single { it.state.data.linearId == stateLinearId } // 获取Daniel的Party对象 val daniel = serviceHub.identityService.partiesFromName("Daniel", false).single() // 建立节点会话并发送状态 val session = initiateFlow(daniel) subFlow(SendStateAndRefFlow(session, listOf(targetState))) } }
3. 将Daniel设为状态观察者(Corda 4+支持)
如果Daniel仅需要读取状态数据、无需参与后续交易,可以把他设为状态的观察者。观察者节点会收到状态副本,但无法发起针对该状态的交易。
示例代码片段:
data class SharedState( val dataValue: String, override val participants: List<Party>, override val observers: List<Party> ) : ContractState, ObservableState // 创建状态时指定Daniel为观察者 val targetState = SharedState( dataValue = "需要共享的内容", participants = listOf(aliceParty, bobParty), observers = listOf(danielParty) )
内容的提问来源于stack exchange,提问作者Rifat
相关产品推荐
相关产品推荐

