RillCoin Whitepaper
Version 1.0 — Progressive Concentration Decay Cryptocurrency
Abstract
RillCoin is a proof-of-work cryptocurrency implementing progressive concentration decay. Holdings above concentration thresholds decay over time, with decayed tokens flowing back to the active mining pool. The protocol is implemented in Rust 2024 edition using Ed25519 signatures, BLAKE3 Merkle trees, SHA-256 block headers, and libp2p peer-to-peer networking. All consensus arithmetic uses integer-only fixed-point arithmetic with 108 precision — no floating point.
1. Introduction
“Wealth should flow like water.”
Concentrated wealth reduces economic velocity. When a large fraction of supply is held statically by a small number of entities, the tokens cease to participate in the productive economy. Traditional cryptocurrencies offer no mechanism to counteract this tendency — early holders and miners accumulate disproportionate balances that remain dormant indefinitely.
RillCoin's solution is algorithmic redistribution via concentration decay. When any cluster of UTXOs exceeds a configurable concentration threshold relative to the circulating supply, those holdings begin to decay at a rate determined by a sigmoid function of their concentration. Decayed tokens accrue to the active mining pool, supplementing block rewards and providing an ongoing incentive for miners to maintain the network.
The name “Rill” references a small, flowing stream — an apt metaphor for the protocol's design intent: wealth should circulate continuously rather than pool in reservoirs.
2. Protocol Constants
All constants are defined in rill-core/src/constants.rs. Integer-only arithmetic with u64 and 108 fixed-point precision (1 RILL = 100,000,000 rills, the base unit).
| Constant | Value | Notes |
|---|---|---|
MAX_SUPPLY | 21,000,000 RILL | Mining rewards only |
DEV_FUND_PREMINE | 1,050,000 RILL | 5% of max supply |
TOTAL_SUPPLY | 22,050,000 RILL | MAX_SUPPLY + DEV_FUND |
INITIAL_REWARD | 50 RILL | Per block at genesis |
HALVING_INTERVAL | 210,000 blocks | ~4 years at 60s blocks |
BLOCK_TIME_SECS | 60 | Target seconds per block |
BLOCKS_PER_YEAR | 525,960 | 365.25 × 24 × 60 |
COIN | 100,000,000 rills | 1 RILL in base units |
DEV_FUND_BPS | 500 (5%) | Basis points of block reward |
DEV_VEST_BLOCKS | 2,103,840 | BLOCKS_PER_YEAR × 4 |
COINBASE_MATURITY | 100 blocks | Before coinbase can be spent |
MIN_TX_FEE | 1,000 rills | 0.00001 RILL minimum |
MAX_BLOCK_SIZE | 1,048,576 bytes | 1 MiB |
DIFFICULTY_WINDOW | 60 blocks | Difficulty adjustment window |
Dev Fund
The dev fund premine of 1,050,000 RILL (5% of MAX_SUPPLY) is subject to linear vesting over 2,103,840 blocks (~4 years). At each block, a pro-rata portion of the dev fund becomes claimable by the development treasury address. This ensures long-term alignment between developers and the network.
3. Cryptography
Signatures — Ed25519
All transaction inputs are authorized with Ed25519 signatures (RFC 8032). Ed25519 provides 128-bit security, deterministic signatures, and fast batch verification — all desirable properties for a high-throughput blockchain. The public key is 32 bytes; the signature is 64 bytes.
Merkle Trees — BLAKE3
Block Merkle roots are computed using BLAKE3. BLAKE3's tree hashing mode makes it particularly well-suited for Merkle tree construction, providing both speed and parallel verification. Transaction IDs are computed as BLAKE3(bincode(transaction)).
Block Headers — SHA-256
Block headers use double SHA-256 for the proof-of-work commitment, maintaining compatibility with existing SHA-256 ASIC infrastructure. The header commits to: version, previous block hash, Merkle root, timestamp, difficulty target, and nonce.
Address Format — Bech32m
Addresses use Bech32m encoding (BIP-350) with human-readable parts:
rill1— Mainnet addressestrill1— Testnet addresses
The address payload is the BLAKE3 hash of the Ed25519 public key, truncated to 20 bytes. Bech32m provides built-in error detection and produces human-readable, copy-paste-friendly strings.
4. Concentration Decay
See the Decay Mechanics reference page for full technical detail, including the sigmoid lookup table, fixed-point arithmetic, and lineage tracking. The following is a summary.
Concentration Metric
Concentration is measured in parts-per-billion (PPB). For a cluster with balance B and circulating supply S:
concentration_ppb = cluster_balance × 1,000,000,000 / circulating_supplyDecay Rate
The decay rate is derived from a fixed-point sigmoid function of the concentration:
decay_rate = (sigmoid(concentration_x) - 0.5) × DECAY_R_MAX_PPB × 2
where:
DECAY_R_MAX_PPB = 1,500,000,000 (150% per year at max concentration)
DECAY_C_THRESHOLD_PPB = 1,000,000 (0.1% of supply — decay threshold)
CONCENTRATION_PRECISION = 1,000,000,000Decay Pool
Decayed amounts accumulate in the decay pool. Each block, DECAY_POOL_RELEASE_BPS = 100 (1%) of the pool is released to the block miner as supplemental reward. This creates a compounding incentive: as concentration grows, decay rates rise, increasing pool size, and increasing miner rewards.
5. Mining
RillCoin uses SHA-256 proof-of-work. Difficulty adjusts every DIFFICULTY_WINDOW (60) blocks to maintain the 60-second target. The difficulty adjustment uses a clamped ratio of actual vs. expected time, preventing extreme swings.
Block templates are served via getblocktemplate RPC. Miners compute a valid header hash below the target and submit via submitblock. The block reward is:
block_reward = subsidy(height) + tx_fees + decay_pool_release
where subsidy(height) = INITIAL_REWARD >> (height / HALVING_INTERVAL)Coinbase outputs are subject to a maturity period of COINBASE_MATURITY = 100 blocks before they can be spent.
6. Network
RillCoin uses libp2p for all peer-to-peer communication. The network stack provides:
- Gossipsub — Block and transaction propagation
- Kademlia DHT — Peer discovery and routing
- TCP transport — Reliable message delivery
| Network | P2P Port | RPC Port | Magic Bytes |
|---|---|---|---|
| Mainnet | 18333 | 18332 | RILL |
| Testnet | 28333 | 28332 | TEST |
| Regtest | 38333 | 38332 | REGT |
7. Storage
Node storage uses RocksDB, a high-performance LSM tree key-value store. The following column families are maintained:
blocks— Full block data indexed by hashheaders— Block headers indexed by hash and heightutxos— Unspent transaction output setclusters— Cluster balance aggregates for decay calculationdecay_pool— Running decay pool balancemempool— Pending transactions (in-memory, not persisted)
The wire protocol uses bincode for compact, deterministic serialization of all on-chain data structures. Bincode is not human-readable but provides minimal overhead for performance-sensitive consensus paths.