Я думаю, что провайдеры Ethereum сильно путаются из-за отсутствия стандарта в начале.Я хотел бы разобраться, как я понимаю.
Из 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
экземпляра, givenProvider
на Web3
используется модуль.
Давайте посмотрим документы MetaMask:
MetaMask внедряет глобальный API в веб-сайты, которые посещают его пользователи в window.ethereum (также доступно для window.web3.currentProvider дляустаревшие причины)
Это основано на ERC1193
По сути, Web3
назначает window.ethereum
свойству Web3.givenProvider
, если поставщик соответствует ERC1193 (как MetaMask) и может выполнять нечеткую магию для обнаружения провайдера, если нет.
Следуя этой логике, в экземпляре 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