如何通过程序化方式(如RPC)获取节点上运行的CorDapps列表?
如何通过程序化方式(比如RPC)获取节点上运行的CorDapps?
当然可以!你完全不用靠盯着控制台或者日志来收集节点加载的CorDapps信息,Corda提供了专门的程序化方法,其中最常用的就是通过RPC接口来实现。
核心方法:使用RPC的getCordappInfos()
Corda的RPC客户端API里提供了getCordappInfos()方法,专门用来获取节点已加载的所有CorDapp的元数据,返回的信息和你在控制台看到的Loaded CorDapps列表完全对应,包括名称、版本、签名者、主类等关键信息。
下面是一个Kotlin的代码示例,演示如何通过RPC调用获取这些信息:
import net.corda.client.rpc.CordaRPCClient import net.corda.core.messaging.CordaRPCOps import net.corda.core.utilities.NetworkHostAndPort fun main() { // 替换成你的节点RPC地址和端口 val nodeAddress = NetworkHostAndPort("localhost", 10006) val rpcClient = CordaRPCClient(nodeAddress) // 使用合法的RPC用户凭证登录 rpcClient.start("user1", "test").use { connection -> val proxy: CordaRPCOps = connection.proxy // 获取所有已加载的CorDapp信息 val cordappList = proxy.getCordappInfos() // 遍历输出信息 cordappList.forEach { cordapp -> println("CorDapp名称: ${cordapp.name}") println("版本: ${cordapp.version}") println("签名者: ${cordapp.signers.joinToString(", ")}") println("主类: ${cordapp.mainClass?.name ?: "无指定主类"}") println("---") } } }
版本兼容性说明
这个方法在Corda 3.x及以上版本就已经可用了,如果你使用的是更早的版本,可以通过查询节点的附件存储(因为每个CorDapp的JAR包都会作为附件存储在节点中)来间接获取,示例代码如下:
// 查询所有CorDapp类型的附件 val cordappAttachments = proxy.attachmentQuery { it.isUploadedByNode && it.signers.isNotEmpty() } cordappAttachments.forEach { attachment -> println("CorDapp附件ID: ${attachment.id}") println("签名者: ${attachment.signers.joinToString(", ")}") }
不过这种方式需要你自己从附件元数据中解析CorDapp的名称和版本,不如getCordappInfos()直接方便。
其他可选方式
如果你的节点启用了REST API,也可以通过调用/node/cordapps端点来获取CorDapps信息,但RPC仍然是程序化集成场景下的首选方式,因为它提供了更丰富的交互能力和类型安全的API。
内容的提问来源于stack exchange,提问作者MonoThreaded
相关产品推荐
相关产品推荐

