Storage
Validators that opt into the storage role serve user files. Storage proofs are aggregated by the PoU module and rewarded each block.
File manifests
A manifest is the on-chain record of a stored file:
{
"cid": "blake3:...",
"size": 1048576,
"shards": 16,
"replicas":3,
"ttl_blocks": 432000,
"owner": "frx1...",
"fee_afrx":"1000000000"
}
| Path | Returns |
|---|---|
/file/manifests | every active manifest |
/pou/records | per-validator served-bytes & success-rate |
How PoU works
Each block, the chain picks a random shard from a random manifest and requests a Merkle-proof from the assigned validators. Proofs land in the gossip layer; the keeper aggregates and pays out from the reward pool.
See Modules · Omnia for the integration with consensus.
Chunk assignment
When a file is uploaded, the chain automatically assigns each chunk to
CHUNK_REPLICATION_FACTOR = 3 storage nodes (least-loaded-first).
// GET /file/assignment/:file_id/:chunk_index
{
"file_id": "00000000…",
"chunk_index": 0,
"assigned_nodes": ["frx1aaa…", "frx1bbb…", "frx1ccc…"],
"assigned_at_height": 145230
}
curl https://v2.rpc.fenryx.io/file/assignments/<file_id>
The chain does not force physical data transfer — off-chain daemons on each assigned node download the chunk from the uploader.
| Path | Returns |
|---|---|
/file/assignment/:file_id/:chunk_index | Assignment for one chunk |
/file/assignments/:file_id | All chunk assignments for a file |