Get up and running with TACEO:OPRF in minutes. This guide will walk you through installation and your first OPRF computation.
Download the pre-built client from GitHub Releases.
macOS users: You'll need to allow the binary to execute:
xattr -dr com.apple.quarantine taceo-oprf-testnet-clientIf you prefer to build from source:
# Clone the repository
git clone --recursive https://github.com/TaceoLabs/oprf-testnet.git && cd oprf-testnet
# Install dependencies
# - Rust: https://rust-lang.org/learn/get-started/
# - On Ubuntu: build-essential (name may vary on other platforms)
# Build the client (this takes some time)
cargo build --release
# Copy the binary for convenience into the root folder
mv target/release/taceo-oprf-testnet-client .Now you'll have a taceo-oprf-testnet-client binary to interact with TACEO:OPRF!
We'll demonstrate two different authorization modules that showcase TACEO:OPRF's flexibility.
This example uses basic API key validation - perfect for getting started.
Run the command:
./taceo-oprf-testnet-client \
--api-key taceo_3ZfE55WkcNWRweh5rcfpUNpi \
basic --input 42What happens:
- Client sends your input (
42) and API key to OPRF nodes - Nodes verify the API key is valid
- Nodes cooperatively compute the OPRF output
- Client receives and displays the final result
Expected output: You'll see the deterministic OPRF output in your terminal. Running the same command again produces the same result - this is the deterministic property of OPRFs.
The OPRF secret key is used to derive the output. Without querying the OPRF nodes with the same input, no one can guess or reproduce this output. This is guaranteed by the cryptographic properties of OPRFs.
This advanced example demonstrates zero-knowledge wallet ownership verification.
Prerequisites:
You'll need Barretenberg v3.0.0-nightly.20260102:
# Install bbup
curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/next/barretenberg/bbup/install | bash
# Add to PATH and restart shell, then:
bbup -nv 1.0.0-beta.18Run the command:
./taceo-oprf-testnet-client \
--api-key taceo_3ZfE55WkcNWRweh5rcfpUNpi \
wallet-ownershipWhat happens:
- Client generates a fresh Ethereum wallet (private key shown in output)
- Client creates a zero-knowledge proof of wallet ownership
- OPRF nodes verify the proof without learning the wallet address
- Nodes compute OPRF output using the verified wallet as input
- Client receives the final result and ZK proof files
Expected output:
- Private key of the generated wallet
- OPRF output (deterministic nullifier)
proofandpublic_inputsfiles for verification
Verify with existing wallet: You can reuse a previously generated private key:
./taceo-oprf-testnet-client \
--api-key taceo_3ZfE55WkcNWRweh5rcfpUNpi \
wallet-ownership \
--private-key <PREVIOUS_PRIVATE_KEY>This will produce the same nullifier, demonstrating deterministic output.
Download the verification key:
curl -sSLO https://github.com/TaceoLabs/oprf-testnet/raw/refs/heads/main/oprf-testnet-authentication/verified_oprf_proof.vkVerify your proof:
bb verify -p proof -i public_inputs -k verified_oprf_proof.vkThe wallet ownership example uses two zero-knowledge proofs:
1. Blinded Query Proof (source)
- Proves you control the wallet without revealing the address
- Verifies signature against a specific message
- Generates blinded OPRF query
2. Verified OPRF Proof (source)
- Proves correct OPRF computation
- Verifies the nullifier corresponds to your wallet
- Enables third-party verification without revealing inputs
Ready to experiment more? Set up your own local OPRF network for development.
Want to build your own authorization logic? Learn about Authorization Modules.
Ready to integrate into your application? Check the API Reference.
Looking for inspiration? Explore our Use Cases & Examples.
The hosted dev setup is operated entirely by TACEO. As a result, the MPC threshold assumption is not enforced in this environment.
Do not send real private data.
Do not use the dev setup in production.
There are no guarantees of liveness or stability, and the API may change without notice.