基于MultiversX Network开发dApp:如何通过非交易类消息签名实现用户认证及工具使用问询
在MultiversX dApp中实现消息签名与身份认证
嘿,好问题!我来帮你梳理清楚MultiversX(原Elrond)生态下的消息签名方案,刚好能解决你提到的无交易身份认证需求:
核心结论
当然可以!MultiversX的扩展钱包(MultiversX Web Wallet Extension)和移动端MultiversX Wallet都支持消息签名功能,完全能实现类似MetaMask在以太坊中的身份验证逻辑——无需发送任何链上交易,仅通过用户签名自定义消息来验证身份真实性。
具体实现步骤
要在你的dApp中集成消息签名,推荐使用官方的@multiversx/sdk-dapp工具包,下面是完整的实现流程:
1. 安装依赖
首先在你的项目中安装MultiversX的dApp SDK:
npm install @multiversx/sdk-dapp
2. 初始化钱包连接
先初始化SDK并连接用户的MultiversX钱包(以扩展钱包为例):
import { DappProvider, WalletProvider } from '@multiversx/sdk-dapp'; // 初始化SDK,指定网络(主网/测试网) await DappProvider.init({ network: 'testnet', // 切换为 'mainnet' 用于生产环境 // 如果需要支持移动端WalletConnect连接,需填写你的WalletConnect Project ID walletConnectV2ProjectId: 'your-wc-project-id' }); // 连接扩展钱包 const walletProvider = WalletProvider.getInstance(); await walletProvider.connect(); // 获取已连接的账户信息 const connectedAccount = walletProvider.getSelectedAccount(); console.log('已连接地址:', connectedAccount.address);
3. 构造待签名消息并触发签名
为了防止签名被恶意复用(比如被篡改为交易数据),MultiversX官方推荐给消息加上固定前缀MultiversX Signed Message:\n,然后调用钱包的签名API:
// 自定义身份验证消息 const authMessage = "请验证你的身份以登录XX dApp"; // 加上官方推荐的前缀 const messageToSign = `MultiversX Signed Message:\n${authMessage}`; // 触发钱包签名弹窗,用户确认后返回签名结果 const signature = await walletProvider.signMessage({ message: messageToSign, address: connectedAccount.address }); console.log('用户签名结果:', signature);
4. 验证签名有效性
拿到签名后,你可以在前端或后端验证签名是否来自目标地址,以此完成身份认证:
import { verifyMessage } from '@multiversx/sdk-core'; // 验证签名 const isSignatureValid = verifyMessage( messageToSign, signature, connectedAccount.publicKey ); if (isSignatureValid) { console.log('身份验证通过!'); // 这里可以执行登录逻辑 } else { console.log('签名无效,身份验证失败'); }
额外说明
- 移动端钱包支持:如果用户使用移动端MultiversX Wallet,你可以通过WalletConnect协议完成连接和签名,流程和扩展钱包一致,只需在初始化时配置WalletConnect Project ID。
- Elrond Wallet的更名:你提到的Elrond Wallet就是现在的MultiversX Wallet,品牌更名后功能完全兼容,之前的签名逻辑依然适用。
- 安全注意事项:务必不要省略官方推荐的消息前缀,这能有效避免签名被恶意用于链上交易操作。
内容的提问来源于stack exchange,提问作者Razvan M.
相关产品推荐
相关产品推荐

