0

我是 Solidity 的新手,我正在通过一个简单的 web 应用程序来探索它。我有一个 Web 应用程序,它接受一些详细信息和一个按钮,应将详细信息部署到智能合约创建的块中。详细信息已从 remix 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]返回“未定义”,这就是我的情况。

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

还有如何检查我正在使用的 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 方法之外使用时再次返回“未定义”。在 if 部分中编写进一步的逻辑也无助于给出上述异常。

我已经尝试了一些事情,但无法找到解决方案。如果我有任何误解,请指导和纠正。

编辑

你可以在这里找到源代码。 https://github.com/anishsamant/Solidity-Demo

请参阅Courses.sol以获取 Solidity 文件 请参阅index.html以获取 Web 应用程序。

4

1 回答 1

4

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

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

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

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

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

    } catch (err) {
        console.log(err);
    }
}

myFunc()
于 2018-06-06T11:41:03.510 回答