personal_sign
请求指定账户对消息进行个人签名。钱包会按 EIP-191 为消息添加 "\x19Ethereum Signed Message:\n" 前缀,降低签名被伪装成交易的风险。
入参
| 索引 | 类别 | 说明 |
|---|---|---|
| 0 | string | 待签名消息,需为十六进制编码 |
| 1 | string | 发起签名的账户地址 |
结果
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 | 用户取消了本次请求 | 用户取消了签名确认 |
| -32602 | Invalid params | 消息或地址无效 |
说明
- 消息参数必须是带
0x前缀的十六进制字符串。 - 实际参与签名的内容为:
"\x19Ethereum Signed Message:\n" + len(message) + message。 - 登录签名建议加入 nonce、域名和过期时间,防止重放。
- 结构化授权或订单签名请优先使用 eth_signTypedData_v4。
- 遵循 EIP-191 规范。