Подписать и подтвердить сообщение в ethereum с помощью wallet connect не работает

#ethereum #web3

#javascript #ethereum #web3js #ethers.js

Вопрос:

Я пытаюсь подписывать и проверять сообщения с помощью wallet connect для моего DAPP. До сих пор я пытался использовать 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>
  

Вы можете найти некоторые кодовые песочницы здесь

Эта ссылка предназначена для ethersjs https://codesandbox.io/s/peaceful-cdn-jtkvb?file=/src/App.vue

Эта ссылка, если для web3https://codesandbox.io/s/objective-franklin-gkr3s?file=/src/App.vue

Ответ №1:

Вместо вызова соединителя нижнего уровня, как описано @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);
  

Комментарии:

1. Я пытался provider.request , но, похоже, это не сработало специально для WalletConnect .

Ответ №2:

У меня такая же проблема для 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

Комментарии:

1. Для других вот окончательное решение codesandbox.io/s/clever-shtern-ttfqm?file=/src/App.vue Большое вам спасибо, Вячеслав. вы настоящая легенда. Пожалуйста, присоединяйтесь к нашим токенам telegram id, мы хотели бы дать вам несколько токенов за ваше время t.me/unc_token . Мои имена Отметьте, пожалуйста, свяжитесь со мной в телеграмме. И еще раз спасибо, брат

2. @EDeveloper похоже, я пропустил уведомление для этого комментария. Я рад, что это решение сработало для вас. Вы переименовали свой канал Telegram?