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

Solidity中Timestamp验证冷却期未触发回滚问题排查求助

智能合约冷却期验证失效排查

我在智能合约中实现资产冷却期逻辑:铸造资产时将冷却结束时间存入map,通过block.timestamp获取当前时间验证冷却是否到期。特意设置测试用例让验证失败,但添加的require判断未触发回滚。

相关代码片段

获取冷却时间与当前时间的代码:

uint256 assetCoolingPeriodEndTime = _realTokenStorage()
    ._assetCoolingPeriodEndTime[assetId];

uint256 currentTime = block.timestamp;
console.log("currentTime:", currentTime);

console.log("assetCoolingPeriodEndTime:", assetCoolingPeriodEndTime);

添加的验证判断:

require(
    currentTime >= assetCoolingPeriodEndTime,
    "asset restricted by the owner"
);

调用日志输出

currentTime: 1688098632
assetCoolingPeriodEndTime: 1690690627

从日志可见当前时间明显早于冷却结束时间,但require未触发回滚,以下是几个排查方向:

  • 检查代码执行顺序:确认require语句是否在日志打印之后执行,且中间没有逻辑修改currentTime或assetCoolingPeriodEndTime的值。如果变量在日志后被意外覆盖,会导致判断条件不符合预期。
  • 验证存储读取正确性:确认_realTokenStorage()返回的存储实例是否正确,以及assetId参数是否传入无误。排查是否存在存储槽位冲突、或存储结构定义错误导致读取的冷却时间并非目标资产的值。
  • 排查测试环境时间操作:如果使用Hardhat/Foundry等测试框架,检查测试代码中是否调用了vm.warp()或类似方法篡改区块时间,导致block.timestamp在日志打印后被修改。
  • 确认合约继承/重写逻辑:若合约存在继承关系,或_realTokenStorage()是重写方法,检查是否有父合约逻辑覆盖了当前存储读取逻辑,导致获取的冷却时间不正确。
  • 验证条件逻辑匹配业务需求:确认业务逻辑是否确实要求"冷却结束后才能操作",如果实际需求是冷却期内禁止操作,当前require的条件是正确的,但如果逻辑写反(比如误将条件设为currentTime <=),则会导致判断失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:24:54