System Architecture
Ekayana is a platform for storing, identifying and sharing research data. It is built from four subsystems.
- Identity is the
did:biomethod, a W3C DID method anchored on Solana. Researchers are identified by their wallets. Datasets, papers and claims are identified by DIDs that those wallets own. - Storage is a private IPFS cluster, with every upload pinned on every peer on write. Payloads are sealed before they reach the cluster, so a CID addresses ciphertext.
- Authorization is UCAN 1.0 delegations and invocations. Every grant is signed by a wallet. The service validates chains and does not sign on a user's behalf.
- Processing is BioAgents, an ElizaOS deployment that indexes registered papers and maintains a knowledge graph, reached only through the API.
This page describes the components that implement these subsystems, the keys that control them, and the path of a request through the system. The other pages describe one component each.
Components
Three implement identity and follow one specification. Two implement authorization. The API and the browser application consume them.
| Repository | Version | Contents |
|---|---|---|
bio-did-spec | v1.3 | The did:bio method definition, covering identifier syntax, the two subject forms, authorization through controllers and programs, the resolution algorithm, and security and privacy considerations |
bio-did-registry | 0.2.0 | The Solana program that serves as the method's verifiable data registry, also usable as a library that exports the program's constants and builds its instructions |
did-bio-core | 0.2.0 | Data model, strict account decoders, the resolution algorithm as a pure function, dereferencing and a quorum reader, with Ed25519, ES256K and ML-DSA-87 verification behind a feature |
bio-did-resolver | 0.2.0 | Command line resolver and client for every registry instruction except update_service |
pq-ucan | 0.1.2 | UCAN 1.0 delegation, invocation, the policy language and chain validation, with ML-DSA principals |
pq-space | 0.1.2 | did:bio principals for pq-ucan, and ML-KEM-1024 content key wrapping carried inside the delegation |
Dependencies between them are as follows.
bio-did-registryanddid-bio-coreimplement the specification independently. Parity tests indid-bio-coreandbio-did-resolverpin their constants, discriminators and derivations to each other.pq-spacedepends ondid-bio-core, so that adid:bioidentity can sign and verify tokens in the same chain asdid:keyprincipals.- The API links
bio-did-registrywith theno-entrypointfeature. The instructions it plans for a wallet are encoded by the same code that decodes them on-chain. - The browser application links none of the crates. It signs bytes that the API prepares.
The runtime components are these.
| Component | Stack | Role |
|---|---|---|
| Ekayana API | Rust, axum, Postgres | Accounts, DID records, workflow planning, sealing and opening payloads, UCAN validation, BioAgents and Dataverse proxies |
| Browser application | Next.js, @solana/kit | Wallet connection, transaction and delegation signing, a per session read key |
| Registry | Pinocchio program on Solana devnet | Program H1gnV4GjNT3UV7AgGNUCkSaciuVVtM7hKb8JhPV3Xxy6, reproducible build |
| Storage | Private IPFS cluster, Kubo peers behind IPFS Cluster | Sealed payloads and public metadata documents referenced from DID service entries, pinned on every peer |
| BioAgents | ElizaOS | Knowledge base, knowledge graph and structure plugins |
Key custody
The service holds no key that can act on a researcher's behalf. The key holders and the operations each may perform are shown below.
- The wallet is an Ed25519 keypair held by the researcher. Its address on the configured cluster is the researcher's
did:bio. It signs registry transactions and pays their rent, signs every delegation, whether a share or a session grant, and is the only key that can grantwriteordelete. - The browser session key is a nonextractable Ed25519 key created in WebCrypto at sign in. The wallet grants it
/file/readfor 24 hours through a powerline delegation. It signs read invocations and is discarded at sign out. - The service derives a
did:bioand an ML-DSA-87 assertion key from one seed,SERVICE_SEED, and holds the ML-KEM-1024 decapsulation key,MLKEM_SECRET_KEY. It is the executor named by every invocation. It seals and opens payloads. It issues no delegations. - The registry holds DID documents under Solana consensus. Only a key listed with
capabilityInvocationcan change a document. The service reads atfinalizedcommitment and never writes. - IPFS holds sealed payloads and public metadata documents. A CID addresses ciphertext, and replicas cannot read it.
A compromise of the service therefore exposes ciphertext and public documents rather than authority. Session tokens are opaque 256 bit bearer values stored as hashes and carry no claims.
Request flow
Each flow below crosses at least two subsystems and links to the page that specifies it.
- Account and wallet.
POST /api/signupcreates an account and a session.POST /api/wallet/nonceandPOST /api/wallet/verifyrun a Sign In With Solana challenge and record the wallet. From then on the account's DID is the wallet's. See Authentication. - DID creation.
POST /api/didderives an owned subject from the wallet and a fresh nonce and stores the record. The DID resolves tonotFounduntil it is anchored. See did:bio identifiers. - Anchoring.
POST /api/workflowsplans a transaction made ofinitialize_owned, the service entries and the controller, and quotes its rent and fee. The wallet signs and sends it.POST /api/workflows/{id}/confirmmakes the API read the transaction and the account from the chain before it marks the record anchored. See Solana Registry Program. - Upload.
POST /api/uploadseals the payload under a fresh content key and pins the ciphertext. See Privacy Controls. - Sharing.
POST /api/share/file/preparereturns the bytes of a delegation naming the CID, the recipient's DID, the actions and the expiry. The wallet signs them.POST /api/share/fileassembles, verifies and records the token. See UCAN Authorization. - Reading.
POST /api/ucan/invoke/preparereturns the bytes of a 60 second invocation. The session key signs them.GET /api/download/{cid}carries the token and the invocation in thex-ucan-tokenandx-ucan-invocationheaders. The API validates the chain with itself as executor, then decrypts. See Sharing & Delegation.
Scope of the guarantees
- Post quantum cryptography applies to specific layers. These are ML-DSA-87 assertion keys in DID documents, ML-DSA principals in UCAN chains, and ML-KEM-1024 content key wrapping. Registry transactions and wallet signatures are Ed25519. See Post Quantum Security.
- Revocation is recorded by the service.
pq-ucanvalidates chains, and the API checks itsrevoked_atcolumn before it runs the validator. - None of the components has received an external audit. The registry runs on devnet.
Related pages
- Solana Registry Program describes the on-chain component.
- UCAN Authorization describes the token format and the validator.
- did:bio identifiers describes the identifier rules both of them share.