如何在Hyperledger Composer中校验特定资产与参与者的交易是否存在
解决区块链交易重复提交校验问题
针对你描述的业务场景——提交包含参与者TATA、资产FINANCEPROGRAM的交易前,需校验该组合的交易是否已存在(存在则拒绝提交),我整理了修正后的实现方案:
业务场景回顾
- 现有参与者:IDFC、TATA、MRF
- 目标资产:FINANCEPROGRAM
- 待提交交易字段:参与者(TATA)、资产(FINANCEPROGRAM)、loanAmount、loantenure
- 核心校验规则:同一参与者+同一资产的交易只能存在一次,重复提交需拒绝
修正后的查询与校验代码
原查询存在语法错误(参数名含空格、资源引用不完整),以下是修正后的完整实现:
// 定义重复交易查询语句,确保实体和参数名无语法问题 const duplicateCheckQuery = query('SELECT com.ett.blockchain.Programmeben WHERE (beneficiary == _$beneficiary AND bankprogramme == _$bankProgram)'); // 执行查询并处理校验逻辑 return query(duplicateCheckQuery, { // 传入完整的区块链资源引用格式:resource:命名空间.类型#ID beneficiary: 'resource:com.ett.blockchain.Beneficiary#TATA', bankProgram: 'resource:com.ett.blockchain.Program#FINANCEPROGRAM' }) .then(results => { // 判断是否存在重复交易 if (results.length > 0) { // 存在重复,抛出错误拒绝提交 throw new Error('提交失败:该参与者已拥有对应资产的交易记录,无法重复提交'); } else { // 无重复,允许继续执行交易流程 return true; } }) .catch(error => { // 捕获并处理查询异常 console.error('校验重复交易时出错:', error); throw error; });
关键细节说明
- 资源引用完整性:区块链中的参与者和资产都是资源实例,必须使用
resource:命名空间.实体类型#实例ID的完整格式,不能仅传递ID,否则查询无法匹配到正确资源。 - 参数名一致性:查询语句中的参数(如
_$bankProgram)不能包含空格,且需与后续传递的参数键名完全一致,否则会出现参数绑定失败。 - 校验逻辑位置:建议将这段校验代码放在交易提交的前置逻辑中(比如交易处理器函数的开头),确保在执行交易写入前完成重复检查。
内容的提问来源于stack exchange,提问作者Harshitha C
相关产品推荐
相关产品推荐

