【发布时间】: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