名称: canton-network-repos 描述: Canton Network、DAML 和 Splice 仓库知识。适用于处理 Canton 参与者、DAML 智能合约、Splice 应用、LF 版本兼容性或包 ID 不匹配问题。在 Canton、DAML、Splice、decentralized-canton-sync 或 LF 版本查询时触发。
Canton Network 开源仓库
本技能提供关于 Canton Network 开源生态系统、仓库关系和构建流程的全面知识。
激活
在以下情况使用本技能:
- 处理 Canton Network、DAML 或 Splice 仓库
- 调查版本兼容性问题
- 理解企业版与社区版的差异
- 调试 LF 版本或包 ID 不匹配问题
- 构建 Canton 参与者或 Splice 应用
仓库层次结构
┌─────────────────────────────────────────────────────────────────┐
│ Splice 版本 (例如 0.5.4) │
│ github.com/digital-asset/decentralized-canton-sync │
│ 应用:验证器、SV、钱包、扫描、Amulet (CC) │
└─────────────────────────┬───────────────────────────────────────┘
│ 依赖
▼
┌─────────────────────────────────────────────────────────────────┐
│ Canton 版本 (例如 3.4.9) │
│ github.com/digital-asset/canton │
│ 运行时:参与者、排序器、中介器、管理 API │
└─────────────────────────┬───────────────────────────────────────┘
│ 依赖
▼
┌─────────────────────────────────────────────────────────────────┐
│ DAML SDK (例如 3.4.9) │
│ github.com/digital-asset/daml │
│ 编译器:damlc、LF 引擎、账本 API、标准库、protobuf │
└─────────────────────────────────────────────────────────────────┘
仓库详情
1. DAML SDK (github.com/digital-asset/daml)
目的:智能合约语言、编译器和运行时库。
关键目录:
daml/
├── sdk/
│ ├── compiler/damlc/ # Haskell 编译器源码
│ │ └── lib/DA/Cli/Options.hs # --target 版本验证
│ ├── daml-lf/
│ │ ├── language/ # LF 版本定义 (Scala)
│ │ ├── engine/ # LF 执行引擎
│ │ └── archive/ # DALF protobuf 格式
│ └── canton/ # Canton 运行时 (子模块)
├── ledger-api/ # gRPC API 定义
└── VERSION # SDK 版本字符串
LF 版本定义 (LanguageVersion.scala 于 v3.4.9):
// 定义的 V2 版本
val List(v2_1, v2_2, v2_dev) = AllV2 // 第 51 行 - v2_2 已定义
// 版本范围
case Major.V2 => VersionRange(v2_1, v2_2) // 第 171 行 - StableVersions 包含 v2_2
def AllVersions = VersionRange(v2_1, v2_dev)
// v2_2 的功能:
val flatArchive = v2_2
val kindInterning = flatArchive
val exprInterning = flatArchive
val explicitPkgImports = v2_2
val unsafeFromInterfaceRemoved = v2_2
注意:v2_2 存在于 SDK v3.4.9 源码中。较早的快照可能不包含它。
damlc 目标验证 (Options.hs):
lfVersionOpt :: Parser LF.Version
-- 根据 LF.supportedOutputVersions 验证
-- 错误:如果不在列表中,则提示 "Unknown Daml-LF version: X"
2. Canton (github.com/digital-asset/canton)
目的:实现 Canton 协议的分布式账本运行时。
关键目录:
canton/
├── community/ # 开源 Canton
│ ├── app/ # CantonCommunityApp 入口点
│ ├── participant/ # 参与者节点实现
│ ├── domain/ # 嵌入式域 (排序器/中介器)
│ └── common/src/main/daml/ # 内置 DAML 包
│ └── AdminWorkflows/ # Ping、参与方复制 DARs
├── daml/ # DAML SDK 子模块
├── daml_dependencies.json # LF 库版本
├── VERSION # Canton 版本
└── version.sbt # SBT 版本配置
内置 DARs (嵌入在 JAR 中):
canton-builtin-admin-workflow-ping.darcanton-builtin-admin-workflow-party-replication-alpha.darCantonExamples.dar
企业版 vs 社区版:
| 功能 | 企业版 | 社区版 |
|---|---|---|
| 主类 | CantonEnterpriseApp | CantonCommunityApp |
| 交易处理 | 并行 | 串行 |
| 数据清理 | 可用 | 有限 |
| 数据库 | PostgreSQL、Oracle | 仅 PostgreSQL |
| 高可用域 | 支持 | 仅嵌入式 |
3. Splice (github.com/digital-asset/decentralized-canton-sync)
目的:去中心化同步器治理、Amulet (Canton Coin) 和网络应用。
关键目录:
decentralized-canton-sync/
├── project/
│ ├── CantonDependencies.scala # 版本配置、LF 版本
│ └── DamlPlugin.scala # DAR 构建逻辑
├── daml/
│ ├── splice-amulet/ # Canton Coin 代币合约
│ ├── splice-wallet/ # 钱包合约
│ ├── splice-dso-governance/ # DSO 治理
│ └── */daml.yaml # 包含 --target 的包配置
├── apps/
│ ├── sv/ # 超级验证器应用
│ ├── validator/ # 验证器应用
│ ├── wallet/ # 钱包后端
│ └── scan/ # 支付扫描服务
├── cluster/images/ # Docker 镜像构建
│ └── canton-community/ # 社区参与者镜像
└── daml-compiler-sources.json # 编译器版本参考
关键配置 (CantonDependencies.scala):
object CantonDependencies {
val version: String = "3.4.9"
val daml_language_versions = Seq("2.1") // ← LF 目标版本
val daml_libraries_version = version
val daml_compiler_version = sys.env("DAML_COMPILER_VERSION")
}
包目标 (daml/splice-amulet/daml.yaml):
sdk-version: 3.3.0-snapshot.20250502.13767.0.v2fc6c7e2
build-options:
- --target=2.1 # 显式 LF 2.1 目标
版本映射
| Splice | Canton | DAML SDK | 协议 | LF (默认) | LF (使用 SDK 3.4.9) |
|---|---|---|---|---|---|
| 0.5.4 | 3.4.9 | 3.4.9 | PV34 | 2.1* | 2.2 (已验证) |
| 0.5.3 | 3.4.8 | 3.4.8 | PV34 | 2.1* | 2.2 |
| 0.4.x | 3.3.x | 3.3.x | PV33 | 2.1 | 2.1 |
*开源 Splice 0.5.4 附带的 SDK 快照 3.3.0-snapshot.20250502 早于 LF 2.2。
根本原因 (已验证):公开的 Splice 版本使用了 2025年5月2日 的 SDK 快照,但 LF 2.2 是在 2025年10月3日 添加到 SDK 中的。更新到 SDK 3.4.9 即可启用 LF 2.2 构建。
关键洞察:LF 2.2 在开源 SDK v3.4.9 中完全可用。Splice 项目只需更新以使用较新的 SDK。
LF 版本影响
包 ID 推导
包 ID 是从以下内容派生的加密哈希:
- 包源码内容
- 使用的 LF 版本 (
--target) - SDK/标准库版本
- 依赖包 ID
更改 LF 版本 = 不同的包 ID = 不兼容的包
升级验证
Canton 验证包升级:
- 升级的包必须使用相同或更新的 LF 版本
- LF 2.1 包不能“升级”到 LF 2.2 包 (ID 不同)
- 在同一账本上混合 LF 版本会导致验证失败
从开源构建
社区版 Canton 参与者
cd canton
sbt "community/app/assembly"
# 输出:community/app/target/scala-2.13/canton-community.jar
Splice 应用
cd decentralized-canton-sync
sbt compile # 需要 DAML_COMPILER_VERSION 环境变量
使用 LF 2.2 构建 (已验证可用)
LF 2.2 在 SDK v3.4.9 中可用。以下步骤已验证可用:
-
编辑
project/CantonDependencies.scala:val daml_language_versions = Seq("2.2") -
更新
nix/daml-compiler-sources.json:{ "version": "3.4.9" } -
更新所有
daml/*/daml.yaml文件:sdk-version: 3.4.9 build-options: - --target=2.2 -
移除无效的警告标志 (SDK 3.4.9 中不存在):
# 从所有 daml.yaml 文件中移除 -Wno-ledger-time-is-alpha -
构建包:
cd decentralized-canton-sync nix-shell -p daml-sdk --run "daml build -p daml/splice-util" nix-shell -p daml-sdk --run "daml build -p daml/splice-amulet"
已验证:splice-util 和 splice-amulet 使用 LF 2.2 和 SDK 3.4.9 成功构建。
完全开源的 LF 2.2 构建 (已验证)
Splice 和 Canton 都可以使用完全开源的代码构建 LF 2.2:
Canton 内置 DARs
更新 Canton 的 daml.yaml 文件:
cd canton/community
# 更新所有 daml.yaml 文件为 sdk-version: 3.4.9 和 --target=2.2
perl -pi -e 's/sdk-version: 3\.3\.0-snapshot\.[^
]*/sdk-version: 3.4.9/g' **/daml.yaml
perl -pi -e 's/--target=2\.1/--target=2.2/g' **/daml.yaml
重新构建 Canton:
sbt "canton-community-app/assembly"
验证结果 (2025-12-24)
社区构建的 DARs 与企业版具有相同的包 ID:
canton-builtin-admin-workflow-ping-3.4.9-fbeb863dab36da66d99...
这证实了与企业部署的完全兼容性。
关键文件参考
| 目的 | 仓库 | 文件 |
|---|---|---|
| LF 版本 (Scala) | daml | sdk/daml-lf/language/.../LanguageVersion.scala |
| damlc 验证 | daml | sdk/compiler/damlc/lib/DA/Cli/Options.hs |
| Canton 版本 | canton | VERSION |
| Canton DARs | canton | community/common/src/main/daml/ |
| Splice LF 配置 | splice | project/CantonDependencies.scala |
| 包目标 | splice | daml/*/daml.yaml |
| Docker 构建 | splice | cluster/images/*/Dockerfile |
故障排除
“Unknown Daml-LF version: 2.2”
- 原因:damlc 二进制文件在
supportedOutputVersions中不支持 2.2 - 检查:
daml damlc --help查看支持的目标 - 修复:使用包含 2.2 的 SDK 版本,或使用 2.1
包 ID 不匹配
- 原因:构建之间使用了不同的 LF 版本
- 检查:
unzip -p package.dar META-INF/MANIFEST.MF | grep Sdk-Version - 修复:确保所有构建使用一致的
--target
升级验证失败
- 原因:尝试用社区版 (LF 2.1) 替换企业版 (LF 2.2) 包
- 修复:使用 DAR 注入来保持 LF 2.2 兼容性