如何使用MultiversX JavaScript/TypeScript SDK签名任意字节消息并验证签名?
使用MultiversX JavaScript/TypeScript SDK签名任意字节消息并验证签名
前置准备
先安装所需的SDK依赖:
npm install @multiversx/sdk-core @multiversx/sdk-wallet
一、对任意字节消息进行签名
步骤说明
- 初始化钱包(支持助记词、PEM文件两种方式)
- 准备要签名的字节序列(可以是UTF8字符串转字节,也可以是自定义二进制字节)
- 创建可签名消息对象并完成签名
代码示例
import { Wallet, SignableMessage } from "@multiversx/sdk-wallet"; import { fromUtf8 } from "@multiversx/sdk-core"; // 1. 从助记词初始化钱包(也可以用PEM文件加载) const mnemonic = "your-mnemonic-phrase-here"; const wallet = Wallet.fromMnemonic(mnemonic); // 方式A: 字符串转字节作为消息 const rawTextMessage = "自定义的任意消息内容"; const messageBytes = fromUtf8(rawTextMessage); // 方式B: 直接使用自定义二进制字节 // const messageBytes = new Uint8Array([0x01, 0x02, 0x03, 0x04]); // 2. 创建可签名消息并执行签名 const signableMsg = new SignableMessage({ message: messageBytes }); await wallet.sign(signableMsg); // 获取签名结果和发送方地址 const signatureHex = signableMsg.getSignature().hex(); const senderBech32Addr = wallet.getAddress().bech32(); console.log("生成的签名:", signatureHex); console.log("签名者地址:", senderBech32Addr);
注意:
SignableMessage会自动按照MultiversX规范添加签名前缀(\x19Elrond Signed Message:\n+ 消息长度),避免签名被恶意重用到交易等其他场景。
二、验证签名的有效性
步骤说明
- 准备验证所需的三个核心参数:签名者的Bech32地址、原始消息的字节序列、签名的十六进制字符串
- 使用SDK内置的验证方法完成校验
代码示例
import { Address, verifyMessageSignature } from "@multiversx/sdk-core"; import { fromUtf8 } from "@multiversx/sdk-core"; // 1. 准备验证参数 const senderBech32Addr = "erd1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const originalMessageBytes = fromUtf8("自定义的任意消息内容"); // 和签名时的原始消息一致 const signatureHex = "生成的十六进制签名字符串"; // 2. 执行签名验证 const address = new Address(senderBech32Addr); const isValid = verifyMessageSignature({ address: address, message: originalMessageBytes, signature: signatureHex }); console.log("签名是否有效:", isValid); // 返回true/false
额外说明
- 如果签名时用的是自定义二进制字节,验证时要传入完全相同的
Uint8Array,不能修改字节顺序或内容 - 验证方法会自动处理签名前缀,无需手动添加
- 若从PEM加载钱包,可替换初始化代码为:
const wallet = await Wallet.fromPemFile("./wallet.pem");
内容的提问来源于stack exchange,提问作者turdus-merula
相关产品推荐
相关产品推荐

