Start here/Get started

Get started

Run a node, create a wallet, send a shielded payment. Roughly fifteen minutes, no build toolchain, no cryptography to implement.

Block rate1 / s~1s confirmation
Privacymandatoryno transparent outputs
Decimals810⁸ sompi = 1 ZKAS
Spendable after~10 minanchor maturity
Coinbase maturity100blocks

What ZKas is

Chain
fork of rusty-kaspa (kaspad v2.0.1 lineage), GHOSTDAG BlockDAG
Block rate
1 BPS (target_time_per_block = 1000 ms), ~1s confirmation
Proof of work
kHeavyHash, byte-identical to Kaspa mainnet — unmodified ASICs work with zero configuration
Privacy
shielded-by-default. Value lives in an Orchard (Halo 2) pool; the coinbase reward is minted directly as a shielded note. There is no transparent output type on mainnet
Units
1 ZKAS = 100,000,000 sompi (8 decimals)
Addresses
bech32, HRP zkas: · zkastest: · zkasdev: · zkassim:
Network id
zkas-mainnet (wire and datadir identity)
Merged mining
with Kaspa via aux-PoW, active from genesis. Optional — native mining always works
Coinbase maturity
100 blocks (~100 s)
Shielded spendable
600 blocks (~10 min) — a note is spendable once its anchor matures
Mining is unaffected by the shielded layer. You still hash plain block headers. Nothing about Orchard touches the miner — see Mining & pools.

Four constraints that invalidate most feature ideas

  1. No virtual machineNo contracts, no shared mutable state, no scripts on notes. An AMM, order book, perpetual or lending pool cannot exist on the base chain.
  2. Single assetA note carries one NoteValue: u64 with no asset id. A stablecoin or any second asset requires a circuit fork.
  3. No ZIP-32 accountsOne seed → one full viewing key → one incoming viewing key. Scoped or revocable disclosure means using a separate seed.
  4. Nullifiers are a MuHash accumulatorNo non-membership proof exists, so uniqueness registries and anti-double-pledge semantics cannot be enforced on-chain.

The Limits page lists what is unbuilt, what is structurally impossible, and what can be done beside the chain instead.

Networks and ports

NetworkgRPCP2PwRPC borsh / jsonSeeder
mainnet16810listen 16811 · dial 1611117810 / 18810seed.zkas.info
testnet-10168201682117820 / 18820none — standalone
simnet / devnet16850 / 1686016851 / 16861—none
Why mainnet splits dial and listen. 16111 is also Kaspa's mainnet P2P port, so a ZKas node listens on and advertises 16811 while still dialing 16111, where the seeders live. A ZKas node therefore coexists with a Kaspa parent on one host out of the box. Details in Run a node.

Run a mainnet node

kaspad --appdir=./zkas-node \
  --rpclisten=127.0.0.1:16810 \
  --listen=0.0.0.0:16811 \
  --utxoindex

That is a pruned node and it is what most people should run. Whether you also need --shielded-history=on or --archival depends entirely on how old the coins you must see are — pick your node mode.

Send your first payment

  1. Start the wallet daemonIt scans, proves and broadcasts. Point it at your node.
    zkas-walletd --network mainnet \
      --rpc-server 127.0.0.1:16810 \
      --listen 127.0.0.1:8501 \
      --wallet-dir ./wallets --allow-default-token
  2. Create a walletThe seed is returned once. Store it like any private key.
    curl -s -X POST localhost:8501/api/wallet/create \
      -H 'content-type: application/json' -d '{"birthday":0}'
  3. Wait for spendability, not just syncPoll spend_ready. A freshly received note needs ~10 minutes before it can be spent, because spends prove against a matured anchor.
    curl -s localhost:8501/api/status | jq '{synced,spend_ready,blocks_behind}'
  4. SendThe memo is encrypted and readable only by the recipient — up to 512 bytes.
    curl -s -X POST localhost:8501/api/wallet/send \
      -H 'content-type: application/json' \
      -d '{"to":"zkas:...","amount_fc":1.0,"memo":"hello"}'
Read txids, not txid. A large send is split across several standard-size transactions, because one shielded transaction can spend at most 38 notes. See notes, not coins.

Try it on testnet-10 first

testnet-10 mirrors mainnet's full feature set — shielded coinbase, Toccata, multi-producer anchors, dev fee, 1-BPS emission — but keeps an easy-PoW genesis so a CPU can bootstrap it. It has no public seeder, so run it standalone.

# node
kaspad --testnet --utxoindex --enable-unsynced-mining

# miner: native kHeavyHash, all cores
zkas-miner -s 127.0.0.1:16820 -a <your zkastest: address> -t 0

# join a peer manually (no seeder on testnet)
kaspad --testnet --addpeer=<ip>:16821

Get a zkastest: address from a --network testnet walletd. Everything else behaves as mainnet does.

Verified against zkas-rusty at zkas-v1.0.9. Byte layouts, endpoint shapes and parameters are read from source; figures marked measured come from the live mainnet node. If this page contradicts the code, the code is right — report it.