title: 合约交互时发现访问不了地址的bug
date: "2019-09-29 10:17:16"
tags: Dapp开发
categories: 技术驿站
在编写合约交互的过程中,需要一个web3实例用来调用合约访问账户等。
我们需要设置一个provider。为了保证不会覆盖一个已有的provider(Mist浏览器或安装了MetaMak的浏览器会提供Provider),需要先检查 web3 实例是否已存在。
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提供的接口方法了。比如:
web3.eth.defaultAccount
web3.eth.getBalance
......
启动程序npm run dev
,打开了浏览器3000端口访问到了首页界面。
但是发现控制台console出现了错误提示:invalid address
以为是本地由Ganache软件生成的账号程序访问不到。
上网找解决方法都说账户需要解锁,也就是调用web3的解锁账户的命令。
web3.eth.personal.unlockAccount(web3.eth.defaultAccount).then(console.log('Account unlocked!'));
但是运行了之后提醒unlockcount
函数不存在。
之后偶然在网上搜索”metamask访问不了账户地址“这个问题,终于问题得到了解决。
https://blog.csdn.net/rejames/article/details/89876967
原来最新版的metamask插件默认启用了隐私模式,而官方文档中并没有更新。
现在新的检查方式为:
// 检查是否是新的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 了。