How ZKAP Works
ZKAP changes how applications interact with blockchains. Instead of sending raw transactions that expose addresses, calldata, and signatures, ZKAP wraps every action inside an encrypted, zero-knowledge–validated frame.
This turns Web3 execution from:
❌ “Public transaction with sender → contract” into 🟣 “Encrypted request → ZKAP Validator → Clean action for the app”
Below is a simple explanation of the process.
🧩 1. User/Agent generates an Anonymous Identity
Every action starts with an ephemeral ZK identity.
not an EOA
no private key
no wallet
cannot be linked
disappears after use
This identity is used only inside the zero-knowledge proof.
No part of it ever becomes public.
🔐 2. Build a Private Payload
The user (or agent) prepares their action:
swap
deposit
RFQ request
governance vote
agent instruction
cross-chain intent
This action is encoded into a payload.
Example:
{
"action": "swap",
"tokenIn": "USDC",
"tokenOut": "ETH",
"amount": "500",
"minOut": "0.3",
"expiry": 12345678
}But the application never sees this raw data.
🔒 3. Encrypt the Payload
The payload is encrypted with a session key:
AES-GCM or ChaCha20-Poly1305
unique IV/nonce
authenticated ciphertext
Result = payload_ciphertext
Only the sender and the destination application can decrypt it.
🧠 4. Generate a Zero-Knowledge Proof of Validity
The user generates a ZK proof showing:
the payload is well-formed
identity is valid
nullifier is correctly derived
expiry is inside allowed range
action type matches the commitment
The proof does not reveal:
the sender
content of the payload
any metadata
any parameters
It only proves “this request is valid.”
📦 5. Everything is wrapped into a ZKAP Frame
A ZKAP Frame is created:
ZKAPFrame {
zk_proof,
commitment_root,
payload_ciphertext,
nullifier,
session_hash,
expiry_block
}This is the only thing sent to the blockchain.
There is no:
address
signature
calldata
function selector
🛡️ 6. Submit the Frame to the ZKAP Validator Contract
The validator contract checks:
verify ZK proof
check nullifier (prevent replay)
check expiry block
If all good → it emits an AnonymousAction event.
Example (conceptually):
AnonymousAction(
commitment_root: 0xabc...123,
payload_ciphertext: 0xff23...
)Apps see only encrypted data.
📥 7. Application decrypts the payload and executes logic
Now the application (DEX, wallet, agent orchestrator, bridge service…) does:
listens for
AnonymousActioneventsdecrypts the ciphertext using its key
reads the user’s private request
executes the logic normally
The application learns:
what action to execute
what parameters to use
But never learns:
who the sender is
their address
their signature
their identity
their usage patterns
Last updated