Hyperledger Composer新手求助:代币转账BNA开发与参与者信息更新
嘿,作为Hyperledger Composer的新手,你已经开了个好头!下面我来帮你把代币交易的逻辑补全,同时实现参与者详情更新的功能,一步步来:
一、完善代币转账的交易逻辑
你的Model.cto定义没问题,但logic.js里的transfer1函数还没写完,而且还得加上必要的校验(不然容易出现余额负数或者无效转账的情况)。完整的函数应该是这样的:
async function transfer1(transferNew) { // 先校验转账金额是否合法,不能是0或者负数 if (transferNew.val <= 0) { throw new Error('转账金额必须大于0,请检查输入!'); } // 校验转出方的余额是否足够支付这笔转账 if (transferNew.from.balance < transferNew.val) { throw new Error(`转出方${transferNew.from.id}余额不足,当前余额:${transferNew.from.balance}`); } // 执行余额变更操作 transferNew.from.balance -= transferNew.val; transferNew.to.balance += transferNew.val; // 关键步骤:把更新后的参与者信息保存到注册表,不然变更不会持久化 const participantRegistry = await getParticipantRegistry('org.acme.remittance.Member'); await participantRegistry.updateAll([transferNew.from, transferNew.to]); // 可选:打印日志方便调试,在Composer Playground里能看到这些日志 console.log(`转账成功!从${transferNew.from.name}(ID:${transferNew.from.id})转${transferNew.val}到${transferNew.to.name}(ID:${transferNew.to.id})`); }
二、实现参与者详情更新功能
要实现这个功能,你需要先在Model.cto里新增一个专门的更新交易,然后在logic.js里写对应的处理逻辑:
1. 更新你的Model.cto
在原有的定义下面添加这个交易:
transaction UpdateMemberDetails { --> Member member // 要更新详情的参与者 o String name optional // optional表示这个字段可以选填,不需要每次都改 o String mobile optional }
用optional是因为用户可能只想更新手机号,或者只想改名字,不用每次都填所有字段。
2. 在logic.js里添加处理函数
async function updateMemberDetails(updateTx) { // 获取要更新的参与者对象 const targetMember = updateTx.member; // 只更新传入了新值的字段,没传的就保持原来的内容 if (updateTx.name) { targetMember.name = updateTx.name; } if (updateTx.mobile) { targetMember.mobile = updateTx.mobile; } // 保存更新后的参与者信息到注册表 const participantRegistry = await getParticipantRegistry('org.acme.remittance.Member'); await participantRegistry.update(targetMember); console.log(`参与者${targetMember.id}的详情已成功更新!`); }
三、额外的安全提示(必做!)
别忘了在permissions.acl里设置权限规则,不然任何人都能随意发起转账或者修改别人的信息。给你两个基础的规则示例:
// 允许成员发起自己账户的转账(只能转自己的钱) rule MemberCanInitiateOwnTransfer { description: "Allow a member to initiate a transfer from their own account" participant: "org.acme.remittance.Member" operation: CREATE resource: "org.acme.remittance.Transfer" condition: (participant.getIdentifier() == resource.from.getIdentifier()) } // 允许成员更新自己的详情(只能改自己的信息) rule MemberCanUpdateOwnDetails { description: "Allow a member to update their own details" participant: "org.acme.remittance.Member" operation: CREATE resource: "org.acme.remittance.UpdateMemberDetails" condition: (participant.getIdentifier() == resource.member.getIdentifier()) }
测试小技巧
你可以用Hyperledger Composer Playground来快速测试:创建几个Member参与者,发起Transfer交易看看余额是否正确变化,再发起UpdateMemberDetails交易验证信息更新是否生效。
内容的提问来源于stack exchange,提问作者Mouazzam
相关产品推荐
相关产品推荐

