web3调用合约add方法await后无返回 后续代码不执行问题排查
问题排查与解决方法
- 首先添加异常捕获逻辑,确认await执行过程中是否抛出了未处理的错误,原有代码没有错误捕获分支,一旦promise进入reject状态就会直接中断后续代码执行,不会有任何日志输出。改造后的代码示例:
onSubmit = async (event) => { try { event.preventDefault() console.log("Submitting the form...") var day = new Date(Date.now()).getDate() var month = new Date(Date.now()).getMonth() + 1 var year = new Date(Date.now()).getFullYear() var today = new Date(year, month -1, 1) // 注意:JS getTime返回的是毫秒级时间戳,以太坊合约普遍使用秒级时间戳,这里大概率是问题根源 var todayTime = Math.floor(today.getTime() / 1000) const ipfsadded = await ipfs.add({path:this.state.fileName, content:this.state.buffer}) var ipfsHash = ipfsadded.cid.toString() this.setState({ipfsHash: ipfsHash}) console.log('hash:', ipfsHash, " / name =", this.state.fileName ) console.log("inserindo na blockchain..") const accounts = await web3.eth.getAccounts() // 先估算gas,避免固定gas值不足 const gasLimit = await contract.methods.add(ipfsHash, this.state.fileName, this.state.fileType, todayTime).estimateGas({from:accounts[0]}) console.log("估算gas值:", gasLimit) // 传入确认数配置,默认等待1个区块确认就返回 var result = await contract.methods.add(ipfsHash, this.state.fileName, this.state.fileType, todayTime) .send({from:accounts[0], gas: gasLimit}) .on('transactionHash', (hash) => { console.log("交易已提交,哈希:", hash) }) .on('confirmation', (confNumber, receipt) => { console.log("确认数:", confNumber) }) console.log("resultado =", result) console.log("File submitted on blockchain!") } catch (e) { console.error("执行过程报错:", e) } }
- 校验入参格式是否符合合约要求:最常见的问题是时间戳单位不匹配,JS生成的
getTime()是13位毫秒值,而以太坊合约中block.timestamp返回的是10位秒级时间戳,如果合约的add方法中存在require(_time <= block.timestamp)之类的校验,传入毫秒值会直接触发校验失败,交易执行revert,自然不会返回结果。 - 检查合约与节点配置:确认ABI和合约地址是最新部署的版本,web3连接的链ID与MetaMask当前使用的链ID一致,节点处于正常同步状态没有区块延迟。
- 调整web3确认配置:web3.js默认需要等待2个区块确认才会resolve promise,如果链出块速度慢,可以手动调整send方法的确认数阈值,设置为1即可大幅降低等待时间。
内容的提问来源于stack exchange,提问作者GabrielMS
相关产品推荐
相关产品推荐

