跳到主要内容

Canton 网络介绍

Rocky 在 Canton Network MainNet 上完成链上结算:客户账户之间的现货成交以 DvP 方式在双方钱包之间原子交割,每个订单事件与每笔成交(含自营)按 epoch 承诺到账本,永续合约成交批量锚定上链,充值、提现与偿付能力证明都能在账本上核验。本文介绍 Canton 的核心概念,以及 Rocky 当前在其中的角色。

一、什么是 Canton Network​

Canton Network 是一个面向受监管金融机构的隐私优先公链网络,由 Digital Asset 主导设计,使用 Daml 智能合约语言。

与以太坊等"全局共享账本"不同,Canton 的核心特点是:

维度以太坊 / SolanaCanton Network
数据可见性所有数据公开每个合约只对相关方可见(默认隐私)
状态同步全网共识同一份账本多个 Synchronizer(同步域)各自仲裁,互操作时跨域结算
智能合约模型EVM 账户模型Daml 合约模型(多方签名 + 显式 stakeholder)
监管友好性完全公开难合规内建隐私+可审计,金融机构友好

Canton 适合以下场景:

  • 受监管资产的代币化(股票、债券、基金、稳定币)
  • B2B 链上结算(清算所、托管行、做市商之间)
  • 需要可证明结算 + 数据隔离的应用(如 Rocky 这种交易所)

二、核心概念 (Core Concepts)​

2.1 Party(参与方)​

Canton 中最基本的身份单元。一个 Party 可以是个人用户、机构、应用、托管者等。Party 有一个唯一标识符:

alice::1220ca15423a1b049bf8e84132360f246057aa18f5e9e36a77db535b75bd287cceff
^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
party hint participant fingerprint suffix
  • Party hint:人类可读前缀,由创建该 party 的应用或钱包指定
  • Suffix:托管该 party 的 Participant 节点的密钥指纹,不同钱包 / validator 的指纹不同

Rocky 不为用户分配 party。 用户使用自己已经控制的 Canton 钱包 party 登录:先调用 POST /v1/wallet/challenge 拿到一条挑战消息,用钱包私钥签名后提交 POST /v1/wallet/verify,Rocky 校验签名并把该 party 绑定到交易账户。当前支持的钱包 provider 可通过 GET /v1/wallet/providers 查询(Rocky Wallet、Console、Loop、Send)。

2.2 Contract(合约)​

Daml 合约是一个带有 stakeholder 列表的数据结构。每个合约必须明确声明:

  • Signatory(签署方):必须对合约创建和归档共识的 party
  • Observer(观察方):可以读取但不能修改的 party
  • Controller(控制方):可以行使 choice / action 的 party

下面是 Rocky 实际部署的 DepositIntent 模板(daml/perp-custody),用户声明充值意向,交易所行使 Accept 入账:

template DepositIntent
with
exchange : Party -- observer: Rocky 交易所 party
user_handle : Party -- signatory: 用户 party
user_id_hex : Text
asset : Text
amount : Decimal
chain_tx_id : Text
created_at : Time
where
signatory user_handle
observer exchange
ensure amount > 0.0

choice Accept : ContractId PlatformAccount
with
platform_account_cid : ContractId PlatformAccount
controller exchange
do
exercise platform_account_cid Credit with
delta = amount
chain_tx_id = chain_tx_id

Rocky 当前部署的 Daml 模板:ExchangeAuthority、PlatformAccount、FeeCollectorAccount、PerpTradeCustody、DepositIntent、WithdrawalReceipt、RockyEpochCommitment。现货 DvP 结算和 CC 转账不使用私有模板,而是走 Canton Token Standard 的公共接口。

关键性质:合约只对其 stakeholder 可见。同一 Synchronizer 上的其他 party 不会看到这份合约。这就是 Canton 的"默认隐私"。

2.3 Synchronizer(同步域)​

类似以太坊的"区块链"概念,但多个 Synchronizer 可以共存。每个 Synchronizer:

  • 对其内部的合约状态变更进行排序与共识
  • 由一组 Sequencer + Mediator 节点运行(可能是单独运营商,也可能是去中心化的)
  • 通过 Canton Network Protocol 与其他 Synchronizer 互操作

Rocky 接入的是 Canton MainNet 上的 Global Synchronizer(global-domain::1220b1431ef2…,由 Splice DSO 运营)。

2.4 Participant Node(参与方节点)​

Party 不能直接"在链上"。Party 必须由某个 Participant 节点托管,Participant 是真正与 Synchronizer 通信的角色。

Rocky 后端 (canton-bridge) 用户钱包 (Console / Loop / Send …)
↓ JSON Ledger API v2 ↓
Rocky Validator ←→ Global Synchronizer ←→ 钱包所属 Validator
↓ ↓
Party: Rocky 交易所 Party: 用户

Rocky 运营自己的 Validator(api.validator.rocky.exchange),托管交易所 party 及配套的 operator / shadow party。用户 party 由其钱包所在的 validator 托管,不在 Rocky 的节点上;选择 Rocky Wallet 的用户使用的是 Rocky validator 自带的 Splice 钱包。

2.5 Validator​

Validator 是 Splice 项目提供的标准化 participant 部署模板:Participant + 钱包应用 + OAuth 接入。

Rocky 后端与 Validator 的交互方式:

  • 通过 JSON Ledger API v2 提交 Daml 命令、订阅更新流
  • 通过 Validator API 读取 Holding / 余额等钱包视图
  • 使用 Auth0 机器对机器(M2M)token 认证后端服务;Auth0 不参与用户登录,用户身份来自 §2.1 的钱包签名绑定

三、Canton 的隐私模型 (Privacy Model)​

Canton 的隐私保护体现在三个层级:

  1. 合约级:每个合约的载荷只对 signatory + observer 可见
  2. Participant 级:Participant 只接收它托管 party 相关的合约(不存储与它无关的数据)
  3. Synchronizer 级:Synchronizer 只看到加密的 commitment(用于排序),看不到合约内容

以 Rocky 实际写入链上的合约为例:

  • PerpTradeCustody(永续成交批次)— signatory: Rocky 交易所 — 只有 Rocky 可见
  • DepositIntent(充值意向)— signatory: 用户,observer: Rocky 交易所 — 只有用户和 Rocky 可见
  • WithdrawalReceipt(提现凭证)— signatory: Rocky 交易所,observer: 用户 — 只有 Rocky 和用户可见
  • 现货 DvP 成交 — 两笔 Token Standard 转账在同一笔 Canton 事务中原子完成 — 只有成交双方的 party 可见(用户钱包之间,或用户钱包与 Rocky 托管 party 之间)

其他用户、其他 validator、Synchronizer 节点都无法看到这些数据。但 Synchronizer 仍然为这些合约的状态变更提供排序保证 + 防止重复花费。


四、Rocky 在 Canton 中的角色​

4.1 Party 角色划分​

Party配置项职责
Rocky 交易所EXCHANGE_PARTY_ID平台 party,PerpTradeCustody、WithdrawalReceipt、PlatformAccount 的 signatory;私钥由 KMS 托管
Rocky operatorEXCHANGE_OPERATOR_PARTY_IDToken Standard 转账 / 授权流程中的 operator party
Shadow userSHADOW_USER_PARTY_IDRocky 控制的占位 party,用于不需要用户自有 party 的链上记录
DSODSO_PARTY_IDGlobal Synchronizer 的去中心化运营方(Splice DSO),第三方
用户由钱包持有用户自己的 party,通过 /v1/wallet/verify 绑定,Rocky 不持有其私钥

4.2 链上数据 vs 链下数据​

并非所有交易动作都上链。Rocky 的设计是链下撮合 + 链上结算关键事件:

数据存储位置说明
订单簿、撮合状态rocky-backend (Postgres)高频,链上不可行
用户交易账户余额rocky-backend ledger.accounts高频更新
客户账户之间的现货成交Canton 链上,Token Standard DvPspot-chain-settler 逐笔结算,每笔成交返回 cantonUpdateId,见 链上结算
事件日志:每笔下单、撤单与成交(含自营)Canton 链上,RockyEpochCommitment每 60 秒一个 epoch 一份合约:日志的 Merkle 根加当期成交记录;包含证明见 GET /v1/chain/proof,见 Epoch 承诺
永续成交批次Canton 链上,PerpTradeCustodysettlement-batcher 每 5 秒或每 10 笔打包,经 canton-bridge 提交
充值 / 提现Canton 链上,Token Standard 转账 + DepositIntent / WithdrawalReceipt见 CC 充值流程
偿付能力证明每日账本快照 + Merkle Sum Tree 承诺见 偿付能力证明
用户身份(Party)用户钱包所在的 Participant跨应用复用

4.3 用户视角的链上交互​

用户在 Rocky 上会接触到的 Canton 环节:

  1. 登录:用钱包签名挑战消息,绑定 party(/v1/wallet/challenge → /v1/wallet/verify)
  2. 充值:从自己的钱包向 Rocky 交易所 party 发起 Token Standard 转账,后端观察到后入账
  3. 现货交易:涉及你账户的成交在链上完成 DvP(GET /api/v3/myTrades 返回的 cantonUpdateId 可在账本上核验),并且每笔订单与成交还会在下一个 epoch 里被承诺上链(GET /v1/chain/proof)
  4. 提现:Rocky 从交易所 party 向用户 party 转账,并写入 WithdrawalReceipt
  5. 审计:通过偿付能力证明核验自己的负债被计入,以及储备覆盖率

五、环境与部署 (Environments)​

环境Canton 接入用途
生产Canton MainNet Global Synchronizer,经 Rocky 自有 validator(api.validator.rocky.exchange)api.rocky.exchange 线上服务
本地开发Canton sandbox(单 participant,不连外网,CANTON_AUTH_MODE=none)后端仓库 make canton-up

Rocky 没有 DevNet 部署。用户 party 的 suffix 各不相同,取决于其钱包所在的 validator。


六、了解更多 (Further Reading)​