Canton Network 101

by Jatin, DevRel Manager, Canton Foundation

How Canton Actually Works

Canton is fundamentally different from other blockchains. It's a "network of networks" where data is distributed on a need-to-know basis, not globally replicated.

VALIDATORS

Independent Nodes with State

Validators (formerly called participants) are the nodes that store contract data and execute smart contract code. Unlike other blockchains where nodes are ephemeral/exchangeable, Canton validators have state.

Your validator only sees contracts where your parties are stakeholders
Each validator connects to multiple synchronizers
Your node = your private data
Parties are hosted on validators by mutual agreement
GLOBAL SYNCHRONIZER

Coordination & Ordering Layer

The Global Synchronizer (sync.global) is the decentralized backbone using BFT consensus. It orders, buffers, and forwards encrypted messages between validators without understanding transaction contents. Operated by Super Validators.

Validators connect to synchronizers to form networks
Time-orders cross-application transactions
Prevents conflicts while preserving privacy
Canton Coin used to pay for Global Synchronizer fees
SMART CONTRACTS

Daml Templates & Choices

Contract instances defined by templates (contract types). Transactions are executed by calling choices on contracts. Smart contracts specify permissions for parties...who validates, who controls, who sees.

Signatories: parties whose authority is required to create/archive
Observers: parties who see the contract (guaranteed visibility)
Controllers: parties who can execute specific choices
Contracts aren't tied to synchronizers, they can move freely
KEY DIFFERENCE FROM OTHER BLOCKCHAINS

In Ethereum/Solana, all state and transactions are replicated to all nodes. In Canton, state and transactions are distributed ONLY to validators specified in the smart contracts. This is privacy by design at the protocol level.

Network Topology Visualization

Global Synchronizer

Canton Foundation layer

canton.foundation

↕ encrypted messages

Validator A

Party: alice::abc123

Validator B

Party: bob::def456

Validator C

Party: charlie::ghi789

Each validator only sees contracts where their parties are stakeholders

Getting Your Validator Live

The complete flow from application to MainNet. Currently you need approval from existing Super Validators, Validators, or Canton Foundation.

CURRENT PHASE

New validators must be approved following a request from an existing Super Validator, Validator, application provider, or Foundation member. Apply via the Foundation form or contact a sponsor.

1. Apply for Whitelisting

Fill out validator request form → feeds into Google Sheet → manual compliance scrubbing (banned countries, invalid emails rejected) → tokenomics committee reviews weekly

MANUAL PROCESS 2 to 3 WEEKS

2. Provide Static Egress IP

After approval, provide your fixed egress IP address. This gets whitelisted across DevNet, TestNet, and MainNet. Super Validators adopt config changes via on chain vote.

STATIC IP REQUIRED WHITELISTING PROCESS

3. Set Up Infrastructure

Prepare container environment (VM or Kubernetes cluster). Set up OIDC authentication (Auth0, Keycloak, etc.). Download packages from your sponsor Super Validator.

  • Deploy in cloud or on premise data center
  • Minimal hardware requirements
  • Configure OIDC for auth
  • Kubernetes recommended for production

4. Join DevNet

Receive onboarding secret from sponsor. Use it to connect your validator to DevNet. Get your node running and test all functionality here first.

DEVNET TESTING ENVIRONMENT

5. Request TestNet Access

Once stable on DevNet, request TestNet access. Sponsor submits request to Featured Applications and Validators committee. Requires formal validator approval.

TESTNET FORMAL APPROVAL REQUIRED

6. Request MainNet Access

Final step: MainNet whitelisting. Same process as TestNet. Min. 7 day wait period for Super Validators to adopt config and conduct on chain vote. Once live, eligible for validator rewards (Canton Coin).

MAINNET PRODUCTION EARN REWARDS

Deployment Options

1 Self Hosted

  • Deploy YOURSELF
  • Full control over infrastructure
  • Maintain Network Nodes

2 Node-as-a-Service (NaaS)

  • PreIntegrated NaaS providers available
  • Providers handle infrastructure overhead
  • Costs vary (some charge up to 85% of rewards)
  • Standalone Super Validators can issue onboarding secrets

Daml: Contracts, Templates, & Choices

Understanding how Canton's smart contract layer works: from templates to transactions

Contract Lifecycle

1

Templates Define Contract Types

A template specifies the data structure (fields), stakeholders (signatories, observers), and choices (actions) for a contract type. Think of templates as "classes" for contracts.

template Asset
  with
    issuer : Party
    owner : Party
    symbol : Text
    quantity : Decimal
  where
    signatory issuer, owner
    observer []
    
    choice Transfer : ContractId Asset
      with
        newOwner : Party
      controller owner
      do
        create this with owner = newOwner
2

Creating Contracts

Contracts are instances of templates. Creating a contract requires authority from all signatories. The contract becomes "active" on the ledger and visible to all stakeholders.

-- Alice creates an asset (she's both issuer and owner)
assetCid <- submit alice do
  createCmd Asset with
    issuer = alice
    owner = alice
    symbol = "USD"
    quantity = 1000.0
  • Returns ContractId (opaque reference to the contract)
  • Contract is active from this point forward
  • All signatories must authorize creation
3

Exercising Choices (Transactions)

Choices are the ONLY way to transform contracts. Exercise a choice to update state. Choices can be consuming (archives the contract) or non consuming (keeps it active).

-- Alice transfers asset to Bob
newAssetCid <- submit alice do
  exerciseCmd assetCid Transfer with
    newOwner = bob
    
-- This archives the old contract and creates a new one
-- Bob is now the owner
  • Controller must have authority (in this case: owner)
  • Default: consuming choice archives the contract
  • Creates new contract with updated state
4

Transaction Atomicity

ALL actions in a transaction happen atomically...all succeed or all fail. No partial execution. This enables atomic cross app composability (e.g., DvP settlement).

  • Transaction = tree of actions (create, exercise, fetch)
  • Requester knows all consequences before submission
  • Network validates and commits atomically
  • No surprises and all effects are deterministic

Authorization Model

Role Purpose Guarantees
Signatory Parties whose authority is required to create or archive the contract See all actions where contract is created/archived. Every contract must have ≥1 signatory.
Observer Parties who can see the contract Guaranteed visibility of contract and all create/archive actions. Know about each other.
Controller Parties who can execute specific choices Must authorize choice execution. Not automatically observers.

Accessing the Ledger

JSON Ledger API

  • REST style HTTP API for ledger access
  • TypeScript SDKs available

gRPC Ledger API

  • High performance gRPC interface
  • Bi directional streaming
  • Transaction service
  • Python bindings available

Admin API

  • Validator node administration
  • Topology transaction management
  • Party creation and hosting
  • Synchronizer connection management
JSON Ledger API
gRPC Ledger API
Admin API
// Example: Query active contracts via JSON Ledger API V2
const response = await fetch('http://localhost:8080/v2/state/active-contracts', {
  method: 'POST',
  headers: { 
    'Authorization': `Bearer ${token}`,
    'ContentType': 'application/json'
  },
  body: JSON.stringify({
    "filter": {
      "filtersForAnyParty": {
        "cumulative": [{
          "identifierFilter": { "WildcardFilter": { "value": {} } }
        }]
      }
    },
    "activeAtOffset": 0
  })
});

// Exercise a choice via submit-and-wait
const result = await fetch('http://localhost:8080/v2/commands/submit-and-wait', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "actAs": ["Alice::1220..."],
    "userId": "app1",
    "commands": [{
      "ExerciseCommand": {
        "choice": "Transfer",
        "choiceArgument": { "newOwner": "Bob::1220..." },
        "contractId": "00abc...",
        "templateId": "#MyApp:Asset:Asset"
      }
    }]
  })
});
# Example: Connect to gRPC Ledger API V2 (Python)
import grpc
from com.daml.ledger.api.v2 import update_service_pb2_grpc
from com.daml.ledger.api.v2 import state_service_pb2_grpc

# Connect to validator gRPC endpoint
channel = grpc.insecure_channel('localhost:6865')

# Use Update Service to stream transactions
update_client = update_service_pb2_grpc.UpdateServiceStub(channel)

# Get active contracts using State Service
state_client = state_service_pb2_grpc.StateServiceStub(channel)

# High-performance streaming for real-time updates
# Supports Command, Update, and State services
# Example: Admin API: Party management (Python)
import grpc
from com.digitalasset.canton.admin.participant.v30 import party_service_pb2

# Connect to admin API (port from config, default often 14012)
admin_channel = grpc.insecure_channel('localhost:14012')

# Allocate a new party
party_request = party_service_pb2.AllocatePartyRequest(
    party_id_hint='alice',
    display_name='Alice'
)

# Note: Admin API is for validator operations & management
# Use Ledger API (JSON/gRPC) for application development

Canton Network API Ecosystem

Beyond the Ledger API, Canton Network provides specialized APIs for wallets, dApps, scanning, and validator operations.

1

Wallet SDK

For wallet providers and exchanges integrating Canton Coin

  • Full wallet functionality (send, receive, balance)
  • External signing support for secure key management
  • Transfer preapprovals for recurring payments
  • Party hosting and management
// Install Wallet SDK
npm install @canton-network/wallet-sdk

// Or for dApp development only (smaller bundle)
npm install @canton-network/dapp-sdk

> Integration Guide

2

Scan API

Public API for network data and Canton Coin information

  • Query active mining rounds and Canton Coin prices
  • Get ANS (Amulet Name Service) entries
  • View validator licenses and network participants
  • Access DSO party and synchronizer information
# Get Canton Coin price from open mining round
curl -X POST https://scan.sv-1.global.canton.network.sync.global/api/scan/v0/open-and-issuing-mining-rounds \
  -H "Content-Type: application/json" \
  -d "{}"

> Scan API Documentation

3

Validator API

REST API for validator node and wallet operations

  • User wallet management and operations
  • Buy traffic for synchronizer fees (paid in Canton Coin)
  • ANS (Amulet Name Service) operations
  • Scan proxy for BFT reads (Byzantine Fault Tolerant)
# Create transfer offer (Validator API)
POST /v0/wallet/transfer-offers
Authorization: Bearer <JWT>

# Buy traffic for validator
POST /v0/wallet/buy-traffic-requests

> Validator API Documentation

4

dApp API (Wallet Gateway)

Standard interface for dApp-to-wallet communication

  • Connect wallets to dApps securely
  • Request transaction signing from users
  • Token Standard (CIP0056) integration
  • External party onboarding and management
// dApp requests wallet connection
const wallet = await walletGateway.connect();

// Request transaction signature
const signed = await wallet.signTransaction(tx);

> Wallet Kernel GitHub

API Comparison

API Purpose Who Uses It Key Features
Ledger API
JSON/gRPC
Core contract operations Application developers Query contracts, submit transactions, stream updates
Scan API Public network data Block explorers, analytics apps Canton Coin data, ANS, validator info, mining rounds
Validator API Validator & wallet operations Validator operators, wallet apps User management, traffic purchase, ANS operations
Admin API Node management Validator operators Party creation, topology transactions, synchronizer connection
dApp API Wallet to dApp bridge dApp developers Wallet connection, transaction signing, Token Standard

From Zero to Canton ready

Learn → Development → DevNet → Testnet → MainNet Guide

1

Learn the Fundamentals

Understand about Canton: Validators with state, Parties as identity, Synchronizers for coordination, and Daml for smart contracts. Join the community.

2

Install the SDK

Install Digital Asset Package Manager (DPM) for Canton 3.4+ or Daml Assistant for older versions. Set up VS Code with Daml highlighting.

# Install DPM (recommended for Canton 3.4+)
curl -sSL https://get.daml.com | sh

# Create new project
dpm new my-canton-app --template daml-intro
                    
3

Set Up Local Development with Quickstart & Follow Connected Guide

The Canton Network Quickstart provides a complete local development environment. Clone the repo and run your app locally before deploying to DevNet. Requires Docker with 8GB+ RAM.

# Clone the quickstart repository
git clone https://github.com/digital-asset/cn-quickstart.git
cd cn-quickstart/quickstart

# Setup your environment (choose standard/test mode, OAuth options)
make setup

# Build the application
make build

# Start Canton services + your app (first time runs setup assistant)
make start

# In separate terminals:
make canton-console  # Canton admin console
make shell          # Daml shell for testing
  • Note: As of July 2025, Quickstart uses LocalNet (local network) instead of connecting to DevNet
  • Minimum 8GB Docker memory required, configure in Docker Desktop settings
  • Uses Java SDK Eclipse Temurin JDK 21 in containers
  • Access UIs: app provider.localhost:3000, wallet.localhost:2000, scan.localhost:4000
  • If issues: make clean all then delete Docker images/volumes
4

Understand Quickstart Architecture

Quickstart runs multiple Canton services in Docker containers. Key modules: splice onboarding (initialization), keycloak (OAuth2), pqs (query service), observability, and daml shell. Built on Splice LocalNet.

  • Modular architecture, enable/disable components via Docker profiles
  • Single containers serve multiple logical components to reduce resources
  • Postgres contains multiple databases for Quickstart services
  • For production: Use Kubernetes, replace automation with manual config steps
5

Build & Test Your Application

Write Daml templates for your use case. Use Vite hot reload for frontend dev (make vite dev). Debug backend with JVM remote debugging on port 5005. Use lnav for log analysis.

  • Frontend: make restart frontend or make start vite dev for hot reload
  • Backend: export DEBUG_ENABLED=true && make restart backend
  • Logs: Install lnav + Canton format for interactive log viewing
6

Get Your Validator on DevNet

Apply for DevNet Whitelisting.

  • Set up parties (internal for your app, external for customers)
  • Deploy your Daml code (upload DAR files)
  • Test contract creation, choice execution, queries
7

Build Your Application

Write Daml templates for your use case. Implement business logic in choices.

  • Design data model (templates with fields)
  • Define authorization (signatories, observers, controllers)
  • Implement state transitions (choices)
  • Write Daml scripts for testing
8

Request TestNet / MainNet Access

Once stable on DevNet, request TestNet access via sponsor. Formal approval required. Finally, request MainNet whitelisting for production deployment.

  • Sponsor submits request to Featured Applications committee
  • Wait for Super Validator on chain vote
  • Deploy to TestNet first for final validation
  • Then request MainNet access for production
  • Monitor validator health and earn Canton Coin rewards

Key Development Resources

Quickstart & Documentation

Community

Canton vs. Public Blockchains

Aspect Public Blockchains Canton Network
Data Distribution All state replicated to all nodes Selective distribution only to parties with stake
Privacy All transactions visible to all (or ZK proofs) Privacy by design at protocol level
Scaling Network-wide throughput limits Independent scaling busy apps don't throttle others
Composability Within same contract or via bridges Atomic cross-app transactions with privacy, Managed by Global Synchronizer
Account Model Address-based (account or UTXO) Party-based identity with hosted validators
Smart Contracts Solidity, Rust, Move, etc. Model DAML Model
Transaction Model State transitions on shared state Immutable contracts with choice-based transformations