跳到主要内容

personal_sign

请求指定账户对消息进行个人签名。钱包会按 EIP-191 为消息添加 "\x19Ethereum Signed Message:\n" 前缀,降低签名被伪装成交易的风险。


入参

索引类别说明
0string待签名消息,需为十六进制编码
1string发起签名的账户地址

结果

string - 65 字节签名,十六进制字符串格式。


示范

const message = "Hello, UKey Wallet!";
const hexMessage = "0x" + Buffer.from(message, "utf8").toString("hex");

const signature = await window.$ukey.ethereum.request({
method: "personal_sign",
requestParams: [hexMessage, accounts[0]],
});

console.log("生成的签名:", signature);

使用 ethers.js

import { hashMessage, recoverAddress } from "ethers";

const message = "Hello, UKey Wallet!";
const hexMessage = "0x" + Buffer.from(message, "utf8").toString("hex");

const signature = await window.$ukey.ethereum.request({
method: "personal_sign",
requestParams: [hexMessage, accounts[0]],
});

// 校验签名
const recoveredAddress = recoverAddress(hashMessage(message), signature);
console.log("验证结果:", recoveredAddress === accounts[0]);

错误码

错误码消息说明
4001用户取消了本次请求用户取消了签名确认
-32602Invalid params消息或地址无效

说明

  • 消息参数必须是带 0x 前缀的十六进制字符串。
  • 实际参与签名的内容为:"\x19Ethereum Signed Message:\n" + len(message) + message
  • 登录签名建议加入 nonce、域名和过期时间,防止重放。
  • 结构化授权或订单签名请优先使用 eth_signTypedData_v4
  • 遵循 EIP-191 规范。