SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE · SOVEREIGN · NON-LINKABLE ·
Keller Systems · Citadel

SybilGuard

Sovereign zero-knowledge proof-of-personhood. Proves unique human individuality across governance and voting protocols without disclosing biometrics, persistent identifiers, or actions that link across scopes.

NULLIFIER
DERIVED
IN CIRCUIT
Document
Sovereign proof-of-personhood
Holder
An identity secret, held by the person and by nobody else
Scope
governance-vote-42
Revealed
Nullifier and scope identifier. Nothing else.
Validity
One action per scope, enforced by arithmetic rather than a registry
Licence
AGPL-3.0
SYB<BN254<GROTH16<<MERKLE20<<R1CS4800 NULLIFIER<POSEIDON(IDENTITYSECRET,SCOPEID<<COMMIT<POSEIDON(IDENTITYSECRET,SALT) ENCLAVE<ECDSA-P256<SECUREENCLAVE|STRONGBOX<<WORKSPACE<11-CRATE<<SCOPE-BOUND

01 — the mechanismDeterministic scope nullifiers

In a pseudonymous network one actor can spin up ten thousand addresses, and no amount of rate limiting distinguishes them from ten thousand people. SybilGuard makes the distinction inside the circuit, where it cannot be inspected or forged.

A person's secret is fixed, but the identifier they present is derived per scope. In a governance vote the nullifier is a function of the scope and nothing else, so a second ballot from the same person produces the identical nullifier and is rejected as a double action.

Across two different scopes the nullifiers share no value, so the two actions cannot be joined up. Voting in one protocol does not reveal that you voted in another.

The prover shows membership in the verified personhood Merkle tree. The verifier learns the nullifier and the scope identifier — a claim of uniqueness, and nothing about who made it.

// derived inside the circuit, not by the application
Nullifier  = Poseidon(IdentitySecret, ScopeIdentifier)
Commitment = Poseidon(IdentitySecret, Salt)

// what the verifier receives
    public
= [ Nullifier, ScopeIdentifier ] // second action: same nullifier, rejected

02 — the circuitsThree components on BN254

Verified in sub-second execution on mobile devices, and directly on EVM chains through Groth16 pairing precompiles.

CircuitWhat it enforces
merkle_proof.circomA twenty-level binary Poseidon Merkle tree inclusion check, approximately 4,800 R1CS constraints.
nullifier_derivation.circomScope-bound derivation, which is what prevents correlation across applications.
enclave_attestation.circomVerifies an Apple Secure Enclave or Android StrongBox ECDSA P-256 signature chain.

03 — the workspaceThe eleven-crate Citadel

Proving, double-spend prevention, graph analysis and identity resolution, as separate crates rather than one program.

CrateWhat it does
crates/zkArkworks Groth16 prover and verification keys.
crates/nullifierDouble-spend prevention and Bloom filter registries.
crates/graphModified SybilRank random walk with spectral clustering.
crates/wotWeb-of-trust recursive vouching protocols.
sybilguard-cliProof generation from a scope on the command line.
# the whole workspace, then a proof for one scope
git clone https://github.com/KELLERBABG/SybilGuard.git
cd SybilGuard && cargo test --workspace
cargo run --bin sybilguard-cli -- generate-proof --scope governance-vote-42
SybilGuard · AGPL-3.0 · Keller Systems repository  /  kellersystems.dev