签署
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);
}
}