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 调用因缺少合约地址而失败的主要内容,如果未能解决你的问题,请参考以下文章
使用Ganache,web3js和remix在个人区块链上部署并调用合约
使用 web3js 和 galanche 调用具有价值的以太坊智能合约