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

