Logos Execution Zone (LEZ) is a programmable blockchain that cleanly separates public and private state while keeping them fully interoperable. Developers can build apps that operate across transparent and privacy-preserving accounts without changing their logic. Privacy is enforced by the protocol itself through zero-knowledge proofs (ZKPs), so it is always available and automatic.
These features are provided by the Logos Execution Environment (LEE). Traditional public blockchains expose a fully transparent state: the mapping from account IDs to account values is entirely visible. LEE introduces a parallel private state that coexists with the public one. Together, public and private accounts form a partition of the account ID space: public IDs are visible on-chain, while private accounts are accessible only to holders of the corresponding viewing keys. Consistency across both states is enforced by ZKPs.
Public accounts are stored on-chain as a visible map from IDs to account states, and their values are updated in place. Private accounts are never stored on-chain in raw form. Each update produces a new commitment that binds the current value while keeping it hidden. Previous commitments remain on-chain, but a nullifier set marks old versions as spent, ensuring that only the most recent private state can be used in execution.
LEZ aims to deliver full programmability in a hybrid public/private model, with the same flexibility and composability as public blockchains. Developers write and deploy programs in LEZ just as they would elsewhere. The protocol automatically supports executions that involve any combination of public and private accounts. From the program’s perspective, all accounts look the same, and privacy is enforced transparently. This lets developers focus on business logic while the system guarantees privacy and correctness.
To our knowledge, this design is unique to LEZ. Other privacy-focused programmable blockchains often require developers to explicitly handle private inputs inside their app logic. In LEZ, privacy is protocol-level: programs do not change, accounts are treated uniformly, and private execution works out of the box.
-
Token creation (public execution)
- Alice submits a transaction that executes the token program
Newfunction on-chain. - A new public token definition account is created.
- The minted tokens are recorded on-chain in Alice’s public account.
- Alice submits a transaction that executes the token program
-
Transfer from public to private (local / privacy-preserving execution)
- Alice runs the token program
Transferfunction locally, sending to Bob’s private account. - A ZKP of correct execution is generated.
- The proof is submitted to the blockchain and verified by validators.
- Alice’s public balance is updated on-chain.
- Bob’s private balance remains hidden, while the transfer is provably correct.
- Alice runs the token program
-
Transferring private to public (local / privacy-preserving execution)
- Bob executes the token program
Transferfunction locally, sending to Charlie’s public account. - A ZKP of correct execution is generated.
- Bob’s private balance stays hidden.
- Charlie’s public account is updated on-chain.
- Bob executes the token program
-
Transfer from public to public (public execution)
- Alice submits an on-chain transaction to run
Transfer, sending to Charlie’s public account. - Execution is handled fully on-chain without ZKPs.
- Alice’s and Charlie’s public balances are updated.
- Alice submits an on-chain transaction to run
- The same token program is used in every execution.
- The only difference is execution mode: public execution updates visible state on-chain, while private execution relies on ZKPs.
- Validators verify proofs only for privacy-preserving transactions, keeping processing efficient.
To achieve both state separation and full programmability, LEZ uses a stateless program model. Programs hold no internal state. All persistent data is stored in accounts passed explicitly into each execution. This enables precise access control and visibility while preserving composability across public and private states.
LEZ supports two execution types:
- Public execution runs transparently on-chain.
- Private execution runs off-chain and is verified on-chain with ZKPs.
Both public and private executions use the same Risc0 VM bytecode. Public transactions are executed directly on-chain like any standard RISC-V VM call, without proof generation. Private transactions are executed locally by users, who generate Risc0 proofs that validators verify instead of re-executing the program.
This design keeps public transactions as fast as any RISC-V–based VM and makes private transactions efficient for validators. It also supports parallel execution similar to Solana, improving throughput. The main computational cost for privacy-preserving transactions is on the user side, where ZK proofs are generated.
- On Linux Ubuntu / Debian
apt install build-essential clang libclang-dev libssl-dev pkg-config- On Fedora
sudo dnf install clang clang-devel openssl-devel pkgconf- On Mac
xcode-select --install
brew install pkg-config opensslcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shcurl -L https://risczero.com/install | bashrzup installThe LEZ repository includes both unit and integration test suites.
# RISC0_DEV_MODE=1 is used to skip proof generation and reduce test runtime overhead
RISC0_DEV_MODE=1 cargo test --releaseexport NSSA_WALLET_HOME_DIR=$(pwd)/integration_tests/configs/debug/wallet/
cd integration_tests
# RISC0_DEV_MODE=1 skips proof generation; RUST_LOG=info enables runtime logs
RUST_LOG=info RISC0_DEV_MODE=1 cargo run $(pwd)/configs/debug allThe sequencer and node can be run locally:
-
On one terminal go to the
logos-blockchain/logos-blockchainrepo and run a local logos blockchain node:git checkout master; git pullcargo cleanrm ~/.logos-blockchain-circuits./scripts/setup-logos-blockchain-circuits.shcargo build --all-features./target/debug/logos-blockchain-node nodes/node/config-one-node.yaml
-
On another terminal go to the
logos-blockchain/lssarepo and run indexer service:git checkout schouhy/full-bedrock-integrationRUST_LOG=info cargo run --release -p indexer_service $(pwd)/integration_tests/configs/indexer/indexer_config.json
-
On another terminal go to the
logos-blockchain/lssarepo and run the sequencer:git checkout schouhy/full-bedrock-integrationRUST_LOG=info RISC0_DEV_MODE=1 cargo run --release -p sequencer_runner sequencer_runner/configs/debug