trusset-kyc-zk-proofs) reads a batch of KYC records on your own machine and writes, per subject:
- a
kycHash, one 32-byte Rescue-Prime Merkle root that you can publish on chain or anywhere else public, - a bundle of zk-STARK proofs backing that root, one per proved field,
- a manifest signed with your ed25519 key that records who asserted what, under which rule, on what evidence, and for how long.
Who it is for
The two questions a bundle answers
The verifier keeps two questions apart on purpose, because they have different answers over time.
A bundle whose claims were later declared void still verifies. The proof is a true record of what the operator asserted; the second question is where the voidance shows. Verification covers both in detail.
On chain and off chain
The chain carries the root. Everything else is verified off chain against that root: a verifier reads thekycHash from the chain, then checks the bundle’s signature, STARKs and Merkle tree with --root. No STARK is verified on chain, and the tool itself never talks to a chain. Which root was published at which block is something the operator records in a signed local registry, so as-of questions can be answered offline years later.
What it is not
It has no chain access.--root is a hex string you supply. As-of checks resolve against config/registry/root_history.json, which you write with npm run anchor after publishing. An anchor that misstates the block is a signed misstatement by the operator, not something the tool can detect.
It is not a KYC data source. Records under input/ are trusted. Malformed input produces a quarantined row; false input produces a valid proof of a false statement.
It is not a service. It is a batch command line tool. There are no prebuilt binaries: npm install compiles about 130 Rust crates from a pinned Cargo.lock, which takes a few minutes the first time. The release gate ran on macOS under Rosetta 2; Linux and Windows are untested.
Two fields are not hidden by design. country and investorType are written in cleartext to the batch index CSV and to manifest.passthrough. The pipeline the tool was built for consumes them. Their proofs add integrity, not privacy. country is mandatory in every record; investorType is optional. Concepts explains the disclosure classes.
Primitives
Version 3.0.0. MIT license. Rust 1.91.0 pinned through
rust-toolchain.toml, Node.js 18 or newer.
Quickstart
Clone to first verified bundle, every step run against the real CLI
Concepts
Leaves, commitments, the root, and what a claim descriptor binds
Verification
Root-anchored versus key-pinned, and what neither proves
Security model
Threat model, key hierarchy, determinism, what lives on disk
In the repository
- README.md
- docs/ARCHITECTURE.md, the crate map and data flow
