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

R3 Corda技术问询:如何向新增节点共享历史数据?

Corda中向所有节点(含新增节点)共享公开数据的方案

核心前提

Corda是隐私优先的许可DLT,节点默认仅存储自己参与的交易数据,不会像公链那样自动同步全网络账本。因此要实现全节点(含新增节点)共享公开数据(比如商品广告),需要主动设计数据分发机制。

最优最简方案:指定权威存储节点+新节点主动拉取

针对你提到的商品广告场景,最直接的方式是指定一个网络内的权威节点(比如专门的广告发布节点或监管节点)作为公开数据的唯一存储源,所有广告交易都会同步到该节点,同时广播给当前网络内的所有节点。当新节点加入网络后,通过主动发起查询Flow从该权威节点拉取所有历史广告数据。

代码示例(核心Flow实现)

1. 新节点用于拉取广告的查询Flow

@InitiatingFlow
@StartableByRPC
class RetrieveAllAdvertisementsFlow(private val repositoryNode: Party) : FlowLogic<List<AdvertisementState>>() {
    override fun call(): List<AdvertisementState> {
        // 向权威节点发起查询请求
        val session = initiateFlow(repositoryNode)
        session.send(AdvertisementQueryRequest())
        
        // 接收返回的广告状态列表
        return session.receive<List<AdvertisementState>>().unwrap { it }
    }
}

2. 权威节点用于响应查询的Flow

@InitiatedBy(RetrieveAllAdvertisementsFlow::class)
class RetrieveAllAdvertisementsResponder(private val session: FlowSession) : FlowLogic<Unit>() {
    override fun call() {
        // 接收查询请求
        val request = session.receive<AdvertisementQueryRequest>().unwrap { it }
        
        // 查询节点存储的所有广告状态(需提前定义AdvertisementState的schema)
        val advertisements = serviceHub.vaultService.queryBy(AdvertisementState::class.java).states.map { it.state.data }
        
        // 返回查询结果
        session.send(advertisements)
    }
}

3. 广告发布的广播Flow(确保当前所有节点都收到)

@InitiatingFlow
@StartableByRPC
class PublishAdvertisementFlow(private val advertisement: AdvertisementState) : FlowLogic<SignedTransaction>() {
    override fun call(): SignedTransaction {
        // 创建广告状态的交易
        val txBuilder = TransactionBuilder(serviceHub.networkMapCache.notaryIdentities.first())
            .addOutputState(advertisement, ADVERTISEMENT_CONTRACT_ID)
            .addCommand(AdvertisementContract.Commands.Publish(), ourIdentity.owningKey)
        
        // 自我签名
        val signedTx = serviceHub.signInitialTransaction(txBuilder)
        
        // 获取当前网络内所有节点(通过Network Map)
        val allNodes = serviceHub.networkMapCache.allNodes.map { it.legalIdentities.first() }
        val sessions = allNodes.map { initiateFlow(it) }
        
        // 广播交易给所有节点
        return subFlow(FinalityFlow(signedTx, sessions))
    }
}

补充说明

  • 权威节点的可靠性:可以通过网络共识机制确保该节点的可用性,或者设置多个备份节点避免单点故障。
  • 数据验证:新节点拉取广告后,可以通过交易的签名和哈希验证数据的完整性,确保未被篡改。
  • 替代方案:如果不需要实时广播,也可以利用Corda的Network Map扩展,在新节点注册时触发数据同步,但实现复杂度更高,不如主动拉取方案简洁。

内容的提问来源于stack exchange,提问作者Matthias

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:50:39