使用元掩码时检测web3默认帐户的更好模式

时间:2017-06-08 12:44:12

标签: javascript ethereum web3js web3 metamask

上下文:我想使用blockies在页面上呈现identicon,我从web3获取defaultAccount,为此,用户必须使用钱包中的选定地址登录metamask。

问题:网页应用似乎没有在网页的加载事件中检测到web3对象,wchih是推荐检测它的地方。

以下代码的灵感源于以下建议:

https://github.com/MetaMask/metamask-plugin/issues/1158

https://github.com/MetaMask/faq/blob/master/DEVELOPERS.md#partly_sunny-web3---ethereum-browser-environment-check

我一直有间歇性行为,有时候web3就在那里,有时它不存在,我能想到的唯一解决方案就是有一个计时器,但在我看来有点过于简单化,我我更喜欢更优雅的东西。

问题:当页面加载时,是否有更好的解决方案可以从web3检测defaultAccount?

 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 个答案:

答案 0 :(得分:4)

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);
        }   
}

答案 1 :(得分:0)

当Chrome插入MetaMask Web3库时会出现延迟,因此需要超时(1秒超时应该足够)。

超时后,检查web3全局对象是否存在,然后读取默认帐户。

如果它不存在,则插入您自己的web3对象。