合约交互时发现访问不了地址的bug

在编写合约交互的过程中,需要一个web3实例用来调用合约访问账户等。

我们需要设置一个provider。为了保证不会覆盖一个已有的provider(Mist浏览器或安装了MetaMak的浏览器会提供Provider),需要先检查 web3 实例是否已存在。

1
2
3
4
5
6
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else {
// set the provider you want from Web3.providers
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}

这样就可以使用web3提供的接口方法了。比如:

1
2
3
web3.eth.defaultAccount
web3.eth.getBalance
......

启动程序npm run dev,打开了浏览器3000端口访问到了首页界面。

但是发现控制台console出现了错误提示:invalid address

image-20191007154528876

以为是本地由Ganache软件生成的账号程序访问不到。

上网找解决方法都说账户需要解锁,也就是调用web3的解锁账户的命令。

web3.eth.personal.unlockAccount(web3.eth.defaultAccount).then(console.log('Account unlocked!'));

但是运行了之后提醒unlockcount函数不存在。

image-20191007154917354

之后偶然在网上搜索”metamask访问不了账户地址“这个问题,终于问题得到了解决。

https://blog.csdn.net/rejames/article/details/89876967

原来最新版的metamask插件默认启用了隐私模式,而官方文档中并没有更新。

现在新的检查方式为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 检查是否是新的MetaMask 或 DApp浏览器
var web3Provider;
if (window.ethereum) {
web3Provider = window.ethereum;
try {
// 请求用户授权
await window.ethereum.enable();
} catch (error) {
// 用户不授权时
console.error("User denied account access")
}
} else if (window.web3) { // 老版 MetaMask Legacy dapp browsers...
web3Provider = window.web3.currentProvider;
} else {
web3Provider = new Web3.providers.HttpProvider('http://localhost:8545');
}
web3 = new Web3(web3Provider);

成功引入后,你现在可以使用 web3 对象的API 了。

Contents