web3.js 中的 currentprovider 和 givenprovider 有什么区别

What is the difference between currentprovider and givenprovider in web3.js

谁能解释一下 currentprovider 和 givenprovider 的区别?

我是这样想的。 givenprovider 通过网络浏览器连接到区块链,并且 currentprovider 通过元掩码连接到区块链。

我不确定我的理解是否正确。

你有什么想法吗?

我认为以太坊提供商存在很多混淆,因为一开始就缺乏标准。我想按我的理解整理一下。

来自 web3 文档:

import Web3 from 'web3';

// "Web3.providers.givenProvider" will be set if in an Ethereum supported browser.
const web3 = new Web3(Web3.givenProvider || 'ws://some.local-or-remote.node:8546', net, options);

请注意,要初始化 web3 实例,会使用 Web3 模块上的 givenProvider

让我们看看 MetaMask 文档:

MetaMask injects a global API into websites visited by its users at window.ethereum (Also available at window.web3.currentProvider for legacy reasons)

这是基于ERC1193

基本上,如果提供者符合 ERC1193(如 MetaMask),Web3window.ethereum 分配给 Web3.givenProvider 属性,并且可以执行一些模糊魔术来检测提供者如果没有。

按照这个逻辑,在实例上 web3.currentProvider 是 web3 初始化的提供者,而 web3.givenProvider 是环境注入的提供者(如 window.ethereum)。例如:

import Web3 from 'web3';
export const givenWeb3 = new Web3(Web3.givenProvider)
givenWeb3.currentProvider === givenWeb3.givenProvider // true

export const externalProvider = new Web3('http://localhost:8545')
externalProvider.currentProvider === externalProvider.givenProvider // false