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

整理：链小知（AI 辅助）
资料核对日期：2026-10-12
引用地址：https://lianxiaozhi.com/tools/guides/zupass-serializedpcd-pod-envelope-compatibility
难度：进阶
核验方式：官方文档整理，未执行真实账户操作

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

## 使用工具
- [Zupass / PCD SDK](https://lianxiaozhi.com/tools/zupass) · [官方入口](https://zupass.org/)

## 前置条件
- 准备授权的脱敏开发样本/已有导出结构、错误记录、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与内层字符串边界明确，原格式未被重复包裹。
依据：[PCD 接口：type、verify 和 SerializedPCD](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/lib/pcd-types/src/pcd.ts)
依据：[固定 PCD 接口包版本与许可证](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/lib/pcd-types/package.json)

## 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。

核对结果：旧票两层包装配对，缺字段/错分派与证明失败分开。
依据：[EdDSA Ticket：verify、显示与两层序列化](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/eddsa-ticket-pcd/src/EdDSATicketPCDPackage.ts)
依据：[EdDSA Ticket：活动、issuer 与已签字段](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/eddsa-ticket-pcd/src/EdDSATicketPCD.ts)
依据：[PCD 接口：type、verify 和 SerializedPCD](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/lib/pcd-types/src/pcd.ts)
依据：[固定 EdDSA Ticket 包版本](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/eddsa-ticket-pcd/package.json)

## 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分开，没有跨类型强制读取。
依据：[PODPCD：jsonPOD 与旧 JSONBig 兼容](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-pcd/src/PODPCDPackage.ts)
依据：[PODPCD：外部 id 与签名内容](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-pcd/src/PODPCD.ts)
依据：[固定 PODPCD 包版本](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-pcd/package.json)
依据：[POD 当前文档：新票证与通用 POD](https://pod.org/pod/introduction)

## 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格式有效。

核对结果：新旧/未来格式与原错误可定位，未有损删字段。
依据：[PODPCD：jsonPOD 与旧 JSONBig 兼容](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-pcd/src/PODPCDPackage.ts)
依据：[POD：load/fromJSON 并不验签](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/lib/pod/src/pod.ts)

## 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三层独立，未误用相似外壳。
依据：[POD：load/fromJSON 并不验签](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/lib/pod/src/pod.ts)
依据：[PODPCD：jsonPOD 与旧 JSONBig 兼容](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-pcd/src/PODPCDPackage.ts)
依据：[PODTicketPCD：parse、verify 与显示分开](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-ticket-pcd/src/PODTicketPCDPackage.ts)
依据：[PODTicketPCD：不同票证包装](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-ticket-pcd/src/PODTicketPCD.ts)

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

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

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

核对结果：形成type—包版本—包装—解析—签名/业务边界表，未知兼容范围保留。
依据：[PCD 接口：type、verify 和 SerializedPCD](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/lib/pcd-types/src/pcd.ts)
依据：[POD 当前文档：新票证与通用 POD](https://pod.org/pod/introduction)
依据：[POD：load/fromJSON 并不验签](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/lib/pod/src/pod.ts)
依据：[固定 EdDSA Ticket 包版本](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/eddsa-ticket-pcd/package.json)
依据：[固定 PODPCD 包版本](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-pcd/package.json)

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

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

## 相关知识
- [原始、解码和整理后的链上数据有什么区别？](https://lianxiaozhi.com/learn/raw-decoded-curated-data)
- [把数据上链，与只保存数据哈希有什么区别？](https://lianxiaozhi.com/learn/data-onchain-vs-offchain)

## 官方依据
- [PCD 接口：type、verify 和 SerializedPCD](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/lib/pcd-types/src/pcd.ts)
- [固定 PCD 接口包版本与许可证](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/lib/pcd-types/package.json)
- [EdDSA Ticket：verify、显示与两层序列化](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/eddsa-ticket-pcd/src/EdDSATicketPCDPackage.ts)
- [EdDSA Ticket：活动、issuer 与已签字段](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/eddsa-ticket-pcd/src/EdDSATicketPCD.ts)
- [固定 EdDSA Ticket 包版本](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/eddsa-ticket-pcd/package.json)
- [PODPCD：jsonPOD 与旧 JSONBig 兼容](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-pcd/src/PODPCDPackage.ts)
- [PODPCD：外部 id 与签名内容](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-pcd/src/PODPCD.ts)
- [固定 PODPCD 包版本](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-pcd/package.json)
- [POD 当前文档：新票证与通用 POD](https://pod.org/pod/introduction)
- [POD：load/fromJSON 并不验签](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/lib/pod/src/pod.ts)
- [PODTicketPCD：parse、verify 与显示分开](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-ticket-pcd/src/PODTicketPCDPackage.ts)
- [PODTicketPCD：不同票证包装](https://raw.githubusercontent.com/proofcarryingdata/zupass/d553fd1dd9ec9c4a641fa01326a14ef90e4d20f1/packages/pcd/pod-ticket-pcd/src/PODTicketPCD.ts)
