Мое dApp может использовать учетные записи Metamask с данным провайдером, но не при настройке объекта Web3 на URL-адрес поставщика Rinkeby?

Сегодня первый день, когда я развернул тестовую сеть ( Rinkeby ), а не мою локальную клиентскую сеть Ganache. Я думаю, что мне нужно разъяснение по учетным записям, когда речь идет о Metamask и Rinkeby.

Если я инициализирую объект Web3 при создании на стороне клиента со свойством GivenProvider , я могу получить доступ к своим учетным записям Metamask, когда я выполняю вызов метода getAccounts() из кода Javascript моей веб-страницы. Однако, если вместо этого я инициализирую объект Web3, используя URL-адрес Rinkeby, украшенный Infura API, я получаю пустой результат при вызове getAccounts () . Я предполагаю, что это потому, что учетные записи не «на Ринкеби» ( не знаю, как еще это сказать ), а поддерживаются кошельком Metamask?

Моя общая цель состоит в том, чтобы сервер мог указать желаемую сеть вместо того, чтобы полагаться на то, что Metamask будет установлен на желаемую сеть Ethereum при запуске веб-страницы моего dApp.

Кроме того, кто-нибудь знает, как инициализировать объект Web3, не имея ключа API Infura, видимого для кого-то, кто отслеживает код в отладчике браузера?

// This is how I get a valid accounts result.  Metamask is currently set to Rinkeby.
const Web3 = require('web3');   
const localWeb3 = new Web3(Web3.givenProvider); 

localWeb3.eth.getAccounts()
.then(function (result) {}

// This results in an empty accounts result.
const Web3 = require('web3');   
const localWeb3 = new Web3("https://rinkeby.infura.io/<redacted>"); 

localWeb3.eth.getAccounts()
.then(function (result) {}
Я думаю, что вторая часть вашего вопроса не связана с первым вопросом, может быть, это может заполнить другой пост.

Ответы (1)

Это происходит потому, что когда он вызывает с помощью , Web3.givenProviderон никогда не достигнет узла Ethereum для запроса учетных записей, вместо этого они просто возвращают ваши учетные записи на Metamask, а вызовы Rinkeby с использованием Infura ничего не возвращают, потому что там нет зарегистрированной учетной записи. Возможно, Infura не предоставляет серверную часть для getAccountsметода.

Infura не предоставляет функции, связанные с учетной записью, такие как создание новых учетных записей. Так что для getAccounts() он ничего не вернет.