This is a monorepo containing:
artifacts: KeyGen proving keys, generated with a distributed ceremony.contracts: An implementation of the required smart contracts.docs: A typst document serving as a writeup of the overall scheme.oprf: A meta-crate (taceo-oprf) that re-exports all other crates for convenience.oprf-client: A crate implementing a client lib for the OPRF service.oprf-core: A crate implementing a verifiable OPRF based on the TwoHashDH OPRF construction + a threshold variant of it.oprf-dev-client: A crate implementing common dev client functionality.oprf-key-gen: A crate implementing a OPRF key generation instance.oprf-service: A crate implementing a service lib for the OPRF service.oprf-test-utils: A crate implementing test utils.oprf-types: A crate implementing types that are shared between client, service, and the blockchain.
- oprf-key-registry: A repository containing the smart contracts in the
contractssubmodule. - oprf-circom: A repository containing audited Circom circuits for proving the OPRF operations in zero-knowledge.
- oprf-nr: A repository containing audited Noir circuits for proving the OPRF operations in zero-knowledge.
- just
- docker compose (for running
anvilandpostgrescontainers) - anvil and forge, install with foundryup
- PostgreSQL (provided via Docker in the local setup)
To install the dependencies for the smart contracts run the following command:
cd contracts && forge installFor development, we provide a just command that runs the full test suite for the entire workspace. This includes Circom tests, smart contract tests, and a complete end-to-end test using the example binaries.
just all-testsTo run the tests against a local setup, use:
just run-setupThis command does multiple things in order:
- start
anvilandpostgresdocker containers - deploy the
OprfKeyRegistrysmart contract - register the OPRF participants at the
OprfKeyRegistrycontract - build the workspace
- start 3 OPRF key-gen instances
- start 3 OPRF service nodes
Log files for all processes can be found in the created logs directory.
You can kill the setup with Ctrl+C, which kills all processes and stops all docker containers.
You can then use the dev client to send requests using the following command:
just run-dev-client testOPRF key shares are stored in a PostgreSQL database.
Required environment variables:
TACEO_OPRF_NODE__POSTGRES__CONNECTION_STRING– PostgreSQL connection string (e.g.,postgres://user:password@host:5432/dbname)TACEO_OPRF_NODE__POSTGRES__SCHEMA– Database schema to useTACEO_OPRF_NODE__SERVICE__WALLET_PRIVATE_KEY– Wallet private key for the node
The Postgres secret manager automatically runs migrations on startup to create the required tables:
oprf_shares– Stores OPRF key shares per epochevm_address– Stores EVM address mappings
Security considerations:
- The connection string contains credentials and should be treated as a secret
- Use SSL/TLS connections in production (
?sslmode=require) - Ensure the database is not publicly accessible
- The wallet private key should be provided securely (e.g., via a secrets manager in your deployment environment)
Both the OPRF service and key-gen are configured via environment variables using a hierarchical prefix scheme:
- OPRF service:
TACEO_OPRF_NODE__*(e.g.,TACEO_OPRF_NODE__BIND_ADDR,TACEO_OPRF_NODE__SERVICE__ENVIRONMENT) - Key generation:
TACEO_OPRF_KEY_GEN__*(e.g.,TACEO_OPRF_KEY_GEN__BIND_ADDR,TACEO_OPRF_KEY_GEN__SERVICE__WALLET_PRIVATE_KEY)
See run-setup.sh for a complete example of all required environment variables.
For a detailed description of the OPRF scheme, see docs/oprf.pdf.
This project is licensed under either of
at your option.