无需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和自定义状态/合约类)
- Corda官方的RPC客户端依赖(比如
核心代码流程(附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
相关产品推荐
相关产品推荐

