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

Corda单节点配置多用户账户的方案咨询及功能支持确认

嘿,好问题!Corda从4.0版本开始就正式支持单节点多账户功能了,专门通过Accounts SDK来实现这个需求——正好匹配你给Bank节点创建多个客户账户的场景。下面是一步步的实现方案:

一、先配置Accounts SDK依赖

首先得确保你的Bank节点项目引入了Accounts相关的依赖和服务:

  • 在节点的build.gradle文件中添加Corda Accounts SDK的cordapp依赖:
dependencies {
    // 其他依赖...
    cordapp project(":corda-accounts")
    cordapp project(":corda-accounts-workflows")
}
  • 在节点配置文件node.conf中启用Accounts服务:
services:
  - type: com.r3.corda.lib.accounts.workflows.services.AccountService
二、创建与管理客户账户

你可以通过自定义Flow或者直接调用Accounts API来创建和管理客户账户:

1. 编写创建账户的Flow

写一个可通过RPC调用的Flow来创建单个客户账户:

@InitiatingFlow
@StartableByRPC
class CreateCustomerAccountFlow(private val customerName: String) : FlowLogic<UUID>() {
    override fun call(): UUID {
        // 获取AccountService实例
        val accountService = serviceHub.cordaService(AccountService::class.java)
        // 创建账户,返回AccountInfo对象(包含账户ID、名称等信息)
        val accountInfo = accountService.createAccount(customerName)
        // 返回账户唯一ID,方便后续操作
        return accountInfo.id
    }
}

2. 通过RPC批量创建账户

启动Bank节点后,用RPC客户端调用上面的Flow,批量生成客户账户:

// 连接到Bank节点的RPC服务
val rpcConnection = CordaRPCClient(NetworkHostAndPort("localhost", 10006)).start("bank_rpc_user", "password")
val proxy = rpcConnection.proxy

// 创建多个客户账户
val aliceAccountId = proxy.startFlowDynamic(CreateCustomerAccountFlow::class.java, "Alice Smith").returnValue.get()
val bobAccountId = proxy.startFlowDynamic(CreateCustomerAccountFlow::class.java, "Bob Johnson").returnValue.get()
val charlieAccountId = proxy.startFlowDynamic(CreateCustomerAccountFlow::class.java, "Charlie Davis").returnValue.get()

3. 查询已创建的账户

如果需要查询账户信息,可以用AccountService的API:

val accountService = serviceHub.cordaService(AccountService::class.java)
// 通过账户名称查询
val aliceAccount = accountService.accountInfo("Alice Smith").single()
// 通过账户ID查询
val bobAccount = accountService.accountInfo(bobAccountId).single()
三、实现账户间的交易与隔离

每个账户都有独立的密钥对和状态隔离,交易时需要明确指定账户的身份:

示例:账户间资金转账Flow

假设你有自定义的CashState来记录资金,下面是一个账户间转账的Flow示例:

@InitiatingFlow
@StartableByRPC
class TransferFundsBetweenAccounts(
    private val fromAccountId: UUID,
    private val toAccountId: UUID,
    private val amount: Amount<Currency>
) : FlowLogic<SignedTransaction>() {
    override fun call(): SignedTransaction {
        val accountService = serviceHub.cordaService(AccountService::class.java)
        val fromAccount = accountService.accountInfo(fromAccountId).single()
        val toAccount = accountService.accountInfo(toAccountId).single()

        // 构建转账输出状态
        val outputState = CashState(
            amount = amount,
            ownerAccountId = toAccountId,
            issuer = serviceHub.myInfo.legalIdentities.first()
        )

        // 构建交易Builder
        val notary = serviceHub.networkMapCache.notaryIdentities.first()
        val transactionBuilder = TransactionBuilder(notary)
            .addOutputState(outputState, CASH_CONTRACT_ID)
            .addCommand(
                CashCommands.Transfer(),
                listOf(fromAccount.state.data.host.owningKey, toAccount.state.data.host.owningKey)
            )

        // 验证交易并签名
        transactionBuilder.verify(serviceHub)
        val signedTx = serviceHub.signInitialTransaction(transactionBuilder, fromAccount.state.data.host.owningKey)

        // 收集接收方账户的签名(如果需要)
        val toAccountSession = initiateFlow(toAccount.state.data.host)
        val fullySignedTx = subFlow(CollectSignaturesFlow(signedTx, listOf(toAccountSession)))

        // 完成交易并广播
        return subFlow(FinalityFlow(fullySignedTx, listOf(toAccountSession)))
    }
}
四、账户权限控制(可选)

为了保证客户账户的安全性和隔离性,你可以:

  • 给不同客户分配独立的RPC用户,绑定对应的账户ID,限制他们只能查询和操作自己的账户
  • 在Flow中添加权限校验,确保只有账户的拥有者才能发起交易:
// 在Flow的call()方法中添加校验
val callerIdentity = serviceHub.myInfo.legalIdentities.first()
require(callerIdentity == fromAccount.state.data.host) { "你没有权限操作该账户" }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:41:33