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
相关产品推荐
相关产品推荐

