Metamask / Web3连接问题

时间:2018-12-26 19:04:11

标签: solidity web3 metamask

我想了解智能合约的前端工作原理。 我正在尝试在计算机上运行此代码,但是metamask一直是未定义的。 您能否详细解释为什么会发生这种情况。 为什么它不连接到Metamask提供程序?

        <script>
            $(".sendButton").click(function(){
                let Web3 = require('web3');
                if (typeof web3 !== 'undefined'){
                    web3 = new Web3(web3.currentProvider);
                }
                else {
                    alert('You have to install MetaMask !');
                }
                const abi = some abi
                const contractAddress = "some contract";
                let MyContract = web3.eth.contract(abi);
                let myContractInstance = MyContract.at(contractAddress);
                let functionData = myContractInstance.setMessage.getData($('#inputString').val());
                web3.eth.sendTransaction({
                        to:contractAddress,
                        from:web3.eth.accounts[0],
                        data: functionData,
                    },
                    function(error, response){
                        console.log(response);
                    });
            });
        </script>
    </body>
</html>

1 个答案:

答案 0 :(得分:1)

如果您在本地提供HTML文件,则MetaMask将无法与您的DApp通信。需要Web服务器。来自MetaMask Developer Docs

  

由于浏览器的安全性限制,我们无法与在file://上运行的dapp通信。请使用本地服务器进行开发。

此外,请注意MetaMask breaking change,它将不再自动将web3注入浏览器。相反,用户必须通过接受window.ethereum.enable()创建的提示对话框来授予DApp访问其帐户的权限。请参阅以下代码,以在现代DApp浏览器和旧版DApp浏览器中处理MetaMask。

// Modern DApp Browsers
if (window.ethereum) {
   web3 = new Web3(window.ethereum);
   try { 
      window.ethereum.enable().then(function() {
          // User has allowed account access to DApp...
      });
   } catch(e) {
      // User has denied account access to DApp...
   }
}
// Legacy DApp Browsers
else if (window.web3) {
    web3 = new Web3(web3.currentProvider);
}
// Non-DApp Browsers
else {
    alert('You have to install MetaMask !');
}