使用near-workspace.js+AVA测试合约:如何获取区块时间戳及调整Sandbox时间?
在near-workspace.js+AVA环境中处理区块时间戳与sandbox时间调整
获取当前/最新区块时间戳
在本地测试环境中,有两种常用方式获取区块时间戳:
直接查询sandbox的最新区块信息
使用near-workspace.js提供的sandbox.getBlock('latest')方法,返回的区块对象包含timestamp字段(单位为纳秒),示例代码:const latestBlock = await sandbox.getBlock('latest'); console.log('当前区块时间戳:', latestBlock.timestamp);从合约执行上下文获取
如果是在合约内部需要时间戳,Rust合约可通过env::block_timestamp()获取,AssemblyScript合约则用context.blockTimestamp。测试时若要验证合约使用的时间戳,可让合约方法返回该值,或在合约调用后立即查询最新区块的时间戳(交易会被打包进当前最新区块)。
在near-sandbox中调整时间
near-sandbox提供了两种调整时间的方式,满足不同测试场景:
快进指定时长
使用sandbox.fastForward()方法,传入以纳秒为单位的时长,快速推进区块时间:// 快进1小时(1小时=3600秒,转换为纳秒需乘以1e9) await sandbox.fastForward(3600 * 1_000_000_000);直接设置目标时间戳
使用sandbox.setTimestamp()方法,直接指定区块的时间戳(单位纳秒):// 设置为当前时间后1天的时间戳(先将当前毫秒时间转为纳秒,再加1天的纳秒数) const targetTimestamp = Date.now() * 1_000_000 + 86400 * 1_000_000_000; await sandbox.setTimestamp(targetTimestamp);
注意事项
- NEAR生态中所有时间戳的单位均为纳秒,进行时间转换时需注意单位换算;
- 调整时间后,再次调用
sandbox.getBlock('latest')即可确认时间已更新,后续合约执行时获取的区块时间戳也会同步变化; - 若需要更详细的方法定义,可查看项目依赖中
@near/workspaces包的类型定义文件,里面包含所有sandbox相关方法的参数与返回值说明。
内容的提问来源于stack exchange,提问作者Alex Agadganov
相关产品推荐
相关产品推荐

