Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
4ab7957
[DOCS] deep-dive/teecryptor: new page for the TEE decryption service,…
haimbj1 Aug 19, 2026
21a26fb
[DOCS] deep-dive/decryption-request-flow: rewrite around the SDK-driv…
haimbj1 Aug 19, 2026
1968319
[DOCS] deep-dive/off-chain-decryption-flow: rewrite around Teecryptor…
haimbj1 Aug 19, 2026
3fceff9
[DOCS] deep-dive/overview: rewrite to current topology, replace Archi…
haimbj1 Aug 19, 2026
113335e
[DOCS] deep-dive/fhe-operation-request-flow: rewrite with FHE Engine …
haimbj1 Aug 19, 2026
8de0376
[DOCS] deep-dive/encryption-request-flow: rewrite around encryptInput…
haimbj1 Aug 19, 2026
31858b4
[DOCS] deep-dive/fheos-server: rewrite as ingestion and orchestration…
haimbj1 Aug 19, 2026
f9872bf
[DOCS] deep-dive/fhe-engine: new page for the execution service, adde…
haimbj1 Aug 19, 2026
5dd536e
[DOCS] deep-dive/commitment-registry: Teecryptor as commitment enforc…
haimbj1 Aug 19, 2026
2cc4cac
[DOCS] deep-dive/task-manager: two-signer model, publish gating, resu…
haimbj1 Aug 19, 2026
dc13e82
[DOCS] deep-dive/acl: expand with grant tiers, TaskManager-only write…
haimbj1 Aug 19, 2026
0686ff4
[DOCS] deep-dive/zk-verifier: attested TEE as current, real post-veri…
haimbj1 Aug 19, 2026
9d6ace0
[DOCS] deep-dive/slim-listener: two-flow relay model with queues and …
haimbj1 Aug 19, 2026
5a53c6e
[DOCS] deep-dive/plaintext-storage: describe the publish-then-read re…
haimbj1 Aug 19, 2026
0914e3c
[DOCS] deep-dive: retire threshold-network, result-processor and ct-r…
haimbj1 Aug 19, 2026
00f4944
[DOCS] deep-dive/future-plans: trust points rewritten around the TEE …
haimbj1 Aug 19, 2026
75a97a1
[DOCS] deep-dive/research-in-fhenix: position threshold decryption as…
haimbj1 Aug 19, 2026
ed578d1
[DOCS] deep-dive: fix internal links to fhe-engine and off-chain-decr…
haimbj1 Aug 19, 2026
afa14d8
[DOCS] deep-dive: Mermaid house theme matching the diagram design sys…
haimbj1 Aug 23, 2026
8216fb0
[DOCS] deep-dive/decryption-request-flow: merge offchain decryption p…
haimbj1 Aug 23, 2026
242d1af
[DOCS] deep-dive: rename What comes next sections to Future plans for…
haimbj1 Aug 23, 2026
d3ec13c
[DOCS] deep-dive/overview: list the ACL as its own onchain contract
haimbj1 Aug 23, 2026
b39d01f
[DOCS] deep-dive: trim governance internals from task-manager and acl…
haimbj1 Aug 23, 2026
69a41cb
[DOCS] deep-dive: signer list instead of a cramped table, drop pre-ro…
haimbj1 Aug 23, 2026
74e5805
[DOCS] deep-dive/task-manager: signer table with nowrap column so cod…
haimbj1 Aug 23, 2026
eca7550
[DOCS] deep-dive/task-manager: nowrap code names in tables, signature…
haimbj1 Aug 23, 2026
f5708ab
[DOCS] deep-dive/commitment-registry: reframe commitments as safety c…
haimbj1 Aug 23, 2026
5a386a7
[DOCS] deep-dive: use the real component name CT Server
haimbj1 Aug 23, 2026
8465513
[DOCS] deep-dive: sweep fixes (links, cross-page consistency, tone, t…
haimbj1 Aug 23, 2026
69cca47
[DOCS] deep-dive/encryption-request-flow: batch input verification wi…
haimbj1 Aug 24, 2026
78b9108
[DOCS] deep-dive/fhe-operation-request-flow: externalEuint input with…
haimbj1 Aug 24, 2026
7c1d80d
[DOCS] deep-dive/task-manager: batchVerifyInputs with contract-bound …
haimbj1 Aug 24, 2026
de395ac
[DOCS] deep-dive/acl: permits defined as ACP with scopes, sharing and…
haimbj1 Aug 24, 2026
89f2200
[DOCS] deep-dive/teecryptor: permit travels as acp, sealoutput requir…
haimbj1 Aug 24, 2026
a90032a
[DOCS] deep-dive/decryption-request-flow: define permit as ACP at fir…
haimbj1 Aug 24, 2026
c9d9f9e
[DOCS] deep-dive/zk-verifier: batch verification with contract-bound …
haimbj1 Aug 24, 2026
27c2248
[DOCS] deep-dive/key-management: new page for the key ceremony, partn…
haimbj1 Aug 24, 2026
7b05114
[DOCS] deep-dive: partners in the overview architecture, key-manageme…
haimbj1 Aug 24, 2026
4b0c061
[DOCS] deep-dive/overview: rearranged architecture diagram with color…
haimbj1 Aug 24, 2026
0978b9c
[DOCS] deep-dive/overview: group TEEs and cluster services inside the…
haimbj1 Aug 24, 2026
0137fe1
[DOCS] deep-dive/overview: Teecryptor first, CT Server near the encla…
haimbj1 Aug 24, 2026
e6cfe18
[DOCS] cofhe-components/overview: offchain components retitle, curren…
haimbj1 Aug 27, 2026
cea8b2a
[DOCS] cofhe-components/zk-verifier: verifier stores the encrypted va…
haimbj1 Aug 27, 2026
a58278d
[DOCS] cofhe-components/commitment-registry: define what a commitment…
haimbj1 Aug 27, 2026
d8e3eba
[DOCS] STYLE: no links to private repositories
haimbj1 Aug 27, 2026
e67b642
[DOCS] cofhe-components/fhe-engine: merge listener, fheos, and poster…
haimbj1 Aug 27, 2026
6ac7cef
[DOCS] cofhe-components: remove slim-listener and fheos-server pages,…
haimbj1 Aug 27, 2026
04546cd
[DOCS] cofhe-components/overview: big-blocks architecture diagram, FH…
haimbj1 Aug 27, 2026
3ec0ddd
[DOCS] data-flows/fhe-operation-request-flow: engine pipeline stages …
haimbj1 Aug 27, 2026
a98a8a6
[DOCS] cofhe-components/commitment-registry: poster is an engine stag…
haimbj1 Aug 27, 2026
ee4d186
[DOCS] introduction/what-is-cofhe: current component table, drop reti…
haimbj1 Aug 27, 2026
e2339ab
[DOCS] cofhe-components/overview: your contract sits outside CoFHE, b…
haimbj1 Aug 30, 2026
a946e9a
[DOCS] research/future-plans: ZK Verifier moves to MPC together with …
haimbj1 Aug 30, 2026
420def9
[DOCS] introduction/what-is-cofhe: stamp the shared mermaid theme on …
haimbj1 Aug 30, 2026
86e4831
[DOCS] cofhe-components/fhe-engine: resync mermaid init with the shar…
haimbj1 Aug 30, 2026
ef5f778
[DOCS] cofhe-components/overview: diagram matches the reviewed struct…
haimbj1 Aug 30, 2026
1479eeb
[DOCS] style: FHE Engine is one name, drop the retired FheOS Server e…
haimbj1 Aug 30, 2026
348e475
[DOCS] cofhe-components/overview: simplify the diagram, drop the colo…
haimbj1 Aug 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .DS_Store
Binary file not shown.
6 changes: 4 additions & 2 deletions STYLE.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,7 @@ One name per thing, used consistently. Canonical names:
|---|---|
| CoFHE | The coprocessor as a whole. Not COFHE, not Cofhe. |
| Teecryptor | The TEE decryption service. Capitalized as a product name. |
| FHE Engine | The service that executes FHE operations. |
| FheOS Server | The service that verifies and queues incoming work. It does not execute FHE operations. |
| FHE Engine | The offchain pipeline that subscribes to task events, executes FHE operations, and posts commitments. One name for the whole pipeline; its internal stages are not named in public docs. |
| ZK Verifier | The input proof verification service. |
| TaskManager, CommitmentRegistry, ACL | Contract names, written as in the source. |
| ACP | Access Control Permission. Replaces "Permit" from `0.7` onward, so that it is not confused with an ERC-2612 permit. Spell it out before the acronym: a page whose subject is ACPs carries the full term in its `title`, and every other page expands it on first use. Never write "ACP permission". |
Expand Down Expand Up @@ -100,6 +99,7 @@ Do not use internal names in public docs: no hostnames, no GCP project names, no

- Internal links use root-relative paths: `/fhe-library/core-concepts/access-control`, not `../core-concepts/access-control` and not the full `https://cofhe-docs.fhenix.zone/...` URL. Relative paths break when a page moves; absolute URLs break preview deployments.
- Link text describes the destination. "See [access control](/fhe-library/core-concepts/access-control)", never `"click [here](/...)"` or a bare URL.
- Never link to a private repository; readers get a 404. Of the FhenixProtocol repos, only `cofhe-contracts` and `cofhesdk` are public. Name a component or path in prose instead, and add the link when the repo goes public.
- Every image is wrapped in `<Frame>` and carries alt text that says what the image shows, not what it is called. "Sealed output flowing from the FHE Engine to the client", not "diagram".
- Pick the component that matches the content, and use each one for one job:

Expand All @@ -119,6 +119,8 @@ Do not use internal names in public docs: no hostnames, no GCP project names, no

A page full of callouts has none.

- Long code identifiers in narrow table columns get chopped mid-word by the table layout. Keep the first column to bare names (no argument lists) and guard each one with `<code style={{ whiteSpace: "nowrap" }}>name</code>`. Full signatures belong in prose above the table or in the description column.

## Code samples

- Every sample must compile or run against the currently published versions. If it would not run when pasted, it does not ship.
Expand Down
45 changes: 41 additions & 4 deletions deep-dive/cofhe-components/acl.mdx
Original file line number Diff line number Diff line change
@@ -1,11 +1,48 @@
---
title: ACL (Access Control Layer)
description: "On-chain contract that manages and enforces access control for ciphertexts, ensuring only authorized contracts can reference or decrypt them"
description: "Onchain contract that manages and enforces access control for ciphertexts, ensuring only authorized contracts and accounts can reference or decrypt them"
---

| Aspect | Description |
|--------|-------------|
| **Type** | Contract deployed on the destination blockchain |
| **Function** | Manages and enforces access control for ciphertexts, ensuring only authorized contracts can reference or decrypt them. |
| **Responsibilities** | An internal contract that is responsible for managing and verifying access for each and every ciphertext. |
| **Type** | Contract deployed on the host chain, UUPS-upgradeable behind a proxy. |
| **Function** | Manages and enforces access control for ciphertexts, for both contracts and user accounts. |
| **Responsibilities** | • Records who may use each handle in FHE operations. <br/>• Records which handles may be decrypted, and by whom. <br/>• Answers the access queries of the [TaskManager](/deep-dive/cofhe-components/task-manager) and the decryption service. |

Every encrypted value in CoFHE is guarded by this contract. A handle is useless to anyone the ACL does not list. The TaskManager rejects operations on inputs the caller cannot access, and [Teecryptor](/deep-dive/cofhe-components/teecryptor) refuses to decrypt handles without a matching grant.

## Grant tiers

| Tier | Granted by | Scope |
|------|------------|-------|
| **Transient** | `FHE.allowTransient` | Current transaction only. Stored with EIP-1153 transient storage, so it costs no persistent state. |
| **Persistent** | `FHE.allow(handle, account)` | A specific account (contract or EOA), permanently. |
| **Global** | `FHE.allowGlobal` (alias `FHE.allowPublic`) | Every account. Also marks the handle publicly decryptable. |
| **Decryption** | `TaskManager.allowForDecryption` | Adds the handle to the decryption allowlist and emits `AllowedForDecryption`. |

## Writes go through the TaskManager

All state-mutating entry points require `msg.sender` to be the TaskManager; direct calls revert with `DirectAllowForbidden`. Contracts grant access through the `FHE.sol` helpers (`allow`, `allowThis`, `allowSender`, `allowGlobal`, `allowTransient`), which route through the TaskManager.

## Permits

Offchain reads are authorized by a [permit](/client-sdk/guides/permits), which onchain is an `ACP` (Access Control Permission): an EIP-712 body signed by its issuer. Beyond the issuer, expiration, and the sealing key used for sealed outputs, an ACP carries a **scope**: global, limited to specific contracts, or limited to specific handles. A scope only narrows what the issuer could already access; it never grants more.

An ACP can be shared with a recipient, revoked through a revoker contract, and handed over onchain through the ACP share registry.

## Read surface

| Function | Answers |
|----------|---------|
| `isAllowed(handle, account)` | May this account use the handle? (any tier) |
| `allowedTransient(handle, account)` | Is there a transient grant in this transaction? |
| `persistAllowed(handle, account)` | Is there a persistent grant? |
| `globalAllowed(handle)` | Is the handle globally allowed? |
| `isAllowedForDecryption(handle)` | Is the handle on the decryption allowlist? |
| <code style={{ whiteSpace: "nowrap" }}>isAllowedWithPermission</code> | Does this permit (ACP) authorize its issuer for the given handle? |

The last two are what the decryption path runs on. For every `decrypt` or `sealoutput` request, Teecryptor queries the ACL through the TaskManager: `isAllowedWithPermission` when a permit is attached, or `isPubliclyAllowed` (the TaskManager's wrapper over `globalAllowed`) when none is. A future [Threshold Network](/deep-dive/research/future-plans) will consume the same interface.

## Upgrades

The contract is UUPS-upgradeable behind a proxy, and storage uses ERC-7201 namespaced slots for upgrade safety.
Loading
Loading