跳到主要内容

签署

Aptos 消息签名常用于登录认证、地址所有权证明或链下授权。请在消息中加入 nonce、应用信息和必要上下文,避免签名被重放。


签署消息

下面这段参考代码请求用户签署一段登录消息:

const message = "欢迎来到 MyApp!\n\n点击签名登录。\n\nNonce: demo-nonce-001";

const requestResult = await provider.signMessage({
message,
nonce: "demo-nonce-001", // 可选 nonce,用于防重放
});

console.log({
signature: requestResult.signature, // 十六进制形式的签名
fullMessage: requestResult.fullMessage, // 完整签名消息
kaspa: requestResult.kaspa, // 本次签名使用的消息前缀
});

消息选项

const requestResult = await provider.signMessage({
message: "Aptos sample message",
nonce: "demo-nonce-value",
address: true, // 是否把地址带入消息
application: true, // 是否附带应用信息
chainId: true, // 是否附带链 ID
});

链下验签

import nacl from "tweetnacl";

const { signature, fullMessage } = await provider.signMessage({
message: "Aptos sample message",
nonce: "demo-nonce-value",
});

const account = await provider.account();
const pubKeyBytes = Buffer.from(account.publicKey.slice(2), "hex");
const signatureBytes = Buffer.from(signature.slice(2), "hex");
const messageBytes = Buffer.from(fullMessage);

const isValid = nacl.sign.detached.verify(
messageBytes,
signatureBytes,
pubKeyBytes,
);
console.log("签名校验结果:", isValid);

AIP 登录流程

如果项目采用 Aptos 标准化登录流程,可以使用 signIn

const signInInput = {
// 这里填登录流程需要的参数
};

const callResult = await provider.signIn(signInInput);

console.log({
address: callResult.address,
publicKey: callResult.publicKey,
signature: callResult.signature,
});

处理异常

try {
await provider.signMessage({ message: "Hello", nonce: "123" });
} catch (error) {
switch (error.code) {
case 4001:
console.log("用户已拒绝本次请求");
break;
case 4100:
console.log("尚未授权,且钱包处于锁定状态");
break;
case 4200:
console.log("当前方法不受支持");
break;
default:
console.error("执行报错:", error.message);
}
}