web3js 调用因缺少合约地址而失败

Posted

技术标签:

【中文标题】web3js 调用因缺少合约地址而失败【英文标题】:web3js call fails on missing contract address 【发布时间】:2018-12-19 21:32:08 【问题描述】:

要在我的本地设置上部署合约,我使用 truffle。开发网络由 Ganache 运行。从应用程序 A 向网络发送数据也没有问题(使用 truffle/truffle-contract 包)。我在编译和迁移合同时在同一工作目录中启动此应用程序

但是,当我有另一个应用程序连接到此网络并尝试检索数据时,我遇到了问题。这不使用任何松露,只使用 web3js。

我检索数据如下:

let contractInstance = new web3.eth.Contract(abi, result.contractHashes)
if (!contractInstance) handleError('Could not find contract instance... Shutting down')

for (let i in result) 
  let internalId = result[i]._id

  contractInstance.methods.getStartDate(internalId).call(function(error, result) 
    if (error) handleFatalError(error, mongoClient) // This error is triggered

    console.log(result)
  )

这总是返回我:

错误:此合约对象尚未设置地址,请先设置地址。

来自48609913 我知道当您忘记上述提到的步骤时会发生这种情况,但是,我不是在创建新合约,我只是在引用网络中已经存在的合约。如果我通过地址引用合同,它不知道合同地址,这对我来说没有意义吗? 根据这篇文章,我尝试使用web3 options address 之后的步骤缺失(跟踪和错误),但错误消息相同。

也使用

call().then(....)

call( from: result.contractHashes , function(error, result) ....)

没用。我很无知,无法理解这个问题的推理。我希望你们当中有更多经验的人可以。

【问题讨论】:

你用的是什么版本的web3.js,result.contractHashes的值是多少? 这是一个奇怪的变量,它应该是合约的地址。 嗨 smarx,感谢您抽出宝贵时间。我有版本 1.0.0-beta.34。另外我同意命名,应该是contractAddress,必须在另一个项目中更改它。 还有,它的价值是什么?你登录了吗? (我的猜测是它是空的。) Smarx,谢谢!所以我记录了“结果”并看到了一个 contractHashes 值。但是,我没有看到它实际上必须是 result[0].contractHashes。有点傻,但感谢您提出更具体的建议。 【参考方案1】:

检查您是否正在导入正确的 ABI 文件。当我指向一个过时的 ABI 文件时,我遇到了类似的问题。在我指出正确的那个之后,错误就消失了。

【讨论】:

这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review【参考方案2】:

首先检查提供的地址是否正确或先部署合约然后尝试访问它。因为contractInstance.options.address = null

【讨论】:

这条评论帮助我意识到我错误地命名了我的环境变量。谢谢!

以上是关于web3js 调用因缺少合约地址而失败的主要内容,如果未能解决你的问题,请参考以下文章

如何检测将在 web3js 中失败的事务

使用Ganache,web3js和remix在个人区块链上部署并调用合约

从 web3js 调用 Factory 合约的子函数

使用 web3js 和 galanche 调用具有价值的以太坊智能合约

java使用web3j,部署智能合约在测试链上,并调用(万字详细教程)

java使用web3j,部署智能合约在测试链上,并调用(万字详细教程)