如何验证钱包中的消息主要在 ambire 钱包上与以太币连接?

div*_*yan 5 ethereum ethers.js wallet-connect

我正在尝试使用以太币通过钱包连接签署消息,但在使用 ambire 钱包验证消息时遇到问题,它没有返回任何响应。

const signMessage = async () => {
    try {
      console.log("started");
      // 1.] create a provider
      const walletConnectProvider = new WalletConnectProvider({
        infuraId: "3cd774e14cf34ff78167908f8377051c", // Required
        // qrcode: true
      });

      //  2.] enable provider
      await walletConnectProvider.enable();
      // console.log(walletConnectProvider.wc.accounts[0]);
      let rawMessage = "Hello World";
      let rawMessageLength = new Blob([rawMessage]).size;
      let message = ethers.utils.toUtf8Bytes(
        "\x19Ethereum Signed Message:\n" + rawMessageLength + rawMessage
      );
      message = ethers.utils.keccak256(message);
      var params = [
        walletConnectProvider.wc.accounts[0],
        message,
      ];

      //  3.] sign message
      const provider = new providers.Web3Provider(walletConnectProvider);
      const signer = provider.getSigner();

      let signature = await signer.signMessage(message);
      console.log("signature", signature);

      //  4.] verify message
      let verified = await ethers.utils.verifyMessage(message, signature);
      console.log("verified", verified);
    } catch (err) {}
  };
Run Code Online (Sandbox Code Playgroud)

Ivo*_*Ivo 14

您还需要一些东西:

  1. 您需要将原始消息(前缀之前)传递给signer.signMessage,即 rawMessage: await signer.signMessage(rawMessage)- 因为钱包(无论是否是 Ambire)都会添加前缀
  2. 为了支持 Ambire、Gnosis Safe、Argent 等智能钱包,您需要实施 EIP 1271

在 JS 中(警告:未测试),这看起来有点像这样:

const signerAddr = await signer.getAddress();
if (provider.getCode(signerAddr) === '0x') {
    // Regular RSV sig verification
    verified = signerAddr === (await ethers.utils.verifyMessage(message, signature));
} else {
    // Smart contract wallet (EIP 1271) verification: see https://eips.ethereum.org/EIPS/eip-1271 for more info
    const EIP1271ABI = ['function isValidSignature(bytes32 _hash, bytes memory _signature) public view returns (bytes4 magicValue)'];
    const EIP1271MagicValue = '0x1626ba7e';
    const signerEIP1271Contract = new ethers.Contract(signerAddr, EIP1271ABI, provider);
    const rawMessageLength = new Blob([rawMessage]).size;
    const message = ethers.utils.toUtf8Bytes(
        "\x19Ethereum Signed Message:\n" + rawMessageLength + rawMessage
    );
    const messageHash = ethers.utils.keccak256(message);
    verified = EIP1271MagicValue === (await signerEIP1271Contract.isValidSignature(messageHash, signature));
} 
Run Code Online (Sandbox Code Playgroud)

注意:我们 Ambire 团队目前正在制定一份关于如何验证所有类型签名(EIP1271、EIP712、712+1271、常规)的综合指南,希望能够通过 ethers.js 文档链接到该指南。

编辑:我们发布了一个库,使这一切变得更加容易,请查看: https: //github.com/AmbireTech/signature-validator/ - 我们建议您使用它