由于安全原因,MetaMask 将 web3@0.20.7已弃用,并且不再由 web3.js团队维护, 因此MetaMask停止 web3.js 版本 0.20.7 作为 window.web3 对象的注入, MetaMask 仍然在 window.web3 注入一个虚拟对象,以便在网站尝试访问 window.web3 时发出警告。所有一些早起的dapp没有升级会报错无法使用,解决额方式如下:

1、在浏览器中增加对应支持老版本的插件,如chrome浏览器中的MetaMask Legacy Web3插件(该插件已被淘汰2022-01补充)

将 MetaMask 的旧版 window.web3 API 插件添加到您的浏览器 MetaMask 扩展为您访问的网站提供 API,以便它们可以与区块链进行交互。 截至 2020 年 12 月,他们默认停止注入 web3.js API,这提高了安全性和性能,但可能会破坏旧的和未维护的网站。 将此扩展与 MetaMask 结合使用,这样可以继续使用那些较旧的dapp站点。

Dapp开发老版本web3@0.20.7不支持问题_web3.js

2、升级Dapp,升级方式如下:

对于新版本web3.js,直接使用 window.ethereum 对于很多 web3 站点来说,window.ethereum 提供的 API 就足够了。大多数 web3 API 只是映射到 RPC 方法,所有这些方法都可以使用 ethereum.request() 来请求。例如,这里首先使用 window.web3 执行一些操作,然后使用 window.ethereum 执行它们的等效操作。

(1)推荐使用 window.ethereum来替代

//在和以太坊兼容的浏览器中使用 web3.js 时,当前环境的原生 provider 会被浏览器设置
//例如安装了MetaMask,它在浏览器中注入了window.ethereum下的提供者对象,我们就可以通过window.ethereum来初始化web3对象
var web3Provider;
if (window.ethereum) {
web3Provider = window.ethereum;
try {
// 请求用户授权
await window.ethereum.enable();
} catch (error) {
//用户不授权时,这里处理异常情况,同时可以设置重试等机制
console.log(error)
}
} else if (window.web3) {// 老版可以使用 MetaMask Legacy dapp browsers...
web3Provider = window.web3.currentProvider;
} else {
// 这里处理连接在不支持dapp的地方打开的情况
web3Provider = new Web3.providers.HttpProvider('https://eth-testnet.tokenlon.im');
console.log("Non-Ethereum browser detected. You should consider trying MetaMask!")

//这种情况下表示用户在不支持dapp的浏览器打开,无法初始化web3

//这里一般的处理逻辑是:使用第一篇中的那种自己初始化,获得区块上的基础数据,但是没法获取用户的账户信息
//或者直接提示错误,不进行任何处理
}
this.web3 = new Web3(web3Provider);

// console.log(this.web3.eth+'=======')
if(window.web3.hasOwnProperty('eth')) // 老版可以使用 MetaMask Legacy dapp browsers...
this.account = window.web3.eth.defaultAccount
else {
//++++++++++++++++++++完全使用window.ethereum替代 ++++++++++++++++++++
const arrAccounts = await window.ethereum.request({ method: 'eth_accounts' });
this.account = arrAccounts[0]
console.log(this.account+'-----------')
// alert('请安装MetaMask Legacy Web3插件');
}

(2)​​使用@metamask/legacy-web3不推荐,可以MetaMask官方搜索对应文档​

补充MetaMask官方的说明如下:

In January of 2021, we made a number of breaking changes to our provider API, and removed our injected window.web3. These changes are live on all platforms as of version:  9.0.2 of the MetaMask browser extension 1.0.9 of MetaMask Mobile This guide describes how to migrate to the new provider API, and how to replace our window.web3.

2021 年 1 月,我们对提供程序 API 进行了一些重大更改,并删除了注入的 window.web3。 这些更改在所有平台上生效:MetaMask 浏览器扩展的 9.0.2 MetaMask Mobile 1.0.9 本指南描述了如何迁移到新的提供者 API,以及如何替换我们的 window.web3。