Лучший шаблон для определения учетной записи web3 по умолчанию при использовании метамаски
Контекст: я хочу использовать блоки для визуализации идентификатора на странице, я получаю учетную запись defaultAccount из web3, для этого пользователь должен войти в метамаску с выбранным адресом из своего кошелька.
Проблема: кажется, что веб-приложение не обнаруживает объект web3 по событию загрузки страницы, и это рекомендуемое место для его обнаружения.
Код: ниже вдохновлен рекомендациями по адресу:
https://github.com/MetaMask/metamask-plugin/issues/1158
У меня постоянное поведение, иногда есть web3, а иногда нет. Единственное решение, которое я могу придумать, - это иметь таймер, но это кажется мне слишком упрощенным, я бы предпочел что-то более элегантное.
Вопрос: есть ли лучшее решение для определения учетной записи default3 из web3 при загрузке страницы?
function startApp() {
GenerateIdenticon();
}
window.addEventListener('load', function () {
// Checking if Web3 has been injected by the browser (Mist/MetaMask)
if (typeof web3 !== 'undefined') {
// Use Mist/MetaMask's provider
window.web3 = new Web3(web3.currentProvider);
if (web3.currentProvider.isMetaMask === true) {
if (typeof web3.eth.defaultAccount === 'undefined') {
document.body.innerHTML = '<body><h1>Oops! Your browser does not support Ethereum Ðapps.</h1></body>';
}
else {
startApp();
}
}
else {
alert('No web3? Please use google chrome and metamask plugin to enter this Dapp!', null, null);
// fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
2 ответа
function _Connect(callback){
if(typeof web3 !== 'undefined') {
web3 = new Web3(window.web3.currentProvider);
web3.version.getNetwork((err, netId) => {
switch (netId) {
case "1":
callback('Switch Network', null);
break
case "2":
console.log('This is the deprecated Morden test network.');
callback('Switch Network', null);
break
case "3":
console.log('Connected to the ropsten test network.');
web3.eth.defaultAccount = web3.eth.accounts[0];
if(!web3.eth.defaultAccount){
console.log('Log into metamask');
_Connect(callback);
}else{
// Success
console.log(`Web3 ETH Account: ${web3.eth.defaultAccount}`);
callback(false, web3.eth.defaultAccount);
}
break
default:
console.log('This is an unknown network.');
callback('Switch Network', null);
}
});
} else {
console.log(`Failed: Web3 instance required, try using MetaMask.`);
callback('Install Metamask', null);
}
}
Когда Chrome вставляет библиотеку MetaMask Web3, возникает задержка, поэтому необходимо время ожидания (должно хватить 1 секунды).
По истечении времени ожидания вы проверяете, существует ли глобальный объект web3, а затем читаете учетную запись по умолчанию.
Если он не существует, вставьте свой собственный объект web3.