Homework / Interview Submission · April 2026

Canton Network
— and the layer above it.

Canton owns the rails. This is the layer above — workflow, identity, approval, audit, and integration that an institution actually operates.

Naim Katiman April 2026 For HydraX
View 18-Slide Deck Open Live App View Source
Live on Railway 5 Portals · 9 Services HydraX Rails · Mock-Adapter (deferred-not-resolved)

01 · Conceptual Overview

Not a blockchain. A privacy-preserving sync protocol for multi-party workflows.

Canton is best understood not as a blockchain, but as a privacy-preserving synchronisation protocol for multi-party workflows in regulated markets. Public chains optimise for shared visibility and permissionless composition. Traditional permissioned DLT optimises for control but fragments interoperability. Canton sits in the gap: independent participants run their own nodes, hold only the contracts they are entitled to see, and coordinate state changes through synchronisers that order transactions without seeing their contents.

Three primitives. The rest of the architecture follows from them.

Primitive 01

Participant Nodes

One per organisation. Holds only that org's view of contracts. Privacy is per-contract, not per-channel.

Primitive 02

Synchronisers

Order and finalise multi-party transactions without seeing payload. Trust is contractual, not custodial.

Primitive 03

Daml Contracts

Stakeholders are declared on the contract itself, so privacy and entitlement are properties of the data model.

The four-layer wiring (apps → participant nodes → synchronisers → ledger) is in slide 03. The property: selective disclosure with global coordination — shared truth without globally readable state.

How Canton differs

vs. Ethereum / public L1s
  • No shared mempool, no global state read
  • No token-incentivised consensus
  • Composability is by signed Daml choices across consenting parties — not anyone-can-call
vs. Fabric / Corda / Quorum
  • Privacy is per-contract stakeholder set, not channel-based isolation
  • Same workflow can span domains with different privacy boundaries without re-architecting
  • No need-to-know broadcasts — entitlement is intrinsic to the data

02 · Building on Canton

What I built.

The brief asked for a description of what to build, not generic platform copy. The repo at naimkatiman/hydrax-app is the implementation; the live app is the running surface.

The premise: institutions need the workflow, identity, approval, audit, notification, and integration layer above the ledger — what an issuer, distributor, custodian, ops team, and investor each operate. HydraX has the rails (tokenisation, custody, trading, regulatory licences in MY/SG); this is the operational platform above them.

Three planes above the rails

Plane 01 · Experience

Five Role-Aware Portals

Issuer, distributor, investor, ops, admin. White-label tenant theming via CSS variables. React + Vite + RTK. Live →

Plane 02 · Orchestration

9 Backend Services

6 Go services (workflow, approval, audit, hydrax-adapter, canton-adapter, market-data) and 3 Node services (notify, integrate, BFF). Stable ports 7001–7006 + 7101–7103, each with `/healthz` + tests + Dockerfile.

Plane 03 · Rails

HydraX + Canton Adapters

The only path the browser takes to the ledger. The HydraX adapter is mocked behind a stable interface until HydraX shares the API surface.

Five assumptions in the design

  1. Single-synchroniser to start. Multi-domain Canton is real complexity for a real benefit; deferred until a tenant needs cross-domain composition.
  2. Web2 owns identity, UI, documents, notifications, reporting. Web3 owns shared truth and controlled state transitions. See slide 04 ("Where Canton stops") for the boundary.
  3. Browser never touches Daml directly. All ledger I/O routes through Go adapters with audit on the way in and event-stream projections on the way out.
  4. Tenant isolation and role-based disclosure from day one, not retrofitted. Each portal is its own role-scoped shell, not the same SPA with feature flags.
  5. First wedge is narrow: institutional onboarding + product issuance + subscription servicing. Not secondary market, not portfolio analytics, not a generalised workflow engine.

03 · Technical Deep Dive

Three areas to dig into.

A. Privacy ↔ composability trade-off

Slide 04 is the core tension. Public chains get composability because state is globally readable; that property is what disqualifies them for regulated workflows. Canton's contract-level privacy means a custodian doesn't see a competing custodian's positions on the same domain — and it means you cannot compose blindly. Cross-contract logic requires every relevant party to be a stakeholder on every relevant contract. Feature for compliance, constraint for builders.

The implication: composability moves from the ledger to the orchestration plane. The workflow service has to bring the right parties onto a contract at issuance time so the downstream choices are possible. Get this wrong at modelling time and no UI work fixes it.

B. The workflow plane as its own system

A common mistake is treating "the app" as a thin wrapper around Daml choices. 80% of institutional value lives in what surrounds the choice: who approved it, what evidence was attached, which SLA clock is running, what notification fired, what audit row was written.

That's why the orchestration plane has more services than the rails plane (workflow-svc, approval-svc, audit-svc, notify-svc, integration-svc, bff). Single-purpose services with their own state machines and `/healthz` endpoints keep debugging, scaling, and tenant isolation tractable. A monolith would have been faster to ship and harder to operate at multi-tenant scale.

C. Smart contract lifecycle in regulated environments

Daml upgrade paths are real, but the operational question is harder than the technical one. When entitlements change — a distributor loses a licence, a regulator's reporting party rotates — what happens to in-flight contracts?

Daml gives you the upgrade primitive (interfaces, package versioning), but you still need (a) a deterministic projection of "what's in flight at cutover", (b) a migration plan per contract template, (c) a fallback for participants who haven't accepted the new package, (d) an audit trail that proves no economic state changed during the swap. Not solved — but the lifecycle decisions are isolated in the rails-plane adapters, where they belong.

04 · Deferrals

What's deferred, and why.

What's not built, and the reason for each.

05 · How I Built This Knowledge

How I built up the model.

  1. Built the mental model from first principles (rails vs. layer above) before reading docs, so I had questions to test against the docs rather than absorb passively.
  2. Confirmed against Canton + Daml official documentation. Used Context7 MCP for current SDK references.
  3. Mapped each Canton primitive to a real institutional workflow (subscription, approval chain, audit) before touching code.
  4. Built the prototype to find where the model breaks — the deferrals above are the points I hit.
  5. Wrote the deck last. Drawing the system forced me to defend each box.

Appendix

Artifacts.

Each one is the long form of a section above.

Appendix A

18-Slide Homework Deck

Three required sections plus four deep-dives — conceptual overview, building on Canton, technical deep dive, tokenization, composability, infra, data sync.

View deck →

Appendix B

5-Minute Walkthrough Script

What I would say if I narrated the deck — six segments, ~5 minutes, recordable as-is.

Read script →

Appendix C

Live Multi-Portal Demo

Five role-aware portals — issuer, distributor, investor, ops, admin — running on Railway right now.

Open live app →

Appendix D

Public Source Code

9 services, 5 portals, PRD, plan docs, this site itself. The whole repo.

View source →