Architecture
How Cascade separates control-plane and data-plane for permanent decentralized storage.
System Overview
Cascade is designed around a strict separation of control-plane (blockchain) and data-plane (Supernode network). This design ensures that on-chain storage remains efficient while large files are handled off-chain by specialized infrastructure.
Components
Lumera Blockchain
The Lumera chain is an application-specific Layer-1 built with Cosmos SDK and CometBFT (Tendermint). It handles:
- Action registration:
MsgRequestActionrecords file metadata (hash, size, layout IDs) on-chain - Fee escrow: Creators pay a one-time storage fee in
ulumethat is escrowed and distributed to Supernodes - State machine: Actions transition through states:
PENDING→PROCESSING→DONE(orFAILED) - Action queries: Any client can look up an action by ID to verify storage status
Supernodes
Supernodes are specialized validators that provide storage capacity to the network. They are responsible for:
- Receiving file uploads via the SN-API
- Encoding files with RaptorQ erasure coding
- Storing encoded chunks with redundancy guarantees
- Serving file downloads by reconstructing the original data from available chunks
- Consensus participation on storage challenges to prove data availability
Hardware requirements for running a Supernode:
- 8+ CPU cores
- 64 GB RAM
- 2 TB+ SSD storage
- 5 Gbps+ network
SN-API (Supernode API)
The SN-API is a REST gateway that abstracts the complexity of the Supernode mesh:
- Receives file uploads via multipart form data
- Routes download requests to the appropriate Supernodes
- Provides task status tracking via polling and Server-Sent Events (SSE)
- Handles authentication via ADR-036 wallet signatures
Public SN-API endpoints:
| Network | Endpoint |
|---|---|
| Testnet | https://snapi.testnet.lumera.io |
| Mainnet | https://snapi.lumera.io |
Action Module
The Action module is a custom Cosmos SDK module (x/action) that manages the lifecycle of Cascade storage actions:
Data Flow
Upload Path
- Client computes BLAKE3 hash of the file
- Client generates RaptorQ layout and derives deterministic layout IDs
- Client signs the layout with ADR-036 (
signArbitrary) - Client broadcasts
MsgRequestActionto the chain (simulates gas, signs, broadcasts) - Chain validates the message, escrows the fee, emits
action_registeredevent withaction_id - Client sends the file to SN-API (
POST /api/v1/actions/cascade) with theaction_idand auth signature - SN-API distributes chunks across the Supernode mesh
- Client polls task status until terminal state (
sdk:completedorsdk:failed)
Download Path
- Client signs the
action_idwith ADR-036 for authentication - Client requests download via
POST /api/v1/actions/cascade/{action_id}/downloads - SN-API gathers chunks from Supernodes and reconstructs the file
- Client monitors progress via SSE (
GET /api/v1/downloads/cascade/{task_id}/status) - Client streams the file via
GET /api/v1/downloads/cascade/{task_id}/file
Fee Model
Each Cascade storage pays a one-time storage fee in ulume (1 LUME = 1,000,000 ulume). The fee is a pure function of file size, so you can estimate it before uploading:
File size is rounded up to the next whole kilobyte ((bytes + 1023) / 1024).
| Parameter | Mainnet value | In LUME |
|---|---|---|
base_action_fee | 10000 ulume | 0.01 LUME |
fee_per_kbyte | 10 ulume | 0.00001 LUME / KB |
So every successful storage adds 10000 + 10 × sizeKB ulume to what you've spent:
| File size | Storage fee (ulume) | In LUME |
|---|---|---|
| 1 KB | 10,010 | 0.01001 |
| 256 KB | 12,560 | 0.01256 |
| 1 MB (1,024 KB) | 20,240 | 0.02024 |
| 10 MB (10,240 KB) | 112,400 | 0.11240 |
| 100 MB (102,400 KB) | 1,024,000 | 1.02400 |
| 1 GB (1,048,576 KB) | 10,485,760 | 10.48576 |
Query the exact amount from the chain instead of hardcoding it. The SDK expects the size in KB, rounded up, and returns the fee in ulume:
The fee is escrowed at registration (MsgRequestAction) and released only after the action reaches DONE. In case the upload fails, the fee is returned to the user.
The fee is paid once, with no recurring charges.
This storage fee is separate from the gas fee (min gas price 0.025ulume) charged on every transaction.
Security Model
- Data integrity: BLAKE3 hashes are stored on-chain and verified during download
- Authentication: All SN-API operations require ADR-036 wallet signatures
- Data availability: RaptorQ erasure coding ensures files can be reconstructed even if a significant fraction of Supernodes go offline
- Immutability: Once an action is registered on-chain, the associated data hash cannot be modified