You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:41:19