Performance
Results of one-hour constant-rate load tests against a three-validator testnet. They describe this hardware and setup, not a protocol limit.
Setup
| Validators | 3, each a VM: 8 vCPU (Intel Core i5-14400F, host-passthrough), 10–12 GB RAM, NVMe-backed disk |
| Load | bkc-loadgen (in bkc-chain/bench): 600 accounts, ML-DSA-signed MsgSend, ~5.5 KB each, constant rate |
| Config | timeout_commit 0.5 s, timeout_propose 3 s, mempool 10,000 |
| Measured | committed tx/s, block interval, submit-to-commit latency, consensus rounds |
Results
| Offered | Committed (avg) | Peak (60 s window) | Latency p50 | Latency p99 | Committed ≤ 2 s | Rejected |
|---|---|---|---|---|---|---|
| 70 tx/s | 70.0 tx/s | 73.3 tx/s | 0.92 s | 2.2 s | 98.6% | 0 |
| 100 tx/s | 100.0 tx/s | 133.8 tx/s | 1.04 s | 9.0 s | 95.5% | 0 |
| 110 tx/s | 110.0 tx/s | 161.8 tx/s | 1.11 s | 23.1 s | — | 0 |
Every run committed 100% of submitted transactions with no consensus errors. Blocks average ~1 s; at 100–110 tx/s a few blocks per hour fill to the 500-transaction cap and take 10–25 s (see below), which is what the p99 reflects. Peaks above the offered rate are the chain draining the mempool after such a block.
What limits it
- Single-core CPU speed. The same 70 tx/s load on a Xeon Silver 4210 ran at p99 23.4 s and saturated near 61 tx/s at an offered 100 tx/s; on the i5-14400F (≈3× faster per core) it runs at p99 2.2 s.
- Full blocks and
timeout_propose. When a backlog builds, the next block fills to 500 transactions; if building it takes longer thantimeout_propose(3 s), consensus moves to another round and the block lands 10–25 s late. Raisingtimeout_proposeshortens these stalls. - Anything else on the validator's CPU. Public RPC traffic on a validator, or other workloads on the same physical host, measurably increased stalls. Serve RPC from a full node.
- Database size. Runs on a fresh database stalled less than the same load on a database tens of GB large.
- Hard ceiling per block:
block.max_gas / declared gas= 500 signed sends per block.
Storage
| Load | Validator, indexer off | Full node, kv indexer |
|---|---|---|
| 70 tx/s | ~2.5 GB/h | ~9.4 GB/h |
| 100 tx/s | ~4 GB/h | ~13 GB/h |
Reproducing
bash
cd bkc-chain
go build -o bkc-loadgen ./cmd/bkc-loadgen
./bkc-loadgen --node http://localhost:26657 --chain-id bkc-testnet --home ~/.BKC --keyring-backend test \
--funder-key <funded-key> --accounts 600 --txs-per-account 430 --mix bank=100 \
--gas 400000 --gas-prices 5000000bkc --rate 70 --duration 3600s --warmup 60s --drain 120s \
--workers 128 --tx-latency --out ./bench-70tps--rate-profile 100:5m,150:5m,200:5m steps the rate within one run.
