如何将Nami Wallet中signData()返回的CoseSign1数据转换为可读JSON
Nami Wallet CoseSign1 格式转可读JSON实现方案
1. 前置依赖安装
Node.js/React 环境下优先使用 Cardano 官方序列化库完成解析,执行以下命令安装:
- 浏览器/React 环境:
npm install @emurgo/cardano-serialization-lib-browser - Node.js 服务端环境:
npm install @emurgo/cardano-serialization-lib-nodejs
2. 转换代码示例
// 浏览器环境引入示例,Node环境替换为对应nodejs版本的库 import * as CardanoSerialization from '@emurgo/cardano-serialization-lib-browser'; // 你提供的原始CoseSign1 hex数据 const rawCoseSign1Hex = "845869a301270458206ac6ea9d3fda361869f40e202d39d3533014409139d382fdac02878047c9aefb67616464726573735839012988392f2533fa3feaa52ed949b45db47ab747a1d81f1571d80966a4280075c8c2c22341e1b24b55eb9aa3a193a7a40a663e72cbfffcdd65a166686173686564f4581a436f6e6e65637420746f204e4654204d61726b6574706c616365584080e294727384373e5f93870f60a10a5915b961cecb24fa7e4d19120a8cce8a3b1c5be15285b00558eaabb11364b077b5f563405db39c121087c9701855f5500d"; // hex转Uint8Array工具方法 const hexToUint8Array = (hex) => Uint8Array.from(hex.match(/.{1,2}/g).map(byte => parseInt(byte, 16))); const parseCoseSign1 = async (coseHex) => { // 初始化序列化库 await CardanoSerialization.load(); const coseBytes = hexToUint8Array(coseHex); const coseSign1 = CardanoSerialization.COSESign1.from_bytes(coseBytes); // 解析受保护头字段 const protectedHeaders = coseSign1.headers().protected().deserialized_headers(); // 解析未受保护头字段 const unprotectedHeaders = coseSign1.headers().unprotected().deserialized_headers(); // 解析payload为UTF-8字符串,可按需调整为保留hex格式 const payload = new TextDecoder().decode(coseSign1.payload()); // 提取签名转为hex格式 const signature = Buffer.from(coseSign1.signature()).toString('hex'); // 组装为结构化JSON return { algorithm: protectedHeaders.algorithm_id()?.to_str() || 'unknown', keyId: protectedHeaders.key_id() ? Buffer.from(protectedHeaders.key_id()).toString('hex') : undefined, signAddress: unprotectedHeaders.header(CardanoSerialization.Label.new_text('address')) ? Buffer.from(unprotectedHeaders.header(CardanoSerialization.Label.new_text('address')).as_bytes()).toString('hex') : undefined, isHashed: unprotectedHeaders.header(CardanoSerialization.Label.new_text('hashed'))?.as_bool() || false, payload: payload, signature: signature } } // 调用测试 parseCoseSign1(rawCoseSign1Hex).then(res => console.log('解析结果:', res));
3. 结果说明
针对你提供的示例数据,解析后payload字段为Connect to NFT Marketplace,其余字段会依次返回签名算法、签名所用链上地址、签名值等结构化数据,可直接用于业务逻辑。
如果需要验证签名有效性,可通过返回的签名地址提取公钥,调用coseSign1.verify_signature(公钥)方法完成校验。
内容的提问来源于stack exchange,提问作者KillianCode
相关产品推荐
相关产品推荐

