zoukankan      html  css  js  c++  java
  • 13.以太坊中web3访问合约账户出现问题——2019年09月29日


    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

    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插件默认启用了隐私模式,而官方文档中并没有更新。

    现在新的检查方式为:

    // 检查是否是新的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 了。

  • 相关阅读:
    React Native 开发豆瓣评分(三)集成 Redux
    React Native 开发豆瓣评分(二)路由配置
    React Native 开发豆瓣评分(一)环境搭建&配置模拟器
    VSCode 搭建 React Native 环境
    webpack4 + ejs 构建多页应用
    react-native 沉浸式状态栏
    react-native——tab配置及跳转
    uni-app 入门之 nvue (weex) 爬坑记
    javascript中bind()、call()、apply()的使用
    mysql数据库中文乱码配置文件解决以及常见mysql命令
  • 原文地址:https://www.cnblogs.com/oneapple/p/12030489.html
Copyright © 2011-2022 走看看