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

