Elydora Epoch Root (EER)
The EER is a periodic Merkle root that anchors all operations within a time window into a single verifiable hash, signed by Elydora.
Structure
| Field | Type | Required | Description |
|---|---|---|---|
| epoch_id | string | Yes | Unique identifier for this epoch. |
| org_id | string | Yes | Organization identifier. |
| start_time | number | Yes | Unix millisecond start of the epoch window. |
| end_time | number | Yes | Unix millisecond end of the epoch window. |
| leaf_count | number | Yes | Number of operations included in this epoch. |
| root_hash | string | Yes | SHA-256 Merkle root of all operation hashes in the epoch. |
| hash_alg | string | Yes | Hash algorithm. Currently "sha256". |
| signature_by_elydora | string | Yes | Ed25519 signature by Elydora over the epoch root. |
Example EER
json
{
"epoch_id": "0195f2c8-4d6e-7f8a-9b0c-1d2e3f4a5b6c",
"org_id": "org_acme",
"start_time": 1772287200000,
"end_time": 1772287500000,
"leaf_count": 1247,
"root_hash": "<base64url Merkle root>",
"hash_alg": "sha256",
"signature_by_elydora": "<base64url Ed25519 signature>"
}Merkle Tree Construction
The Merkle tree is built from the chain hashes of all operations received during the epoch window:
- Leaves are the chain_hash values, sorted in ascending order.
- Internal nodes are SHA-256 over the raw bytes of the two child hashes.
- If the leaf count is odd, the last leaf is duplicated to complete the tree.
Verification
To verify that an operation is included in an epoch:
- Call POST /v1/operations/:operation_id/verify; checks.merkle is true once an epoch covers the operation
- Fetch the epoch with GET /v1/epochs/:epoch_id to read root_hash, leaf_count, the time window, and the RFC 3161 anchor when present
The signed EER stays in Elydora storage. The API returns the epoch record without signature_by_elydora.
Epoch Timing
Epochs close every 5 minutes. The epoch boundary uses the server receive time, not the client issued_at.