I’ve been working on Blindroll, a confidential payroll system built on Zama’s fhEVM. The goal was simple: build a payroll tool on Ethereum Sepolia where salaries, balances, and the treasury remain encrypted throughout the entire lifecycle, from the browser to the smart contract execution.
The Friction with Public Payroll
We all know the deal: on-chain payroll is great until you realize every contributor’s salary is a permanent public record. For DAOs or remote teams, that transparency is a non-starter. Most teams end up back on centralized processors just to get basic privacy. Blindroll is an attempt to bring that “traditional” confidentiality to a public chain without using off-chain workarounds.
Technical Implementation
1. Client-Side Encryption:
Encryption happens in the browser before the transaction is signed. Using the Zama relayer SDK (running a TFHE WASM module), plaintext amounts are converted into euint64 ciphertexts with ZK input proofs. What actually hits the chain is just an opaque bytes32 handle.
2. “Blind” Execution
The contract operates entirely on ciphertexts. When payroll runs, we use:
FHE.le()andFHE.select()to check the treasury against salariesFHE.sub()andFHE.add()for the actual transfers.
- Access Control (ACL)
We handle permissions at the ciphertext level. Every time a salary is updated, we issue three grants:
FHE.allowThis(): For contract persistence.FHE.allow(salary, employer): For auditingFHE.allow(salary, employee): For the recipient’s private view.
- Gasless Decryption
For an employee to see their balance, they sign an EIP-712 message. This signature authenticates them to Zama’s KMS, which re-encrypts the value under an ephemeral keypair and returns it to the UI. No gas, no transaction, just a local plaintext render.
What’s visible on Etherscan
If you look at an addEmployee transaction, you’ll see the fhEVM executor verifying an input and the ACL contract granting permissions. You won’t see a single number. The salary effectively doesn’t exist in readable form on the network.
Why this matters for the ecosystem
If you look at a addEmployee transaction, you’ll see the fhEVM executor verifying an input and the ACL contract granting permissions. You won’t see a single number. The salary effectively doesn’t exist in readable form on the network