odal-node/dpp-core
GitHub: odal-node/dpp-core
一组纯 Rust 无状态核心库,为欧盟数字产品护照(DPP)提供领域模型、加密签名、法规校验和行业互操作等标准化合规逻辑。
Stars: 1 | Forks: 0
# Odal Node Core
**欧盟数字产品护照标准库**
[](LICENSE)
[](https://github.com/odal-node/dpp-core/actions/workflows/ci.yml)
[](https://www.rust-lang.org/)
[]()
用于符合欧盟 ESPR 数字产品护照规范的纯、无状态 Rust 库。提供领域类型、加密签名(Ed25519 + JWS)、W3C 可验证凭证、GS1 Digital Link 解析、schema 验证以及 AAS 子模型映射。没有数据库,没有 HTTP 框架,没有基础设施依赖。
任何构建 DPP 工具的人都可以将此库作为基础。它是标准,而不是产品。
## 为什么开发此项目
欧盟法律正在逐个行业开启机器可读的数字产品护照要求:电池护照将于 **2027 年 2 月 18 日** 强制实施(法规 2023/1542),未售出商品规则**现已**生效(ESPR 第 24/25 条),洗涤剂将于 2029 年紧随其后,ESPR 工作计划还将纺织品、钢铁等排在后面。前六项欧洲 DPP 系统标准(EN 18216/18219/18220/18221/18222/18223)已于 2026 年 5 月发布;其余两项(EN 18239 访问/安全,EN 18246 身份验证)处于 FprEN 阶段,预计在 2026 年 9 月左右发布。目前对于数百万需要合规的中小企业来说,还没有经济实惠且对开发者友好的基础设施。
**Odal 就是这样的基础设施**:主权化、符合标准、可自托管。没有供应商锁定,没有黑盒算法,没有企业级许可。
## 编译测试
```
cargo build --workspace
```
在零基础设施运行的情况下即可成功。没有数据库,没有 Redis,没有环境变量。如果它需要基础设施,那它就不属于这里。
## Crate 架构
```
dpp-core/
crates/
dpp-domain .......... Domain types, port traits, VersionedSchemaRegistry, JSON Schema validation
schemas/ .......... Versioned JSON Schemas for 11 sectors (battery, textile, electronics, …), embedded via include_str!
dpp-crypto .......... Ed25519 keys, AES-256-GCM, JWS sign/verify, did:web DID builder, VCs, access policy engine
dpp-digital-link .... GS1 Digital Link parser, link-type negotiation, AAS submodel mapping
dpp-plugin-traits ... Wasm sector plugin ABI (no_std compatible, capability negotiation)
dpp-plugin-sdk ...... Guest-side plugin SDK: export_plugin! macro + Validator
dpp-rules ........... Pure no_std cross-field regulatory rules, shared by dpp-domain and plugins
dpp-registry ........ EU Central Registry interface types (wasm32-safe)
dpp-calc ............ EU-methodology calculators (CO2e, repairability), pure functions
dpp-tests ........... Cross-crate integration tests (domain + crypto + gs1)
plugins/ .............. 10 Wasm sector plugins (wasm32-wasip1, excluded from workspace)
```
## 法规覆盖范围
| 法规 | 状态 | dpp-core 实现 |
|---|---|---|
| **ESPR** (EU 2024/1781) | 现已生效;未售出商品规则(第 24/25 条)自 2026 年 7 月起适用 | 核心数据模型(第 9-13 条,附件 III),第 11(b) 条规定的访问权限,未售出商品行业,责任转移设计(非独立的 ESPR 条款 — 见下文) |
| **电池法规** (EU 2023/1542) | 现已生效 — 护照于 **2027 年 2 月 18 日**起强制执行 | `BatteryData` 结构体,附件 XIII 字段,行业 schema |
| **纺织品 DPP 授权法案** | 待定(ESPR 工作计划优先事项) | 包含 SVHC 披露、每纤维可追溯性、耐用性指标的 `TextileData` — 在法案最终确定前为临时性内容 |
| **CEN/CLC JTC 24 系统标准** | 六项已于 2026 年 5 月发布(EN 18216/18219/18220/18221/18222/18223);EN 18239 + 18246 处于 FprEN 阶段,预计约 2026 年 9 月发布;OJEU 协调引用待定 | 逐条跟踪合规性;标识符、载体、API 和身份验证语义保持一致 |
| **GS1 Digital Link v1.2** | 已发布 | AI 01/21/10 解析,link-type 协商 |
| **IDTA AAS 元模型** | 已发布 | DPP 到 AAS SubmodelElement 的映射 |
| **W3C VC 数据模型 v2.0** | 已发布 | 具有基于角色的访问层级的 `DppAccessCredential` |
## 核心特性
### 三级访问控制 (ESPR 第 9(2)(f) 条, 第 11(b) 条)
三级划分(Public/Professional/Confidential)是本项目自身的设计 — ESPR
要求在每个产品组的授权法案中规定每个参与者的访问权限(第
9(2) 条,第 点)并保证基于这些权限的免费、便捷访问(第 11 条,第 点);
它本身并未强制要求必须刚好分为三个层级。
访问层级系统基于 W3C 可验证凭证对 DPP 数据进行限制:
- **Public** — 纤维成分、制造国、护理说明、环境指标。无需凭证。
- **Professional** — SVHC 物质、拆解说明、备件可用性。需要证明角色(维修商、回收商、再制造商)的 VC。
- **Confidential** — 合规报告、审计历史、供应链可追溯性。需要机构 DID(市场监督机构、海关)。
### 责任转移
当产品经历再制造、改变用途或准备重复使用时,DPP 责任将转移给新的经济经营者。ESPR 本身并没有以此为名的独立“责任转移”条款 — 此设计源于一般性的数据准确性义务(第 9(1) 条:DPP 数据“应准确、完整且最新”)和注册表上传义务(第 13(4) 条)。`TransferChain` 提供:
- 具有状态机验证的只追加溯源日志
- 具有类型化角色的 DID 识别经济经营者
- 双签名转移记录(来自双方的 JWS)
- 拒绝无效转移(错误的操作者、重复的待处理状态)
### 证据档案
一个独立、已签名的**证据档案** — 护照、两份 JWS 证明、签发者的 DID 文档、哈希链审计追踪以及转移链集中在一个规范文档中 — 及其验证引擎(独立检查:清单签名、内容完整性、两份 JWS、审计链关联、转移签名)是 `dpp-engine` 的特性:档案由节点生成和持久化,并通过其 API 或 `odal verify` CLI 命令进行检查。Core 贡献了其所依赖的原语 — `dpp-crypto` 的 Ed25519/JWS 以及档案快照所记录的领域类型。
### Schema 验证
`crates/dpp-domain/schemas/{sector}/v{version}.json` 中的版本化 JSON schema(嵌入在 crate 中,因此在发布时会随之一起分发):
| 行业 | 版本 | 关键字段 |
|---|---|---|
| textile | v1.0.0, v1.1.0 | 纤维成分、SVHC、耐用性、微塑料 |
| battery | v1.0.0, v2.0.0 | 化学成分、容量、回收成分、健康状态 |
| electronics | v1.0.0 | 可维修性、备件、关注物质 |
| steel | v1.0.0 | CO2 强度、废钢含量、生产方法 |
| unsold-goods | v1.0.0 | 第 25 条销毁禁令合规性 |
| aluminium, construction, detergent, furniture, toy, tyre | 每个均为 v1.0.0 | 特定行业的授权法案字段 |
`VersionedSchemaRegistry` 在编译时嵌入 schema,并支持针对新版本进行运行时热重载。读取时的**向上转换透镜**(`schemas::lens`)会在读取时将旧记录的行业数据转换为新版本的 schema,因此已签名的护照保持字节一致,同时随着授权法案对 schema 的演进仍可使用(仅限向上转换)。
### GS1 与工业 4.0 互操作性
- **Digital Link** — 完整的 AI 01/21/10 解析与构建(GS1 URI 语法 v1.2)
- **Link-type 协商** — 内容协商返回 JSON、JSON-LD、HTML 或 AAS 表示形式
- **AAS 子模型映射** — 自动将 DPP JSON 转换为 IDTA AAS SubmodelElement 结构,适用于 Catena-X / 工业 4.0
### Wasm 行业插件
合规逻辑以沙盒化的 Wasm 模块(`wasm32-wasip1`)形式分发。十个行业
插件位于 `plugins/` 下 — 电池(参考实现)、纺织品、
电子产品、钢铁、铝、建筑、洗涤剂、家具、玩具和轮胎。
亮点:
| 插件 | 行业 | 关键规则 |
|---|---|---|
| `sector-battery.wasm` | battery | 电池法规 2023/1542(参考实现) |
| `sector-textile.wasm` | textile, unsoldGoods | ESPR 第 25 条销毁禁令(2026 年 7 月 19 日) |
| `sector-steel.wasm` | steel | CBAM CO2e/吨阈值 |
插件 ABI 支持能力协商和带有兼容性检查的语义化版本控制。
## Port Traits
7 个 port traits 定义了核心/平台的边界。任何下游项目都可以针对自身的基础设施实现它们:
| Trait | Kind | Purpose |
|---|---|---|
| `PassportRepository` | async | DPP 记录的 CRUD |
| `ComplianceRegistry` + `ComplianceStrategy` | sync | 特定行业的合规性分发 |
| `IdentityPort` | async | 签署和验证护照 JWS |
| `PluginHost` | sync | Wasm 插件分发 |
| `ArchivePort` | async | 具有保留保证的不可变 DPP 归档 |
| `RegistrySyncPort` | async | 欧盟中央注册表注册和状态同步 |
| `SealPort` | async | eIDAS 合格电子印章(ESPR 第 13 条 / eIDAS 910/2014) |
## 快速开始
```
git clone https://github.com/odal-node/dpp-core.git
cd dpp-core
cargo build --workspace # zero infrastructure needed
cargo nextest run --workspace # full unit + integration suite
just check # fmt + clippy + test + audit
```
无需 Docker,无需数据库,无需环境变量。
### 可运行示例
```
cargo run -p dpp-domain --example create_passport # Create & validate a textile DPP
cargo run -p dpp-crypto --example credential_and_transfer # Issue a VC, transfer responsibility
cargo run -p dpp-digital-link --example gs1_and_aas # Parse GS1 links, map to AAS submodel
```
## 文档
**从引导索引开始:[docs/README.md](docs/README.md)** — 按问题分组,并为新手提供三篇文档的阅读路径。
| 文档 | 描述 |
|---|---|
| [BLUEPRINT.md](docs/project/BLUEPRINT.md) | 项目愿景、指导原则、非目标 |
| [ARCHITECTURE.md](docs/architecture/ARCHITECTURE.md) | 核心库架构和模块设计 |
| [DATA-MODEL.md](docs/architecture/DATA-MODEL.md) | DPP 规范 schema(与 ESPR / 电池法规保持一致) |
| [IDENTITY.md](docs/architecture/IDENTITY.md) | `did:web` 和可验证凭证深入解析 |
| [PLUGIN-HOST.md](docs/architecture/PLUGIN-HOST.md) | Wasm 插件沙盒设计和 ABI 契约 |
| [DESIGN-PATTERNS.md](docs/architecture/DESIGN-PATTERNS.md) | 六边形架构、开放核心边界模式 |
| [CONFORMITY.md](docs/regulatory/CONFORMITY.md) | 面向评估机构的法规对齐声明 |
| [CONTRIBUTING.md](CONTRIBUTING.md) | 贡献者指南:环境配置、规范、PR 工作流 |
| [SECURITY.md](SECURITY.md) | 漏洞披露政策 |
| [GOVERNANCE.md](GOVERNANCE.md) | 决策结构和维护者权限 |
| [CHANGELOG.md](CHANGELOG.md) | 发布历史,每个版本一个条目 |
## 许可证
[Apache License 2.0](LICENSE)
## 安全
请**不要**为安全漏洞公开提交 issue。请私下报告至 **security@odal-node.io** — 完整的披露政策请参见 [SECURITY.md](SECURITY.md)。
*由 [Odal Node](https://odal-node.io) 构建*
标签:Rust, W3C可验证凭证, 可视化界面, 合规与认证, 密码学与签名, 无状态库, 欧盟数字产品护照, 网络流量审计, 通知系统, 领域驱动设计