Native Groth16 BN254 verification primitives for the Xian stack
Project description
xian-tech-zk
Small native zero-knowledge verification and proving primitives for the Xian workspace.
Purpose
- This package exposes the narrow verifier surface used by the Xian runtime.
- It also now exposes the first external proving toolkit for the shielded-note-token development flow.
- It is still intentionally small. It is not a general-purpose zk framework.
Current Scope
- Groth16 verification
- BN254
- Python bindings for runtime integration
- A pure Rust verifier core for cargo-level testing and fixtures
- Shielded-note proving circuits and proof generation helpers
- Deterministic dev bundle generation for local shielded-note workflows
- Note math helpers for commitments, nullifiers, asset ids, and Merkle roots
API
- Python:
xian_zk.prepare_groth16_bn254_vk(vk_hex) -> PreparedGroth16Bn254Keyxian_zk.verify_groth16_bn254(vk_hex, proof_hex, public_inputs) -> boolxian_zk.verify_groth16_bn254_prepared(prepared_vk, proof_hex, public_inputs) -> boolxian_zk.ShieldedNoteProver.build_insecure_dev_bundle()xian_zk.ShieldedNoteProver.build_random_bundle(contract_name=..., vk_id_prefix=...)xian_zk.ShieldedNoteProver.prove_deposit(...)xian_zk.ShieldedNoteProver.prove_transfer(...)xian_zk.ShieldedNoteProver.prove_withdraw(...)xian_zk.ShieldedKeyBundle.generate()xian_zk.ShieldedKeyBundle.from_parts(owner_secret=..., viewing_private_key=...)xian_zk.ShieldedWallet.generate(asset_id)xian_zk.ShieldedWallet.from_parts(asset_id=..., owner_secret=..., viewing_private_key=...)xian_zk.ShieldedWallet.from_json(snapshot_json)xian_zk.ShieldedWallet.from_seed_json(seed_json)xian_zk.ShieldedWallet.sync_records(records) -> ShieldedWalletSyncResultxian_zk.ShieldedWallet.build_deposit(...)xian_zk.ShieldedWallet.build_transfer(...)xian_zk.ShieldedWallet.build_withdraw(...)xian_zk.ShieldedViewingKeyBundle.generate()xian_zk.owner_public(owner_secret) -> strxian_zk.output_commitment(asset_id, owner_public, amount, rho, blind) -> strxian_zk.generate_field_hex() -> strxian_zk.generate_owner_secret() -> strxian_zk.encrypt_note_message(...) -> strxian_zk.decrypt_note_message(...) -> ShieldedNoteMessagexian_zk.recover_encrypted_notes(...) -> list[ShieldedDiscoveredNote]xian_zk.recover_viewable_notes(...) -> list[ShieldedViewableNote]xian_zk.shielded_registry_manifest(bundle) -> dictxian_zk.asset_id_for_contract(contract_name) -> strxian_zk.merkle_root(commitments) -> strxian_zk.tree_state(commitments) -> ShieldedTreeStatexian_zk.scan_notes(asset_id=..., commitments=..., notes=...)- CLI:
uv run xian-zk-shielded-bundle --output-dir ...
- Rust:
prepare_groth16_bn254_vk(...)verify_groth16_bn254(...)verify_groth16_bn254_prepared(...)build_demo_vector()build_shielded_note_fixture()build_insecure_dev_shielded_note_bundle()prove_shielded_deposit(...)prove_shielded_transfer(...)prove_shielded_withdraw(...)
Encoding
- Verifying keys: compressed canonical bytes as
0x-prefixed hex - Proofs: compressed canonical bytes as
0x-prefixed hex - Public inputs: 32-byte big-endian field elements as
0x-prefixed hex
Validation
cargo test --manifest-path packages/xian-zk/Cargo.toml --no-default-featurescargo run --manifest-path packages/xian-zk/Cargo.toml --no-default-features --example generate_test_vectorcargo run --manifest-path packages/xian-zk/Cargo.toml --no-default-features --example generate_shielded_note_fixturecd packages/xian-zk && uv sync --group dev && uv run maturin develop && uv run pytest -qcd packages/xian-zk && uv run pytest -q -m slow
Notes
- The runtime-facing verifier surface is still intentionally narrow.
- The shielded-note proving helpers are the first external proving toolkit slice, not a broad proving framework.
- The shielded-note circuits now use Merkle auth paths instead of witnessing
the whole leaf set, and the shipped dev bundle / fixture ids are
v2. - Shielded outputs are now addressed to
owner_public, not to the recipient's spending secret. That lets senders create recipient outputs without learning the recipient's private shielded spend key. - The Python toolkit now separates spending and viewing authority. A wallet can disclose note contents by sharing only a viewing key or by adding explicit extra viewers to an encrypted note payload without exposing the spend key.
- The Python toolkit now also ships a first-class
ShieldedWalletabstraction for seed backup, state snapshots, record sync, note selection, and request planning for deposit / transfer / withdraw flows. - The package now also ships a deployment CLI that generates a random
shielded-note proving bundle plus a public registry manifest. Keep the
bundle private; only the manifest should be used for
zk_registryregistration. - The encrypted payload format now supports owner delivery plus optional disclosed viewers inside a single on-chain payload blob.
- Exact withdraws no longer need a forced change note. A withdraw can spend a note set down to zero shielded outputs when value conservation closes exactly.
- The proving requests separate
old_rootfromappend_state, which lets a client prove against a recent accepted root while still projecting the canonical post-state from the current append frontier. - Python
pytestnow excludes the slow proof-generation tests by default. Runpytest -m slowexplicitly when you want the proving-toolkit path. - The contract runtime prefers registry-backed verification by
vk_id; this package exposes the lower-level raw and prepared-key verifier primitives that runtime builds on. ShieldedNoteProver.build_insecure_dev_bundle()is for local development and tests only. Its deterministic setup seed exposes toxic waste and must never be used for a real network.ShieldedNoteProver.build_random_bundle(...)andxian-zk-shielded-bundlegenerate a single-party random trusted setup. That is appropriate for deployment tooling, but it is still not an MPC ceremony.- Proof generation uses real randomness even when the proving bundle is a deterministic dev bundle.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
xian_tech_zk-0.1.3.tar.gz
(50.8 kB
view details)
File details
Details for the file xian_tech_zk-0.1.3.tar.gz.
File metadata
- Download URL: xian_tech_zk-0.1.3.tar.gz
- Upload date:
- Size: 50.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
508d98b29abb8aaab54b118837330a2b7bb55310809160eb6e59814aec006578
|
|
| MD5 |
77c53869b9d1f24c7040ce666b8504d5
|
|
| BLAKE2b-256 |
66958852033a9fed6a6a100a197e38d51d92d420cc30dff98d6bc7e0b80a45ca
|
Provenance
The following attestation bundles were made for xian_tech_zk-0.1.3.tar.gz:
Publisher:
release.yml on xian-technology/xian-contracting
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
xian_tech_zk-0.1.3.tar.gz -
Subject digest:
508d98b29abb8aaab54b118837330a2b7bb55310809160eb6e59814aec006578 - Sigstore transparency entry: 1240334103
- Sigstore integration time:
-
Permalink:
xian-technology/xian-contracting@84ce8c67aa6e6978905bc7a7b7f492f30b54d0be -
Branch / Tag:
refs/tags/zk-v0.1.3 - Owner: https://github.com/xian-technology
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@84ce8c67aa6e6978905bc7a7b7f492f30b54d0be -
Trigger Event:
push
-
Statement type: