CantonNetwork开源仓库指南Skill canton-network-repos

本技能提供Canton Network开源生态系统的全面指南,涵盖DAML SDK、Canton运行时和Splice应用程序的版本管理、构建流程和故障排除。适用于区块链开发者、智能合约工程师和去中心化应用构建者,帮助解决版本兼容性、包ID不匹配和LF版本升级等问题。关键词:Canton Network, DAML智能合约, 区块链开发, 去中心化应用, LF版本, 包ID, 版本兼容性, 开源构建, Splice应用程序, 分布式账本。

智能合约 0 次安装 0 次浏览 更新于 2/28/2026

名称: 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.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代币) 和网络应用程序。

关键目录:

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是从以下内容派生的加密哈希:

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

外部参考