Writing
Blockchain Infrastructure

Building on Canton: The Private Blockchain That Actually Runs Production Finance

Shikhar Singh
by Shikhar Singh14 min read
Share on X (Twitter)Share

Building on Canton: The Private Blockchain That Actually Runs Production Finance

Every developer I know who's heard of Canton has the same reaction: "Isn't that the JP Morgan blockchain thing?"

Kind of. Canton Network is the production blockchain layer for Digital Asset's Daml smart contract platform, used in production by Deutsche Börse, SIX Digital Exchange, Broadridge, and yes, some of the largest banks in the world. It processes real financial settlements. It's been running without a major incident for years.

Most developers in the Ethereum/Solana ecosystem have never seriously looked at it because "enterprise blockchain" sounds like the thing that banks do when they want to say they're doing blockchain without actually giving up control of their data. That's a fair instinct in a lot of cases. Canton is different, and the reason it's different is worth understanding even if you never write a line of Daml.

I built OpenFluid — a regulated financial workflow product — on Canton Network. Here's what I learned.


The Problem Public Chains Can't Solve

Let me describe a real scenario that breaks every public blockchain I've worked with.

Fund manager A has a position in bond X. Counterparty B wants to buy half of that position. To execute this trade:

  1. A needs to prove to B that they own the bond (verifiable)
  2. B needs to prove to A they have the funds (verifiable)
  3. Settlement needs to be atomic (both legs complete or neither does)
  4. The regulatory authority needs to be able to audit the trade
  5. Neither A nor B wants the other's position size, strategy, or trading history to be visible to anyone else in the market

Step 5 is what kills Ethereum. Everything on Ethereum is public. The mempool is public. Settled transactions are permanently visible to every node. If you're trading in meaningful size, you don't want Arbitrum validators or MEV bots knowing your position before settlement.

You could use ZK rollups for transaction privacy. But then you have step 4: the regulator needs to audit. ZK systems that give auditors selective transparency are research-stage. For actual regulated financial products right now, you can't use them.

Canton solves this with sub-transaction privacy. On Canton, each party in a transaction only sees the parts of the ledger that they're a party to. The validator network processes the transaction without seeing the full details. The relevant regulatory authority can be granted explicit read access. Everyone else sees nothing.

This is not possible on Ethereum without application-level cryptography that adds latency and complexity. It's a property of Canton's consensus protocol at the network layer.


What Daml Actually Is

Daml (pronounced "dah-muhl") is the smart contract language for Canton. It's a functional language built specifically for modeling rights and obligations in financial systems.

I want to be honest with you: the first week with Daml is disorienting if you come from Solidity. The mental models are genuinely different.

In Solidity, you think in terms of:

  • State variables stored in a contract
  • Functions that read/modify that state
  • Events that signal state changes
  • Mappings as the primary data structure

In Daml, you think in terms of:

  • Contracts (instances of templates, stored as active facts on the ledger)
  • Signatories (parties whose authority is required to create a contract)
  • Observers (parties who can see the contract but not act on it)
  • Choices (actions that parties can exercise, which archive the current contract and optionally create new ones)

The key shift: Daml contracts aren't addresses with state. They're facts with controlled visibility.

Here's a simple bond contract in Daml:

template Bond
  with
    issuer: Party
    owner: Party  
    isin: Text
    faceValue: Decimal
    maturityDate: Date
  where
    signatory issuer
    observer owner

    choice Transfer: ContractId Bond
      with newOwner: Party
      controller owner
      do
        create this with owner = newOwner

    choice Settle: ()
      controller issuer
      do
        assert (faceValue > 0.0)
        -- settlement logic
        return ()

A few things to notice:

  • The signatory is the issuer: creating this bond requires the issuer's authority
  • The observer is the owner: they can see this contract on their ledger, others can't
  • Transfer archives the current bond and creates a new one with the new owner — there's no "update" state, only "archive old fact, create new fact"
  • The controller owner on Transfer means only the owner can invoke this choice

This is fundamentally different from Solidity's state mutation model. It took me about two weeks to stop fighting it and start thinking in terms of facts and choices.


What Building OpenFluid Taught Me About Canton's Tradeoffs

OpenFluid is a regulated financial workflow product that handles multi-party settlement flows — the kind of thing that currently lives in a tangle of SWIFT messages, spreadsheets, and phone calls between middle-office teams.

Here's what Canton's privacy model is great for and where it's genuinely painful:

What It's Great For

Multi-party transactions where parties shouldn't see each other's full picture. In OpenFluid, a settlement involves a seller, a buyer, a custodian for each party, and a central counterparty. The buyer shouldn't see the seller's position history. The custodians shouldn't see the trade economics. Canton handles this natively. On Ethereum, this would require a custom privacy layer.

Regulatory read access without changing the application logic. Adding a regulator as an observer on specific contract types is a one-line change in the template definition. The regulator sees exactly what you declare them to see, nothing more. This is clean in a way that ACL systems on permissioned databases are not — the access is in the contract logic itself, auditable and immutable.

Atomic multi-ledger settlement. Canton's atomic commit protocol allows a transaction to span multiple parties' ledgers simultaneously. Either every ledger updates or none do. This is the "Delivery vs. Payment" guarantee that financial settlement requires. It's hard to achieve in public blockchain systems and trivial to declare in Daml.

Where It's Painful

Daml is functional, strictly typed, and unforgiving. The compiler will catch most mistakes, which is good for financial systems. It's also slow to iterate on. A type error in a complex template with multiple nested choices can produce error messages that take 10-15 minutes to properly diagnose. Coming from TypeScript where you can any your way through a prototype, this is a context switch.

The toolchain is less mature than EVM. There's no Etherscan for Canton. Debugging a failed transaction requires reading Daml ledger logs, which are structured but verbose. There's no equivalent of Tenderly's transaction simulation. You test extensively, deploy carefully, and diagnose slowly.

Interop with public chains is real but limited. Canton Network has an Ethereum bridge for asset representation. But the bridge is not magic — you're still moving wrapped assets between different trust models. Any workflow that requires interaction with DeFi protocols on Ethereum needs careful design around where state lives and which chain's finality you're trusting for what.

The developer community is small. When I hit an obscure Daml issue (and there are obscure Daml issues), Stack Overflow is not going to help. Digital Asset has good documentation and an active Discord, but the answer volume is 10x lower than Ethereum forums. You spend more time in primary documentation.


When to Choose Canton

After building on it, here's my honest decision framework:

Use Canton if:

  • You have multiple parties who need transactional coordination but shouldn't see each other's full data
  • Your use case involves regulated assets where audit trails and regulatory access are requirements
  • Atomic settlement between multiple parties' ledgers is a correctness requirement, not a nice-to-have
  • Your users are institutional (they have compliance teams, they care about data residency, they'll wait for a UX that's not consumer-grade)

Don't use Canton if:

  • You want a public, permissionless deployment
  • Your users are retail and you need consumer-grade onboarding
  • You need composability with DeFi protocols (the EVM bridge works, but it's friction)
  • You need to iterate quickly on prototypes — Daml's strictness is a feature in production, not in the 48-hour hackathon

The honest summary: Canton is the right tool for a narrower set of problems than Ethereum, but for those problems, it's dramatically better. Regulated multi-party settlement is that problem. Consumer DeFi is not.


Performance Characteristics

One thing nobody talks about clearly: Canton is genuinely fast for its use case.

Public blockchains have high throughput (Solana: ~50k TPS, Ethereum L2s: ~1k-10k TPS) but measure that throughput for single-party transactions. Canton measures throughput differently: it counts multi-party transactions, each of which would be architecturally impossible on a public chain without privacy layers.

For OpenFluid's settlement workflows: ~200ms end-to-end for a two-party settlement with one custodian observer. That includes ledger write time, atomic commit across three parties' ledger nodes, and confirmation back to the application layer.

That's not high-frequency trading speed. It's faster than SWIFT. For post-trade settlement, it's entirely adequate.


The Daml Insight Worth Stealing

Even if you never deploy to Canton, Daml's obligation-based contract model is worth understanding.

Most smart contracts think about what state exists. Daml thinks about what rights and obligations exist and who holds them. A Bond contract isn't "state where balance = 100." It's "a fact that issuer has an obligation to pay owner on maturityDate, and owner has the right to transfer."

When the bond transfers, the old obligation is archived and a new one is created. The fact that a right existed, was exercised, and was replaced by a new right is permanently on the ledger. Auditors love this. It's a complete chain of custody at the contractual level, not just the transactional level.

This is a useful lens for designing any complex multi-party smart contract system, even if you implement it in Solidity. Ask: who holds what rights? Who has what obligations? What choices can each party make? When a choice is made, what facts are archived and what new facts are created?

Thinking this way catches a lot of the bugs that show up in Solidity contracts where state transitions are implicit and the "who is authorized to do what" logic is scattered across multiple functions.


OpenFluid is built on Canton Network. Daml docs are excellent and free at docs.daml.com. The Canton Network onboarding for developers is at canton.network.

Building on Canton: The Private Blockchain That Actually Runs Production Finance | Shikhar Singh