Architecture Decisions
Key design choices behind the Dual platform and when to use each pattern.
Why a Hybrid On-Chain / Off-Chain Model?
Dual processes actions off-chain for speed and cost, then anchors cryptographic fingerprints on Ethereum for finality. This lets you achieve sub-second confirmations while retaining the security guarantees of a public blockchain.
The trade-off is a 4-hour challenge window before batches are fully settled. For most asset-tokenization use cases, event tickets, loyalty points, provenance certificates, this latency is invisible to end-users.
Optimistic Execution with ZK Fallback
By default, batches are accepted optimistically: the Sequencer publishes a Merkle root and anyone can challenge it during the fraud window. If you need instant finality, for example, a high-value real-estate transfer, you can request a ZK proof at batch submission time. The proof is verified on-chain immediately, bypassing the challenge window at a higher gas cost.
Choose optimistic mode for high-throughput, low-value flows and ZK mode when settlement speed outweighs gas savings.
EIP-712 Signed Actions
Every mutation in Dual is an Action signed with EIP-712 typed data. This gives you:
- Cryptographic proof of user intent without on-chain transactions
- Human-readable signature prompts in wallets like MetaMask
- Replay protection via nonces managed by the Sequencer
Multi-Tenancy via Organizations
Each Organization is a fully isolated workspace with its own templates, objects, API keys, and billing. This makes Dual suitable for SaaS-style platforms where multiple brands or business units share the same infrastructure but must not see each other's data.
Within an Organization, role-based access control (Owner → Admin → Member → Viewer) governs who can create templates, mint objects, or manage billing.
Event-Sourced State
Dual stores every action as an immutable event. Current state is derived by replaying actions, which means you get a full audit trail for free. The Event Bus API lets you subscribe to real-time action streams for analytics, compliance, or triggering downstream workflows.
When to Use Templates vs. Objects
Think of Templates as the class and Objects as the instance. Define a Template once, including its property schema, faces, and allowed actions, then mint as many Objects as you need. If you find yourself duplicating template definitions, consider using template variations instead of separate templates.
Decision Matrix
Further Reading
- Data Modelling, how to structure templates and properties
- Sequencer, batching and ordering internals
- ZK Rollup, proof generation and verification