Sender anonymity
Each spend proves the real input is one of the full set of mature outputs under a published Merkle root — not a wallet-chosen ring of decoys. Wallets do not sample mixins.
Private cash · Layer 1
Kohl is a pure value-transfer chain. Privacy is mandatory at the protocol: no transparent balances, no smart contracts, no EVM. Value moves only as confidential outputs under full-chain membership spends.
Three pillars
Every transfer is self-authenticating. There is no account balance, no nonce, and no signed origin for user payments. The membership proof is the authorization.
Each spend proves the real input is one of the full set of mature outputs under a published Merkle root — not a wallet-chosen ring of decoys. Wallets do not sample mixins.
Dual-key CryptoNote stealth addresses. Senders derive one-time destinations; only the view key can detect payment, only the spend key can unlock it. View tags keep wallet scanning fast.
Amounts live inside Pedersen commitments. A public fee anchors the balance equation; aggregated Bulletproofs prove every output amount is in range — no overflow minting.
Design choices
Wallet Runtime (pallet-ringct)
───── ──────────────────────
pick real output(s)
fetch membership root
+ leaf digests
build C' + FCMP proof
aggregated BP
stealth OTKs + masked amounts
unsigned extrinsic ────────► shape / root window / fee
verify_fcmp (host)
ΣC' == ΣC_out + fee·H
verify range proof (host)
insert key images
append outputs + tree
Tokenomics
Smooth decaying curve toward a long-run supply target, then a permanent tail reward so the security budget never hits zero.
Network privacy
On-chain privacy does not hide your IP. Kohl stems transactions before flooding them; operators should still route the node (and wallet RPC) over Tor for defence in depth.
Local transfers enter a stem path on /kohl/dandelion/1,
then fluff into ordinary gossip (~10% per hop, embargo fallback).
There is no --proxy-server flag. Use torsocks
and bind P2P to localhost so dial-out goes through SOCKS.
Tor hidden service → 127.0.0.1:30333, advertise
/onion3/… with --public-addr. Optional RPC onion for wallets.
torsocks ./target/release/kohl \
--chain kohl-ash --validator \
--listen-addr /ip4/127.0.0.1/tcp/30333 \
--rpc-port 9944 \
--network-backend libp2p \
--mining-seed <64-hex>
Prefer a remote full node you control. Third-party public RPC undoes much of your network privacy regardless of Tor.
Status
Privacy crypto, membership tree, FCMP spends, wallet builder, PoW node,
and Dandelion++ against polkadot-stable2606. Mainnet is a fair
launch when people choose to mine it — coordinate if you care about a
shared start.
--dev / kohl-ash / kohl)Get started
cargo build -p kohl-node --release
# One-time: node key + data dir
./scripts/setup-seed.sh
# Public seed — open TCP 30333; set your IP
PUBLIC_ADDR=/ip4/YOUR.PUBLIC.IP/tcp/30333 \
MINING_SEED=<64-hex> \
./scripts/run-seed.sh
# PeerId for bootnode string:
./target/release/kohl key inspect-node-key --file ./data/seed/node-key
# → /ip4/YOUR.PUBLIC.IP/tcp/30333/p2p/<PeerId>
# Optional: ship a chainspec with bootnodes embedded
./scripts/make-chainspec.sh --chain kohl \
--bootnode /ip4/YOUR.PUBLIC.IP/tcp/30333/p2p/<PeerId> \
--output chainspecs/kohl.json
BOOTNODE=/ip4/…/tcp/30333/p2p/… \
MINING_SEED=<64-hex> \
./scripts/run-miner.sh
# or: --chain ./chainspecs/kohl.json
Use --chain kohl (mainnet) or kohl-ash (testnet). Keep RPC on
localhost; miners only need P2P port 30333. Software is experimental.
Source under GPL-3.0. Read the code; run a node; decide for yourself.
github.com/iho/kohl