如何在 React 应用程序中使用 Web3 和 MetaMask 签署消息

Posted

技术标签:

【中文标题】如何在 React 应用程序中使用 Web3 和 MetaMask 签署消息【英文标题】:How to sign messages with Web3 and MetaMask from a React app 【发布时间】:2019-07-05 12:52:52 【问题描述】:

我正在开发我的第一个 dapp,我正在尝试使用 Web3 和 MetaMask 来签署消息,但我不断收到此错误:

inpage.js:1 MetaMask - RPC Error: Error: WalletMiddleware - Invalid "from" address.

我已关闭 MetaMask 隐私模式。 getCoinBase() 方法正确返回了我在 MetaMask 中选择的地址。但是当我尝试用它来签署消息时它不起作用。

这是我的代码:点线将跳过不重要的部分。

let Web3 = require('web3')
.
.
.
constructor(props) 

    super(props);

    if (typeof web3 != 'undefined') 
      // eslint-disable-next-line no-undef  
      this.web3 = new Web3(web3.currentProvider);
    

    this.web3.eth.getCoinbase()
    .then(account => 
      this.web3.eth.sign('test message', account);
    );

【问题讨论】:

【参考方案1】:

Metamask 最近对向用户显示地址的方式进行了更改。我发现了一篇似乎与 here 相关的 *** 帖子。引用:

The Invalid address error can also happen if you haven't called window.ethereum.enable(); yet.

Metamask 团队的相关博文:https://medium.com/metamask/https-medium-com-metamask-breaking-change-injecting-web3-7722797916a8

【讨论】:

如果我错了,请纠正我,但根据 Metamask 团队的博客文章,我不应该调用 window.ethereum.enable();如果我关闭了隐私模式。另外,在这种情况下,window.ethereum 是什么?我没有定义类似的东西。 同样在文章中,在标题Preparing your dapp 下,它指出:As of MetaMask v4.14.0, the provider is already available at window.ethereum and it exposes the new enable methoddapps can and should be updated as soon as possible to call the new enable method to ensure compatibility with the upcoming changewindow.ethereum 应该是您的 web3 提供商。我会确保你有一个完全最新的 Metamask 版本?我同意隐私模式设置,但对此我无能为力。最好在以太坊 stackexchange 上询问。

以上是关于如何在 React 应用程序中使用 Web3 和 MetaMask 签署消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 中使用 web3?

如何在反应中使用 webpack 和 web3?

React / Web3:componendDidMount 和 Function 中的不同行为

react-native 上的 web3:错误:返回错误:gas 资金不足 * 价格 + 价值

使用 ReactSolidity 和 Web3.js 构建真实世界的 dApp#yyds干货盘点#

使用ether.js开发以太坊web3钱包