如何使用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
相关产品推荐
相关产品推荐

