You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Corda中无外部CorDapp源码时如何定义InitiatedBy流?

如何编写被外部CorDapp发起流触发的InitiatedBy流

如果没有对方CorDapp的源码,想要让自己的CorDapp里的InitiatedBy流被触发,核心是精准定位对方发起流的类信息,同时保证状态/合约的兼容性,具体步骤如下:

  • 第一步:获取发起流的全限定类名
    你需要拿到对方发起流类的完整路径(比如com.othercompany.cordapp.flows.InitiateTransferFlow)。获取方式有几种:

    • 直接询问对方开发团队要相关文档或类信息;
    • 如果能拿到对方的CorDapp JAR包,用反编译工具(比如JD-GUI)打开JAR,找到发起流类后查看它的全限定名;
    • 也可以用命令行工具查看JAR内容:jar tf other-cordapp.jar,找到对应的flow类文件后,把路径里的/换成.、去掉.class后缀,就是全限定类名。
  • 第二步:编写你的InitiatedBy流
    在自己的CorDapp里创建响应流,注意@InitiatedBy注解里要用字符串形式的全限定类名(因为没有源码,无法直接引用该类)。示例代码如下:

    @InitiatedBy("com.othercompany.cordapp.flows.InitiateTransferFlow")
    class MyResponseFlow(private val otherPartySession: FlowSession) : FlowLogic<SignedTransaction>() {
        @Suspendable
        override fun call(): SignedTransaction {
            // 编写你的业务逻辑:接收对方消息、验证状态、签署交易等
            val signTransactionFlow = object : SignTransactionFlow(otherPartySession) {
                override fun checkTransaction(stx: SignedTransaction) {
                    // 自定义交易校验逻辑,确保交易符合你的业务规则
                }
            }
            val txId = subFlow(signTransactionFlow)
            return subFlow(ReceiveFinalityFlow(otherPartySession, expectedTxId = txId))
        }
    }
    
  • 第三步:保证状态与合约的兼容性
    对方的发起流会传递特定的状态对象,你的响应流必须能识别和处理这个状态:

    • 如果对方公开了状态和合约的定义,直接把这些类复制到你的CorDapp里(建议包名和对方保持一致,避免序列化问题);
    • 如果对方提供了包含状态/合约的SDK或依赖JAR,直接把这个依赖加入你的CorDapp构建文件(比如Gradle的build.gradle)。
      这一步是核心,否则你的流会因为无法序列化/识别对方状态而报错。
  • 第四步:验证版本兼容性
    确保你的CorDapp使用的Corda版本和对方完全一致,不同版本的Corda可能存在API或序列化机制差异,会导致流通信失败。

最后把你的CorDapp部署到节点上,当对方发起流时,你的节点就会自动触发这个InitiatedBy流处理交易了。

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

火山引擎 最新活动