名称: canton-network-repos 描述: Canton Network开源生态系统指南,涵盖DAML SDK、Canton运行时和Splice应用程序。适用于使用Canton Network、DAML智能合约或构建去中心化应用程序的场景。
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版本定义 (v3.4.9的LanguageVersion.scala):
// 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、参与方复制DAR文件
├── daml/ # DAML SDK子模块
├── daml_dependencies.json # LF库版本
├── VERSION # Canton版本
└── version.sbt # SBT版本配置
内置DAR文件 (嵌入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代币) 和网络应用程序。
关键目录:
decentralized-canton-sync/
├── project/
│ ├── CantonDependencies.scala # 版本配置、LF版本
│ └── DamlPlugin.scala # DAR构建逻辑
├── daml/
│ ├── splice-amulet/ # Canton代币合约
│ ├── 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内置DAR文件
更新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)
社区构建的DAR文件具有与企业版相同的包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 DAR文件 | 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兼容性