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

Composer中.update与.updateAll方法无法正常执行问题咨询

实现合约到期自动标记无效的完整逻辑(基于Hyperledger Composer)

嘿,看起来你正在基于Hyperledger Composer开发类似Playground中Bond示例的应用,核心需求是在合约到期日将过期合约的valid字段设为false。我先把你给出的代码片段补全并优化,再拆解关键实现逻辑:

完整实现代码

function SOD(sod) { // eslint-disable-line no-unused-vars
    return getAssetRegistry('org.acme.otc.LiveContract')
        .then(function (contractReg) {
            // 获取所有LiveContract类型的合约资产
            return contractReg.getAll();
        })
        .then(function (allContracts) {
            // 获取当前系统时间,用于和合约到期日对比
            const currentDate = new Date();
            
            // 筛选出到期日早于当前时间的合约
            const expiredContracts = allContracts.filter(contract => {
                // 将合约中的到期日转为Date类型(确保字段是DateTime类型)
                const maturityDate = new Date(contract.maturityDate);
                return maturityDate < currentDate;
            });

            // 批量更新过期合约的valid状态为false
            expiredContracts.forEach(contract => {
                contract.valid = false;
            });

            // 将更新后的合约提交回资产注册表
            return getAssetRegistry('org.acme.otc.LiveContract')
                .then(function (contractReg) {
                    return contractReg.updateAll(expiredContracts);
                });
        })
        .catch(function (error) {
            // 捕获并处理流程中的异常
            console.error('处理到期合约时发生错误:', error);
            throw error;
        });
}

关键逻辑拆解

  • 获取资产注册表:通过getAssetRegistry('org.acme.otc.LiveContract')获取对应类型的资产操作入口,这是所有合约资产读写的基础。
  • 筛选过期合约:
    • 调用getAll()拉取所有合约资产;
    • 用filter方法结合日期对比,挑出maturityDate(你可以根据实际模型调整字段名)早于当前时间的合约;
    • 注意必须把合约中的日期字段转为Date类型再做比较,避免字符串格式导致的对比误差。
  • 批量更新状态:遍历筛选出的过期合约,将valid设为false,再用updateAll()批量提交更新——相比单个调用update(),批量操作更适合处理大量合约的场景。
  • 异常处理:添加catch块捕获流程中的错误,方便排查问题,同时保证异常能向上抛出不被吞掉。

额外优化建议

  • 触发时机:这个SOD(推测是Start Of Day的缩写)函数建议通过Composer的**定时事件(Timer Event)**触发,比如每天凌晨自动执行一次,实现到期合约的自动清理。
  • 性能优化:如果合约数量很大,getAll()会拉取所有数据导致性能问题,建议用自定义查询直接筛选过期合约:
    先定义查询文件(.qry):
    query selectExpiredContracts {
        description: "查询所有已到期的合约"
        statement:
            SELECT org.acme.otc.LiveContract
                WHERE (maturityDate < _$currentDate)
    }
    
    然后在函数中替换筛选逻辑:
    return query('selectExpiredContracts', {currentDate: currentDate.toISOString()})
        .then(function(expiredContracts) {
            // 后续更新逻辑不变
        })
    
  • 模型校验:确保你的LiveContract资产模型中包含对应的字段,比如CTO定义:
    asset LiveContract identified by contractId {
        o String contractId
        o DateTime maturityDate
        o Boolean valid default=true
        // 其他业务字段...
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:48:03