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

