Motivation
Consider the following scenario: Your contract receives an encrypted input that should remain confidential.How Access Control Works
In practice, the code above will revert with anACLNotAllowed error when attempting to decrypt the ciphertext. Any other FHE operation will also fail if the calling contract doesn’t have permission for all input handles.
Example: Unauthorized Operations Fail
Granting Access
CoFHE provides five methods to grant access to ciphertext handles:FHE.allowThis()
FHE.allowThis()
FHE.allowThis(CIPHERTEXT_HANDLE)Allows the current contract access to the handle. Use this when you want the contract itself to retain access to a ciphertext beyond the current transaction.FHE.allowSender()
FHE.allowSender()
FHE.allowSender(CIPHERTEXT_HANDLE)Allows the transaction sender (msg.sender) access to the handle. Use this when you want to grant the caller of the function access to the ciphertext.FHE.allow()
FHE.allow()
FHE.allow(CIPHERTEXT_HANDLE, ADDRESS)Allows a specific address persistent access to the handle. Use this when you want to grant permanent access to another contract or user.FHE.allowTransient()
FHE.allowTransient()
FHE.allowTransient(CIPHERTEXT_HANDLE, ADDRESS)Allows a specific address temporary access to the handle for the duration of the transaction only. Use this for cross-contract calls within the same transaction.FHE.allowGlobal()
FHE.allowGlobal()
FHE.allowGlobal(CIPHERTEXT_HANDLE)Allows any address access to the handle. Use with caution - this makes the ciphertext handle publicly accessible.Decryption and Access Control
To decrypt a ciphertext off-chain using the decryption network, the issuer of the decryption request must have permission on the ciphertext handle. If not, the request will be denied by the access control system.
Behind the Scenes
Every blockchain integrating CoFHE includes a deployedACL.sol contract. This contract manages ownership records for each ciphertext, ensuring that only authorized owners can perform operations on their encrypted data.
ACL Storage Structure
The ACL contract contains the following mapping which tracks the ownership of each ciphertext handle:Best Practices
Principle of Least Privilege
Only grant access to addresses that genuinely need it. Avoid using
allowGlobal() unless the data is truly meant to be public.Use Transient for Cross-Contract Calls
When calling other contracts within a transaction, use
allowTransient() instead of permanent access to limit exposure.Track Your Permissions
Keep track of which addresses have access to which ciphertexts, especially in complex multi-contract systems.
Clean Up When Possible
Consider the lifecycle of your encrypted data and whether permissions should be revoked after certain operations.