CantonNetwork开源仓库知识库 canton-network-repos

本技能提供关于Canton Network开源生态系统的全面知识,涵盖DAML智能合约语言、Canton分布式账本运行时以及Splice去中心化同步器应用的仓库结构、版本依赖关系和构建流程。适用于处理版本兼容性问题、调试LF版本或包ID不匹配、构建参与者节点或应用,以及理解企业版与社区版的差异。关键词:Canton Network, DAML, Splice, 智能合约, 区块链开发, 分布式账本, 版本兼容性, 开源构建。

链开发 0 次安装 0 次浏览 更新于 2/23/2026

名称: 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.dar
  • canton-builtin-admin-workflow-party-replication-alpha.dar
  • CantonExamples.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 是从以下内容派生的加密哈希:

  1. 包源码内容
  2. 使用的 LF 版本 (--target)
  3. SDK/标准库版本
  4. 依赖包 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 中可用。以下步骤已验证可用

  1. 编辑 project/CantonDependencies.scala

    val daml_language_versions = Seq("2.2")
    
  2. 更新 nix/daml-compiler-sources.json

    { "version": "3.4.9" }
    
  3. 更新所有 daml/*/daml.yaml 文件:

    sdk-version: 3.4.9
    build-options:
      - --target=2.2
    
  4. 移除无效的警告标志 (SDK 3.4.9 中不存在):

    # 从所有 daml.yaml 文件中移除 -Wno-ledger-time-is-alpha
    
  5. 构建包:

    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 兼容性

外部参考