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

web3中async异步结果未解析返回undefined问题(Ethernaut第3关)

Ethernaut第3关guess值计算代码返回undefined问题修复

你的代码存在两个核心问题:

1. async函数定义语法错误

你写的async do_guess => { ... }是语法错误,这种写法会被JS解析器识别为「接收一个名为do_guess的参数的匿名async箭头函数」,你没有把这个匿名函数赋值给任何变量,因此后续调用do_guess()时,do_guess本身就是未定义/undefined值,await一个undefined自然得到undefined结果。

2. BN构造参数格式错误

web3.utils.BN默认按十进制解析传入的字符串,而block.hash是带0x前缀的十六进制字符串,直接传入会导致BN实例构造异常,无法得到正确的运算结果。

修正后的可运行代码

const do_guess = async () => {
    const blockNo = await web3.eth.getBlockNumber()
    const block = await web3.eth.getBlock(blockNo)
    const factor = new web3.utils.BN('57896044618658097711785492504343953926634992332820282019728792003956564819968')
    // 去掉0x前缀,指定按16进制解析生成BN实例
    const blockHashBN = new web3.utils.BN(block.hash.slice(2), 16)
    const res = blockHashBN.div(factor)
    return res.toString()
}

const value = await do_guess()
console.log(value)

通关注意事项

你当前代码取的是执行脚本时刻的最新区块hash,但合约内校验逻辑用的是发起guess交易被打包时对应区块的hash,直接运行脚本得到的结果大概率和合约最终计算结果不匹配。实际通关时要么提高交易gas费确保交易在下一个区块立即打包,要么直接在合约调用逻辑内读取对应区块hash计算,避免区块高度不匹配导致答案错误。

问题运行截图

问题运行截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:48:34