You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用flutter_web3插件请求用户签署消息

使用flutter_web3实现Metamask钱包连接与消息签署

一、已实现的钱包连接功能

你当前的代码已经完成了Metamask钱包的连接逻辑,核心流程包括:检查浏览器是否注入以太坊提供者、请求用户授权连接钱包、获取账户地址和链ID,同时处理了用户拒绝授权的情况。代码如下:

Future<String> WalletConnect(context) async {
  print("Checking Connect Wallet Status");

  if (ethereum != null) {
    try {
      // 弹出钱包连接确认弹窗,请求用户授权
      final accs = await ethereum!.requestAccount(); // 获取用户钱包账户列表

      if (accs.isNotEmpty) {
        address = accs.first;
        // 获取当前连接的链ID
        currentChain = await ethereum!.getChainId();

        print("Chain ID $currentChain");
      }
      return address;
    } on EthereumUserRejected {
      print('User rejected the modal');
      return "CONNECT WALLET";
    }
  } else {
    print("Error in Connect");
    showMyDialog(context);
    return "CONNECT WALLET";
  }
}

二、消息签署功能实现

要通过flutter_web3实现非交易类的消息签署,直接调用Metamask的personal_sign方法即可,前提是用户已经完成钱包连接(已获取到账户地址)。

消息签署代码示例

import 'package:flutter_web3/flutter_web3.dart';

Future<String?> signMessage(String message) async {
  // 先检查钱包是否已连接
  if (ethereum == null || address == null) {
    print('请先连接钱包');
    return null;
  }

  try {
    // 将普通字符串消息转换为Metamask要求的Hex格式
    final messageHex = web3.utils.utf8ToHex(message);
    // 调用personal_sign方法请求用户签署消息
    final signature = await ethereum!.request(
      method: 'personal_sign',
      params: [messageHex, address],
    );
    // 返回签名结果
    return signature as String;
  } on EthereumUserRejected {
    print('用户拒绝了签名请求');
    return null;
  } catch (e) {
    print('签名过程出错: $e');
    return null;
  }
}

代码说明

  • 首先验证钱包连接状态,避免未连接时发起签名请求
  • 使用web3.utils.utf8ToHex将普通字符串转换为以太坊生态通用的Hex编码格式
  • 通过ethereum!.request调用personal_sign方法,参数为编码后的消息和已连接的账户地址
  • 捕获EthereumUserRejected异常处理用户拒绝签名的情况,同时处理其他未知错误

可选:签名验证

如果需要验证签名的有效性(确认签名确实来自目标账户),可以使用以下代码:

bool verifySignature(String message, String signature, String address) {
  final messageHex = web3.utils.utf8ToHex(message);
  // 根据签名和消息恢复出签名者地址
  final recoveredAddress = web3.utils.ecRecover(messageHex, signature);
  // 对比恢复的地址与原地址(忽略大小写)
  return recoveredAddress.toLowerCase() == address.toLowerCase();
}

内容的提问来源于stack exchange,提问作者Rizvi Haider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:40:22