【问题标题】:web3.eth.accounts[0] returns undefinedweb3.eth.accounts[0] 返回未定义
【发布时间】: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 上的隐私模式设置

标签: javascript ethereum solidity web3js 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()

【讨论】:

    猜你喜欢
    • 2020-08-30
    • 2018-02-19
    • 2018-07-06
    • 2019-09-01
    • 1970-01-01
    • 2021-09-15
    • 2018-12-05
    • 2014-08-25
    • 2019-11-17
    相关资源
    最近更新 更多