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默认未签;兼容回退失败可抛原新格式错误,不能隐藏版本不兼容。