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
相关产品推荐
相关产品推荐

