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

如何通过程序化方式(如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 07:02:55