Networks and endpoints
NULL runs one public network, mainnet, and a separate test network for development. This page lists the parameters that matter to node operators and integrators, the default ports and data directories, and the public services built around the chain.
Every command that takes --network accepts main or test and defaults to
main. There is no separate regtest network: the test network already mines
in seconds on one machine and is meant for local development.
Mainnet
Mainnet is live. Release v0.1.8 is current; see Network upgrades for how rule changes are scheduled.
| Parameter | Value |
|---|---|
| Name and ticker | Null network, NULL |
| Smallest unit | 1 NULL = 100,000,000 units |
| Address prefix | null1 (bech32m) |
| Viewing key prefix | nullview1 |
| Proof of work | Equihash (144, 5), about 1.8 GB of memory per solver thread |
| Target block interval | 120 seconds |
| Difficulty adjustment | LWMA over the last 60 blocks |
| Coinbase maturity | 100 blocks (about 3 hours 20 minutes) |
| Maximum reorganization depth | 200 blocks |
| Maximum future timestamp drift | 2 hours |
| Anchor maximum age | 100 blocks |
| Maximum transactions per block | 512 |
| Genesis branch id | 0x4d41494e |
| Scheduled upgrades | none |
| Genesis hash | a47d659978361de625cfb4d84641b4f2de6f69ef04338e52612e5f8d95853c92 |
| P2P port | 19000 |
| Seed nodes | seed1.nullnet.sh to seed5.nullnet.sh, port 19000 |
A coinbase reward mined at height h becomes spendable at height h + 100. Wallets only see a reward once it matures. Seed hostnames are resolved each time they are dialed, so a node needs no configuration to find the network.
Emission
| Parameter | Value |
|---|---|
| Maximum supply | 21,000,000 NULL |
| Premine | 630,000 NULL (3% of maximum supply), paid by the genesis block to the development fund |
| Initial block subsidy | 9.7 NULL |
| Halving interval | 1,050,000 blocks (about 4 years at 120-second blocks) |
The development fund address is null1z0z9psxvllg396329fcj546gt3dya32zjcxf3w3gg78x2lgffxhgz2snzw6wuwzk930pzv4cvfn. Its key is held offline.
Fees
There is no fee field. The fee is fixed by the number of actions in a transaction: 10,000 units per action. Transactions are padded to 2, 4, 8 or 16 actions, so the fee is 20,000, 40,000, 80,000 or 160,000 units. A wallet spending many small notes moves into a larger action class and pays more; consolidating inputs avoids that.
Confirmations
The network refuses reorganizations deeper than 200 blocks, so 200 confirmations is safe against anything the network will accept. Ten confirmations, about twenty minutes, is a reasonable threshold for ordinary deposits. Exchanges should read the exchange guide and pools the pool guide for crediting and payout rules.
Test network
The test network uses a tiny proof of work and short blocks so a single machine can mine, pay and confirm in seconds.
| Parameter | Value |
|---|---|
| Network name | test |
| Address prefix | tnull1 |
| Viewing key prefix | tnullview1 |
| Proof of work | Equihash (48, 5) |
| Target block interval | 5 seconds |
| Difficulty adjustment | over the last 6 blocks |
| Coinbase maturity | 10 blocks |
| Genesis branch id | 0x54455354 |
| Seed nodes | none |
The test network has no public seeds: pass --connect or --seed to reach another node. Its premine pays the account 0 key of the all-zero seed phrase, which is published, so anyone can fund a test wallet from it. Test network transactions are never valid on mainnet, because the two networks sign under different branch ids.
Default ports
All local services bind to 127.0.0.1 by default. Only the peer port is meant to be reachable from the internet.
| Service | Default | Flag |
|---|---|---|
| Peer-to-peer | 19000, only when listening | nulld run --listen |
| Control socket | 127.0.0.1:18444 | nulld run --rpc |
| Node JSON-RPC over HTTP | off | nulld run --rpc-http, conventionally 127.0.0.1:18446 |
| Prometheus metrics | off | nulld run --metrics, for example 127.0.0.1:9100 |
| Wallet daemon JSON-RPC | 127.0.0.1:18447 | null-wallet-rpc --listen |
| Desktop wallet combined RPC | 127.0.0.1:18448 | null-desktop --rpc |
A node without --listen connects out only. To accept peers, see Run a node.
Data directories
nulld, null-wallet-rpc and the desktop wallet share one per-user data directory when no path flags are given.
| OS | Data directory |
|---|---|
| Linux | $XDG_DATA_HOME/null, else ~/.local/share/null |
| macOS | ~/Library/Application Support/Null |
| Windows | %LOCALAPPDATA%\Null, else %APPDATA%\Null |
Inside it, each network has its own directory, main/ or test/:
| Path | Contents |
|---|---|
<network>/chain/chain.redb | the node's chain database |
<network>/chain/rpc.token | the node's control and JSON-RPC token |
<network>/chain/peers.dat | the address book of verified peers |
<network>/wallet.redb | the default wallet |
null.conf | desktop wallet settings |
Only one process can open a database at a time, so stop the desktop wallet before running nulld run on the same chain, and the other way around. On Unix, new directories are created owner-only (0700) and token files 0600.
Public services
| Service | URL |
|---|---|
| Releases | github.com/NullNetProtocol/null-chain/releases |
| Block explorer | explorer.nullnet.sh |
| Explorer API | https://explorer.nullnet.sh/v1, see Explorer API |
| Disposable mail | mail.nullnet.sh |
| Mail API | https://mail.nullnet.sh/v1, see Mail API |
| Encrypted paste | paste.nullnet.sh |
| Paste API | https://paste.nullnet.sh/api, see Paste API |
| Website | nullnet.sh |
The explorer API reports the height it has indexed and the state of its node, which is a quick way to compare your own node's tip with the network:
Request
curl -s https://explorer.nullnet.sh/v1/status
Response
{
"network": "main",
"indexed_height": 6206,
"indexed_hash": "00000fc8d37f816b43e79acbaba7d736adbbcbfdca48182361e0dd943a456273",
"node_height": 6206,
"node_syncing": false,
"node_connections": 43,
"last_pass_at": 1793000988
}