跳到正文
← 使用教程

PCD 导出后读不回来:分清 type、内层字符串与 POD 新旧包装

链小知 · 进阶 · 核验 · 依官方文档整理

按已保存的脱敏数据检查 SerializedPCD 分派、嵌套 EdDSA 与 jsonPOD/旧格式,区分结构解析、签名和业务身份。

开始前准备

  • 准备授权的脱敏开发样本/已有导出结构、错误记录、PCDPackage与锁定版本;没有样本时只能做schema对照。不要使用包含私钥、ticketSecret或备份秘密的数据,也不要上传个人凭证。
  • 范围为PCD接口0.15.0、EdDSATicket0.10.1、PODPCD0.5.1固定源码。只解释本地已存数据和方法,未运行第三方包、安装、验证、证明/签名或访问账户/API。

1. 确认外壳是 SerializedPCD 而非原实例

外壳结构是{type:string,pcd:string};原PCD实例则有id/type/claim/proof。先检查文件/日志中pcd是原字符串还是被错误解析成对象,保留未经改写副本和项目版本。

serialize返回外壳,package.deserialize接收外壳.pcd内层字符串;把整个JSON.stringify(wrapper)或对象传给deserialize会多一层。按type选择对应PCDPackage,不能因为payload都是JSON就用任意包。

检查结果:外壳type与内层字符串边界明确,原格式未被重复包裹。

2. 对 EdDSA 票确认嵌套 proof 外壳

eddsa-ticket-pcd的内层是{id,eddsaPCD,ticket},不是原PCD的claim/proof直接复制。eddsaPCD本身又是SerializedPCD;固定票包deserialize将其中.pcd字符串交给EdDSAPCDPackage,再重建claim.ticket。

对既有错误核缺id、ticket、eddsaPCD或nested pcd字段,以及双重JSON转义/错误type。JSONBig用于票包编码,不用普通parse/手动数值替换强行“修复”;保存原错误,解析成功仍没有调用票包verify。

检查结果:旧票两层包装配对,缺字段/错分派与证明失败分开。

3. 对通用 POD 核 id 与 jsonPOD 两层对象

pod-pcd当前内层是{id,jsonPOD};jsonPOD含entries/signature/signerPublicKey,而不是PODTicket的claim.ticket结构。先核外壳type、id字符串及jsonPOD对象,按对应包记录原字段,勿将通用POD改名成票证。

PODPCD的外部id默认不受内容签名保护;相同id不能证明entries相同,也不等POD contentID。需要业务认可身份/类型时应核已签entries及issuer,而不是外层卡片ID。

检查结果:通用POD包装与业务ID分开,没有跨类型强制读取。

4. 识别旧 JSONBig 回退与未来字段拒绝

固定PODPCD.deserialize先JSON.parse新格式、requireType再POD.fromJSON;失败才尝试旧{id,claim,proof}的JSONBigint格式。旧格式需claim.entries、claim.signerPublicKey、proof.signature;两条路径都失败时抛最初jsonError,不能据最后看到的消息断言只是旧数据问题。

POD.fromJSON要求恰三个键entries/signature/signerPublicKey,未知额外version也拒绝避免未来格式被有损读取。遇TypeError/RangeError核格式/值范围和包版本,不删未来字段或重写签名来让旧库接受;JSON可解析不保证POD格式有效。

检查结果:新旧/未来格式与原错误可定位,未有损删字段。

5. 区分 POD load、验签和票证 schema

POD.load/fromJSON校验格式并构建对象,不验证签名;PODPCDPackage.verify才调用pcd.pod.verifySignature。若已有日志只到deserialize完成,将proof状态写未核,不写true。

pod-ticket-pcd内层是{id,claim,proof},deserialize还对claim.ticket执行TicketDataSchema.parse;虽和通用POD旧格式都叫claim/proof,也不是同包。其verify路径/字段与通用POD不同,不能套generic jsonPOD或凭解析完成给资格。

检查结果:格式、签名和具体票证schema三层独立,未误用相似外壳。

6. 交付版本与失败层,不把 round-trip 当资格

记录源type、外壳/内层格式、具体包版本、原错误与是否已有deserialize/verify结果;如果已有serialize回写记录,比较受保护entries/证明与业务所需字段,不用普通JSON重排后的字节相等替代语义和签名核对。

当前POD文档将新票PODTicketPCD、通用PODPCD、GPCPCD分开,固定仓库并不证明当前App兼容所有导出。缺签名或issuer/资格条件仍待核;不为了修复导出执行prove/POD.sign、导入真实账号或产生新凭证。

检查结果:形成type—包版本—包装—解析—签名/业务边界表,未知兼容范围保留。

怎样确认完成

  • 得到可定位的type/包版本/内层格式与原失败记录,没有有损字段修复。
  • 只做文档核验和已存结构解释;未验证真实凭证或证明任何业务资格。

常见错误与边界

  • 传wrapper而非wrapper.pcd会多一层;反序列化不等验证。
  • genericPOD新jsonPOD、其旧claim/proof与PODTicket的claim/proof是不同语义,不能只看键名分派。
  • 外部id默认未签;兼容回退失败可抛原新格式错误,不能隐藏版本不兼容。

本教程根据官方资料整理,尚未完成逐步操作验收。界面、支持范围及费用变化时,先核对官方说明。 纯文本版 · 提交纠错依据