【问题标题】:Interacting with Metamask web3.js与 Metamask web3.js 交互
【发布时间】:2020-02-17 03:02:58
【问题描述】:

我在本地以太坊区块链上创建合约时遇到问题。我有一份在区块链上注册文档的基本合同。
所以,当我在 truffle 控制台中运行我的合约时,我可以完美地调用我的所有功能,但是,当我创建一个带有前端界面的网页时,我无法打开 metamask 来支付费用。
我的合约基本上有两个功能:addDoc 和 FindDoc。我做了一个使用 remix 网站创建交易的测试,它工作正常。在我的页面上,我仍然可以调用 findDoc 并获得正确信息的答案,但是当我尝试创建交易并支付费用时,元掩码不显示。


我的项目只有 4 个文件:

  • index.html
  • app.js
  • notaryWebApp.js
  • sha256

代码可以在这里找到:https://github.com/ffelipesimoes/solidity/tree/master/webapp

与区块链交互的主要是notaryWebApp.js文件:

var contract = undefined;
var customProvider = undefined;
var address = "0x6A4494ed32ce0Ab8004fbEAdac534916f88C8d3E";
var abi = undefined;

function notary_init() {
    // Check if Web3 has been injected by the browser (Mist/MetaMask)
    if (typeof web3 !== 'undefined') {
        // Use existing gateway
        window.web3 = new Web3(web3.currentProvider);
    } else {
        alert("No Ethereum interface injected into browser. Read-only access");
    }
    //contract abi
    abi = [...]
    contract = new web3.eth.Contract(abi, address);
};

//sends a hash to the blockchain
function notary_send(hash, callback) {
    web3.eth.getAccounts(function (error, accounts) {
        contract.methods.addDocHash(hash).send({
            from: accounts[0]
        }, function (error, tx) {
            if (error) callback(error, null);
            else callback(null, tx);
        });
    });
};

//looks up a hash on the blockchain
function notary_find(hash, callback) {
    contract.methods.findDocHash(hash).call(function (error, result) {
        if (error) callback(error, null);
        else {
            let resultObj = {
                mineTime: new Date(result[0] * 1000),
                blockNumber: result[1]
            }
            callback(null, resultObj);
        }
    });
};

从现在开始,谢谢大家!

【问题讨论】:

    标签: javascript blockchain ethereum solidity metamask


    【解决方案1】:

    您需要使用window.ethereumethereum.enable(),如here 所述,这是由于MetaMask 最近引入的privacy mode

    在您的情况下,在notary_init() 之前调用await window.ethereum.enable(),并使用window.ethereum 而不是currentProvider 来初始化web3 实例。

    【讨论】:

    • 嘿,伙计,非常感谢,你的小费对我帮助很大。我这样做了:我添加了以下行:
      ethereum.enable() .then(function (accounts) { // 你现在有一个帐户数组! // 目前只有一个: // ['0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825' ] }) .catch(function (error) { // 处理错误。可能是用户拒绝了登录 console.error(error) })
    • 您可能想在原始问题中添加您的工作代码,其他人如果将来有类似问题可以参考您的代码。如果有帮助,也请接受我的回答。
    • 嗨,我做了,你可以在上面看到。感谢您的建议。
    【解决方案2】:

    更喜欢使用直接连接接口和预先设计的脚本来解决这个问题。您可以在 pypi 中找到一个名为 Blockchain 的包,这可以解决您的问题并确保您位于正确的文件夹 ad=nd 地址

    【讨论】:

      【解决方案3】:

      非常感谢。以这种方式工作:

      function notary_init() {
      
          // Check if Web3 has been injected by the browser (Mist/MetaMask)
          if (typeof web3 !== 'undefined') {
              // Use existing gateway
              window.web3 = new Web3(web3.currentProvider);
          } else {
              alert("No Ethereum interface injected into browser. Read-only access");
          }
      
          ethereum.enable()
      .then(function (accounts) {
        // You now have an array of accounts!
        // Currently only ever one:
        // ['0xFDEa65C8e26263F6d9A1B5de9555D2931A33b825']
      })
      .catch(function (error) {
        // Handle error. Likely the user rejected the login
        console.error(error)
      })
      
      
          //contract abi
           abi =[...]
          contract = new web3.eth.Contract(abi, address);
      };
      

      【讨论】:

        猜你喜欢
        • 2022-10-04
        • 2020-03-29
        • 2020-05-29
        • 2022-09-30
        • 2022-11-10
        • 2018-05-04
        • 1970-01-01
        • 1970-01-01
        • 2021-08-23
        相关资源
        最近更新 更多