Private-by-default money at Kaspa speed. A fork of rusty-kaspa where every balance and transfer is shielded by default (Zcash Orchard notes, Halo 2 proofs, no trusted setup), keeping Kaspa's BlockDAG confirmation and kHeavyHash proof-of-work.
This repo is the core node and tooling: the node, the miner, the wallet daemon, the explorer API.
| ZKas | Kaspa | |
|---|---|---|
| Privacy | Shielded by default (Orchard) | Transparent |
| Consensus | GHOSTDAG BlockDAG, ~1 block/s | 10 blocks/s |
| PoW | kHeavyHash (byte-identical to Kaspa) | kHeavyHash |
| Merged mining | Yes — AuxPoW dual-acceptance with Kaspa | — |
| Emission | 60 ZKAS start, 3-month halving, two-step perpetual tail (6 → 0.6 ZKAS/block) | fixed cap |
- Shielded state: coinbase rewards and transfers enter a mandatory Orchard pool; the only public quantity is the fee a spender exposes to the miner. A shielded state root (anchor + nullifier accumulator + turnstile) is committed in the coinbase.
- Merged mining (Option-2 dual acceptance): a block is valid if either its native
kHeavyHash clears the target or it carries an
AuxPoWproof — a parent kHeavyHash block (e.g. a Kaspa block) whose coinbase commits to the ZKas block hash. Native mining stays the backbone; merged mining adds security at zero marginal cost to Kaspa miners. Seeconsensus/core/src/auxpow.rsandconsensus/pow/src/auxpow.rs. - Tokenomics: 60 ZKAS initial reward (at 1 BPS), halving every 3 months, settling on a two-step perpetual tail: 6 ZKAS/block from ~month 10 through month 24, then a permanent 0.6 ZKAS/block floor (~18.9M ZKAS/year, ~2.2% at onset decaying toward ~1%). No fixed supply cap.
- Mainnet is live (since late July 2026). The genesis is anchored to Bitcoin block
959,713 (
zkas-mainnet btc#959713in the genesis coinbase) — see the no-premine proof. Earlier public test chains were wound down before this genesis was cut; the anchored genesis is the final one and there is no planned reset. (This README carried a TESTNET banner until 2026-07-27, during the pre-launch test phase — if a copy you are reading still shows one, it is a stale snapshot; check this file onmain.) - No external audit yet. The novel piece — Orchard shielded state (nullifier set, note-commitment tree, turnstile supply invariant) kept consistent under GHOSTDAG's out-of-order block acceptance — is specified in the whitepaper and exercised by the consensus test suite, but has not had an independent security review. Treat the software accordingly, and if you break an invariant we want to hear about it.
- Custody: end-user wallets (web, desktop, mobile, paper) are non-custodial —
the seed stays on the user's device and a hosted daemon receives a viewing key only
(
docs/NON_CUSTODIAL_WALLET.md). Privacy: the desktop app, and the Android app in Run on this phone mode, embedzkas-walletdin-process, so no server holds even the viewing key; the node they sync from serves blocks and learns nothing about the wallet.zkas-walletd's custodial mode exists for operators (pools, payout services) that must sign server-side.
Binaries: Releases · to compile instead, see docs/BUILDING.md.
./kaspad --appdir=./zkas-node --rpclisten=127.0.0.1:16110 --utxoindexNo peer list is needed: the node resolves the mainnet seeder seed.zkas.info, dials every
address it returns on p2p port 16111, and discovers the rest of the network through
gossip. (--connect=<ip>:16111 pins it to specific peers instead and skips the seeder.)
Only outbound access to a peer's p2p 16111 is needed; keep the RPC on 16110 bound to
loopback. Shielded note history is fetched and verified automatically after the first sync.
Node types — pruned (default), archival, and shielded-history — and every flag are documented in docs/NODE.md. Which one you want depends on whether the node just validates/mines, serves wallets complete balances, or backs an explorer.
zkas-walletd is the shielded wallet daemon — REST, token-scoped, and what the web and
mobile wallets talk to. It holds viewing keys only unless you tell it otherwise.
./zkas-walletd --network mainnet --rpc-server 127.0.0.1:16810 --listen 127.0.0.1:8501docs/WALLETD.md is the full guide: endpoints, sizing, tuning, and integration playbooks for exchanges and mining pools. Read §0 first — payments are sized in notes, not coins, and that one fact explains most of the surprises.
Non-custodial signing (the seed never leaves the device): docs/NON_CUSTODIAL_WALLET.md.
- Pool (ASICs): point your miner at mining-pool.zkas.info. No node needed.
- Solo: with a synced node, mine to your
zkas:address:./zkas-miner -s 127.0.0.1:16810 -a zkas:<your-address> -t 4
| Crate | Binary | Role |
|---|---|---|
kaspad |
kaspad |
the node (gRPC :16810, p2p :16111) |
miner |
zkas-miner |
CPU miner (native + --merged AuxPoW) |
zkas-walletd |
zkas-walletd |
shielded wallet daemon |
zkas-api |
zkas-api |
explorer REST backend |
Companion repos: zkas-pool (stratum bridge), zkas-explorer, zkas-wallet, zkas-website.
| docs/BUILDING.md | prerequisites, compiling, tests |
| docs/WALLETD.md | wallet daemon: API, tuning, exchange & pool integration |
| docs/NODE.md | running a node: pruned vs archival, shielded history, ports, flags, recovery |
| docs/CLI-WALLET.md | shielded-pay command-line wallet |
| docs/archival.md | archival nodes and history retention |
Explorer: https://explorer.zkas.info
merged_mining_activation and every tokenomics constant live in
consensus/core/src/config/params.rs. Genesis, address prefixes (zkas: / zkastest:)
and BPS are compiled in — changing them requires a rebuild and a fresh chain.
Inherits rusty-kaspa's ISC license. See LICENSE.