签署
Cardano 数据签名常用于登录认证、地址所有权证明和链下授权。UKey Wallet 通过 CIP-8 返回 COSE 格式签名和公钥。
签名数据(CIP-8)
下面这段参考代码把消息转为十六进制 payload 后请求用户签名:
const api = await window.cardano.ukey.enable();
const addresses = await api.getUsedAddresses();
const address = addresses[0];
// 下面是待签消息
const payload = Buffer.from("Cardano demo message").toString("hex");
const signature = await api.signData(address, payload);
console.log({
signature: signature.signature, // COSE_Sign1 格式签名
key: signature.key, // COSE_Key 公钥数据
});
验签
import { COSESign1, COSEKey } from "@emurgo/cardano-message-signing-browser";
const coseSign1 = COSESign1.from_bytes(Buffer.from(signature.signature, "hex"));
const coseKey = COSEKey.from_bytes(Buffer.from(signature.key, "hex"));
// 读取签名后的 payload
const signedPayload = coseSign1.payload();
// 校验签名
const publicKey = coseKey.header(0); // 读取 Ed25519 密钥
// 校验逻辑...
处理异常
try {
const api = await window.cardano.ukey.enable();
} catch (error) {
if (error.code === -1) {
console.log("用户拒绝了本次连接");
} else if (error.code === -2) {
console.log("没有返回可用账户");
} else {
console.error("执行报错:", error.message);
}
}
常见异常
| 错误码 | 说明 |
|---|---|
| -1 | 用户取消了操作 |
| -2 | 未匹配到账户 |
| -3 | 网络参数不正确 |