You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:39:03