web3.eth.accounts[0] 返回未定义

Posted

技术标签:

【中文标题】web3.eth.accounts[0] 返回未定义【英文标题】:web3.eth.accounts[0] returns undefined 【发布时间】:2018-11-04 01:27:40 【问题描述】:

我是 Solidity 的新手,我正在通过一个简单的 web 应用程序来探索它。我有一个 Web 应用程序,它接受一些详细信息和一个按钮,应将详细信息部署到智能合约创建的块中。详细信息已从混音 IDE 成功部署,但通过 Web 应用程序进入时出现以下异常。

inpage.js:1 Uncaught Error: Invalid number of arguments to Solidity function
at Object.InvalidNumberOfSolidityArgs (inpage.js:1)
at u.validateArgs (inpage.js:1)
at u.toPayload (inpage.js:1)
at u.sendTransaction (inpage.js:1)
at u.execute (inpage.js:1)
at htmlButtonElement.<anonymous> ((index):231)
at HTMLButtonElement.dispatch (jquery-3.2.1.slim.min.js:3)
at HTMLButtonElement.q.handle (jquery-3.2.1.slim.min.js:3)

在网上冲浪时,我发现这可能是因为 web3.eth.accounts[0] 返回 'undefined' 这就是我的情况。

相反,虽然在控制台上显示 web3.eth 时,它确实在索引 0 处显示帐户和 MetaMask 地址。 我读到它可能是因为 MetaMask 可能还不完全支持 web3js 1.0,但我无法找到解决方案。

还有如何检查我正在使用的 web3 的版本,以及如何在必要时降级。

这就是我尝试访问web3.eth.accounts[0]的方式

web3.eth.defaultAccount = web3.eth.accounts[0];
console.log(web3.eth.defaultAccount);  // returns undefined

我也尝试了以下方法,但无济于事:

var myAccount;
web3.eth.getAccounts(function(err,res)
     if(!err)
     
        myAccount = res;
        console.log(myAccount);
     
);

这将返回帐户地址,但 myAccount 变量在 getAccounts 方法之外使用时再次返回“undefined”。在 if 部分中编写进一步的逻辑也无助于给出上述异常。

我尝试了一些方法,但无法找到解决方案。如有理解有误,敬请指正。

编辑

您可以在此处找到源代码。 https://github.com/anishsamant/Solidity-Demo

请参阅 Courses.sol 了解 Solidity 文件 网页应用请参考 index.html

【问题讨论】:

你在哪里部署它?你能展示你的构造函数的源代码吗? 由于您使用的是web3.eth.getAccounts的异步方式,因此该变量只会在回调范围内定义。换句话说,您必须将所有代码放入该函数中。请注意,这可能会将您发送至callbackhell.com 我尝试将我的进一步逻辑放在该函数中,但它仍然给出上述异常。 尝试更改 Metamask 上的隐私模式设置 【参考方案1】:

getAccounts 等 web3 中的方法是异步的。

注意 web3 版本 1.x.x 返回承诺。所以你使用 Promise,你也可以使用 async/await 语法来实现它。

web3 版本 0.x.x 不返回承诺,您只能使用回调。

web3 版本 1.x.x 的代码(我只能假设您可能正在使用)。

const myFunc = async () => 
    try 
        const myAccounts = await web3.eth.getAccounts();
        console.log(myAccounts)
        return myAccounts;

     catch (err) 
        console.log(err);
    


myFunc()

【讨论】:

以上是关于web3.eth.accounts[0] 返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

获取 web3.eth.accounts (MetaMask) 的问题

如何使用 1.2.x 版本从 web3 获取特定帐户?

web3.eth.accounts.decrypt 在 cryp.createDecipheriv 抛出错误

[Contract] web3.eth.getAccounts, web3.eth.getCoinbase 使用场景区别

web3js eth vs 帐户 vs 个人

使用 web3.js v0.2.6 创建帐户