Ethereum 使用wallet connect在以太坊上签名并验证消息不起作用

Ethereum 使用wallet connect在以太坊上签名并验证消息不起作用,ethereum,web3,Ethereum,Web3,我正在尝试为我的DAPP使用wallet connect对邮件进行签名和验证。到目前为止,我已经尝试使用ethers和web3包装WalletConnect,并且在我的移动设备上使用metamask和trust wallet应用程序。到目前为止,这些方法都不起作用 <template> <div id="app"> <div>Steps: <br>Connect wallet (i used metama

我正在尝试为我的DAPP使用wallet connect对邮件进行签名和验证。到目前为止,我已经尝试使用ethers和web3包装WalletConnect,并且在我的移动设备上使用metamask和trust wallet应用程序。到目前为止,这些方法都不起作用

<template>
  <div id="app">
    <div>Steps:
      <br>Connect wallet (i used metamask mobile and trust wallet)
      <br>Once connected Sign the message
      <br>
      <br>Issues:
      <br>On metamask mobile wallet you receive a message to sign but nothing is sent back once signed
      <br>On Trust wallet the the signature is returned to the DAPP but it does not verifiy to the current account? Verification fails
      <br>
      <br>
    </div>
    <button @click="connectWallet">Connect wallet</button>

    <template v-if="coinbase">
      <div>Account: {{ coinbase }}</div>

      <button @click="sign">Sign</button>

      <div>Signature: {{ signature }}</div>

      <div>verified message: {{ verified }}</div>

      <div>verified2 message: {{ verified }}</div>

      <div>verificationMatch: {{ verificationMatch }}</div>
    </template>
  </div>
</template>

<script>
import { ethers } from "ethers";
import Web3 from "web3";
import WalletConnectProvider from "@walletconnect/web3-provider";

export default {
  name: "App",
  data: () => ({
    coinbase: "",
    web3: {},
    signer: {},
    verified: "",
    verified2: "",
    signature: ""
  }),

  computed: {
    verificationMatch() {
      // these should match
      return this.coinbase === this.verified;
    }
  },

  methods: {
    async connectWallet() {
      const walletConnectProvider = new WalletConnectProvider({
        infuraId: "3cd774e14cf34ff78167908f8377051c" // Required
        // qrcode: true
      });
      await walletConnectProvider.enable();
      this.web3 = new Web3(walletConnectProvider);
      this.coinbase = walletConnectProvider.wc.accounts[0];
      console.log(this.web3.eth.accounts[0]);
      // this.coinbase = await this.web3.eth.getAccounts()[0];
    },
    async sign() {
      var message = "Hello World";
      this.signature = await this.web3.eth.sign(message, this.coinbase);
      this.verified = ethers.utils.verifyMessage(message, this.signature);
      this.verified2 = this.web3.eth.accounts.recover(message, this.signature);
    }
  }
};
</script>

<style>
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

步骤:

Connect wallet(我使用metamask mobile和trust wallet)
一旦连接,请在邮件上签名

问题:
在metamask mobile wallet上,您会收到一条要签名的消息,但签名后不会返回任何内容
在信托钱包上,签名返回给DAPP,但不验证当前帐户?验证失败

连接钱包 帐户:{{coinbase} 签名 签名:{{签名} 已验证消息:{{verified}} 已验证的2消息:{{verified} 验证匹配:{{verificationMatch} 从“ethers”导入{ethers}; 从“Web3”导入Web3; 从“@walletconnect/web3 provider”导入WalletConnectProvider; 导出默认值{ 名称:“应用程序”, 数据:()=>({ 硬币库:“, web3:{}, 签署人:{}, 核实:“, 已验证2:“, 签名:“” }), 计算:{ 验证匹配(){ //这些应该匹配 返回this.coinbase==this.verified; } }, 方法:{ 异步连接钱包(){ const walletConnectProvider=新的walletConnectProvider({ infuraId:“3cd774e14cf34ff78167908f8377051c”//Required //qrcode:正确 }); 等待walletConnectProvider.enable(); this.web3=新的web3(walletConnectProvider); this.coinbase=walletConnectProvider.wc.accounts[0]; console.log(this.web3.eth.accounts[0]); //this.coinbase=等待this.web3.eth.getAccounts()[0]; }, 异步符号(){ var message=“你好,世界”; this.signature=等待this.web3.eth.sign(消息,this.coinbase); this.verified=ethers.utils.verifyMessage(消息,this.signature); this.verified2=this.web3.eth.accounts.recover(消息,this.signature); } } }; #应用程序{ 字体系列:“Avenir”,Helvetica,Arial,无衬线; -webkit字体平滑:抗锯齿; -moz osx字体平滑:灰度; 文本对齐:居中; 颜色:#2c3e50; 边缘顶部:60像素; }
您可以在这里找到一些代码沙盒

此链接适用于ethersjs

此链接适用于web3


任何帮助都将不胜感激

对于
WalletConnectProvider
,我也有同样的问题,但它适用于低级连接器调用:

var rawMessage = "Hello World";
var rawMessageLength = new Blob([rawMessage]).size
var message = ethers.utils.toUtf8Bytes("\x19Ethereum Signed Message:\n" + rawMessageLength + rawMessage)
message = ethers.utils.keccak256(message)
var params = [
    await this.signer.getAddress(),
    message
]
this.signature = await this.wc.connector.signMessage(params);
this.verified = ethers.utils.verifyMessage(rawMessage, this.signature);

this.wc
是对
walletConnectProvider

的引用,我对
walletConnectProvider
有同样的问题,但它适用于低级连接器调用:

var rawMessage = "Hello World";
var rawMessageLength = new Blob([rawMessage]).size
var message = ethers.utils.toUtf8Bytes("\x19Ethereum Signed Message:\n" + rawMessageLength + rawMessage)
message = ethers.utils.keccak256(message)
var params = [
    await this.signer.getAddress(),
    message
]
this.signature = await this.wc.connector.signMessage(params);
this.verified = ethers.utils.verifyMessage(rawMessage, this.signature);

this.wc
是指
walletConnectProvider

而不是像@Vyacheslav所描述的那样调用低级连接器调用,另一个选项是直接调用个人签名

// configure web3, e.g. with web3Modal or in your case WalletConnect
const web3 = await web3Modal.connect();

const provider = new providers.Web3Provider(web3);
const signer = provider.getSigner()
const address = await signer.getAddress();

let signedMessage;
if (web3.wc) {
    signedMessage = await provider.send(
        'personal_sign',
        [ ethers.utils.hexlify(ethers.utils.toUtf8Bytes(rawMessage)), address.toLowerCase() ]
    );
}
else { 
    signedMessage = await signer.signMessage(rawMessage)
}

const verified = ethers.utils.verifyMessage(rawMessage, signedMessage);

不像@Vyacheslav所描述的那样调用低级连接器调用,另一个选项是直接调用personal_sign

// configure web3, e.g. with web3Modal or in your case WalletConnect
const web3 = await web3Modal.connect();

const provider = new providers.Web3Provider(web3);
const signer = provider.getSigner()
const address = await signer.getAddress();

let signedMessage;
if (web3.wc) {
    signedMessage = await provider.send(
        'personal_sign',
        [ ethers.utils.hexlify(ethers.utils.toUtf8Bytes(rawMessage)), address.toLowerCase() ]
    );
}
else { 
    signedMessage = await signer.signMessage(rawMessage)
}

const verified = ethers.utils.verifyMessage(rawMessage, signedMessage);

对于其他人,这里有一个最终的解决方案非常感谢Vyacheslav。你是一个真正的传奇人物。请加入我们的代币电报。我想给你一些代币,以供你消磨时间。我的名字马克,请在电报中告诉我。再次感谢你brother@EDeveloper看来我错过了这条评论的通知。我很高兴这个解决方案对你有效。你重新命名了你的电报频道了吗?对其他人来说,这里有一个最终的解决方案,非常感谢Vyacheslav。你是一个真正的传奇人物。请加入我们的代币电报。我想给你一些代币,以供你消磨时间。我的名字马克,请在电报中告诉我。再次感谢你brother@EDeveloper看来我错过了这条评论的通知。我很高兴这个解决方案对你有效。你重新命名电报频道了吗?