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

无需Web服务器的Corda RPC客户端启动Flow技术问询

嘿,关于Corda RPC客户端启动Flow的问题,我刚好有不少实践经验,咱们把你的疑问一个个拆解清楚:

核心疑问:要不要在客户端和Cordapp中重复Flow类?

完全不需要!你只需要在RPC客户端项目里引入包含ExampleFlow.Initiator的Cordapp JAR依赖就可以了。

原因很简单:RPC调用时,客户端只需要知道Flow的类名、构造参数的类型信息,实际的Flow逻辑是在Corda节点内部运行的。你可以通过Maven/Gradle把Cordapp的JAR包作为客户端项目的依赖(比如本地JAR引入或者私有仓库拉取),这样客户端就能直接引用ExampleFlow.Initiator.class,完全不用拷贝Flow的代码。

无Web服务器场景下的RPC客户端结构

这种场景下的客户端就是一个普通的控制台/桌面应用,和Web框架完全无关,结构非常简洁:

项目结构要点

  • 单独的Java/Kotlin项目,和你的Cordapp项目分离
  • 依赖只需要两个部分:
    • Corda官方的RPC客户端依赖(比如corda-rpc)
    • 你自己的Cordapp JAR包依赖(包含Flow和自定义状态/合约类)

核心代码流程(附Java示例)

整个流程就是「连接节点RPC → 验证参与方身份 → 启动Flow → 监听进度/获取结果」,代码示例如下:

import net.corda.client.rpc.CordaRPCClient;
import net.corda.client.rpc.CordaRPCConnection;
import net.corda.core.contracts.StateAndRef;
import net.corda.core.identity.CordaX500Name;
import net.corda.core.messaging.CordaRPCOps;
import net.corda.core.utilities.NetworkHostAndPort;
import com.example.flow.ExampleFlow; // 直接来自Cordapp依赖

public class RPCFlowClient {
    public static void main(String[] args) {
        // 1. 配置目标节点的RPC地址(看node.conf里的rpcSettings.address)
        NetworkHostAndPort nodeAddress = new NetworkHostAndPort("localhost", 10006);
        CordaRPCClient client = new CordaRPCClient(nodeAddress);

        // 2. 使用节点配置的合法RPC用户登录(权限要够!)
        try (CordaRPCConnection connection = client.start("user1", "test")) {
            CordaRPCOps rpcOps = connection.getProxy();

            // 3. 获取Flow需要的其他参与方身份
            CordaX500Name otherPartyName = new CordaX500Name("PartyB", "New York", "US");
            var otherParty = rpcOps.wellKnownPartyFromX500Name(otherPartyName);

            if (otherParty == null) {
                System.err.println("找不到目标节点的身份信息,请确认节点已加入网络");
                return;
            }

            // 4. 启动跟踪式Flow(可实时看进度)
            var flowHandle = rpcOps.startTrackedFlowDynamic(
                    ExampleFlow.Initiator.class,
                    100, // 对应Flow构造参数的iouValue
                    otherParty // 对应Flow构造参数的otherParty
            );

            // 5. 监听Flow执行进度(可选,不需要可以去掉)
            flowHandle.getProgress().subscribe(progressMsg -> {
                System.out.println("Flow执行进度更新:" + progressMsg);
            });

            // 6. 阻塞等待Flow执行完成,获取结果
            StateAndRef<?> flowResult = flowHandle.getReturnValue().get();
            System.out.println("Flow执行成功!返回的状态数据:" + flowResult.getState().getData());
        } catch (Exception e) {
            System.err.println("启动Flow失败:");
            e.printStackTrace();
        }
    }
}
关键注意事项
  • RPC用户权限:一定要在目标节点的node.conf里给RPC用户配置StartFlow权限,比如:
    rpcUsers=[
      {
        username=user1,
        password=test,
        permissions=["StartFlow.*", "InvokeRpc.*"]
      }
    ]
    
  • 版本一致性:客户端的Corda依赖版本必须和节点的Corda版本完全一致,否则会出现序列化异常
  • 自定义类型访问:如果Flow的参数是你自己定义的类型(比如IOUState),客户端必须通过Cordapp依赖能访问到这些类,不然序列化会失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:24:56