Before you start
Know what you are running.
Luracoin is educational alpha software. Testnet and devnet use known genesis credentials; mainnet is intentionally disabled. Treat every balance as disposable learning data.
The node, wallet, protocol, and cryptography have not received an independent security audit. Never use this stack to custody real assets.
What you need
uv is used for the locked development and release workflow, but a normal Python virtual environment is enough for the first local setup. Verify the interpreter explicitly: Python 3.13 and newer are not supported, even if your system names one of them python3.
01
Install the reference node
Clone the public reference repository, create an isolated environment, and install its development extras.
# From the current alpha source checkout
cd luracoin-python
# These examples use 3.12; Python 3.10 and 3.11 are also supported
python3.12 --version
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[dev]"
redis-cli ping
pytest -q
luracoin --helpmacOS · Redis
brew install redis
brew services start redis
redis-cli pingUbuntu / Debian · Redis
sudo apt update
sudo apt install -y redis-server
sudo systemctl enable --now redis-server
redis-cli pingRedis holds pending transactions and atomic sender-plus-nonce reservations. RocksDB and block files remain the source of truth for confirmed chain state.
02
Run a testnet node
Start the process in the foreground. It opens P2P on TCP 9999 and an authenticated wallet RPC on loopback port 18444.
luracoin node --network testnet --host 127.0.0.1 --port 9999 --rpc-port 18444| Service | Default | Exposure | Purpose |
|---|---|---|---|
| P2P v2 | 0.0.0.0:9999 by default | Guide overrides to loopback | Blocks, transactions, peers, sync |
| Wallet RPC v1 | 127.0.0.1:18444 | Loopback only | Private wallet and node operations |
| Explorer API | 127.0.0.1:18000 | Local by default | Separate read-only public-data API |
| Wallet web | 127.0.0.1:8080 | Loopback only | Optional local browser UI |
Expect an isolated node
No public seeds are configured. A fresh process can be initialized and healthy while connected to zero peers. To test networking, pass one or more peer endpoints you control:
luracoin node --network testnet --seed node-you-control.example:9999 --host 127.0.0.1 --port 9999 --rpc-port 18444The first-run commands bind P2P to loopback deliberately. This unaudited alpha has no peer authentication, durable peer scoring, or Sybil protection: do not expose it to the public Internet. Use an explicit LAN address only for a controlled-network experiment.
Inspect local state
luracoin get-info --network testnet
luracoin get-balance --network testnet <ADDRESS>
luracoin get-block --network testnet <HEIGHT>Chain data defaults to ~/.luracoin/testnet. Keep a separate directory for every network, and never try to open prototype v1 data as v2.
03
Install and open the wallet
The desktop alpha source is public, but signed installers are not available yet. These commands apply after the local node and Redis are available.
# From the current alpha source checkout
cd luracoin-wallet
npm ci
npm run electron:devThe node writes ~/.luracoin/testnet/rpc.token. Electron reads that file only in its main process and never exposes the bearer to the React renderer.
Create a wallet
- 1Choose “Create a new wallet”.
Set a local password of at least 12 characters and acknowledge that the recovery phrase is essential.
- 2Record all 24 words offline.
The phrase hides again after 60 seconds. Do not photograph it, paste it into chat, or store it in source control.
- 3Verify the requested words.
The wallet confirms selected positions before it creates the encrypted vault.
- 4Select testnet.
Mainnet is visible only as unavailable and cannot be initialized by the node.
Restore a wallet
Enter the 24 words, open the custom-passphrase option only if you used one, set a new local password, and confirm the derived address. The default BIP39 passphrase is LURA. A custom passphrase changes the derived wallet and is required for recovery.
The local password encrypts this device; it cannot recreate the wallet. There is no cloud backup, file export, or “reveal seed later” flow in the current UI.
Optional localhost browser mode
Stop the foreground node, build the Vite renderer, then restart the Python node so it serves the wallet alongside its restricted gateway:
# Stop any running node first, then build the wallet
cd luracoin-wallet
npm ci
npm run build
# Then serve it from the Python node repository
cd ../luracoin-python
source .venv/bin/activate
luracoin node --network testnet --host 127.0.0.1 --port 9999 --rpc-port 18444 --wallet-dir ../luracoin-wallet/dist --wallet-host 127.0.0.1 --wallet-port 8080Open http://127.0.0.1:8080. Never publish this port, place it behind a public proxy, or treat 0.0.0.0 as a browser URL.
04
Receive and send test LURA
A new wallet starts at zero and there is no public faucet. In an isolated setup, first mine to your testnet address; alternatively, receive test LURA from a peer you control.
Receive
- 1Open Receive.
Your one 34-character testnet address and QR code appear.
- 2Optionally set an amount and label.
The wallet can encode them into its supported
luracoin:payment URI. - 3Verify the address out of band.
Addresses use Base58Check, but visual verification still matters.
luracoin:<ADDRESS>?amount=1.5&label=CoffeeSend
- 1Paste an address or payment URI.
Enter LURA with up to eight decimals; use a dot as the decimal separator.
- 2Review before unlocking.
Confirm network, recipient, amount, and the current zero-fee alpha behavior.
- 3Enter the local password.
The vault decrypts for the signing operation and verifies that its key controls the sender.
- 4Wait for node acceptance.
The wallet shows success only after the local node admits the transaction.
It means the transaction entered your local mempool. Relay can still be zero, and even a mined block has no safe economic finality while fork choice and reorganizations are missing.
The alpha allows one local pending outgoing transaction at a time and uses a fixed fee of zero. Pending incoming transfers appear after inclusion, not while they are only in the mempool.
05
Mine blocks
Mining is a simple CPU proof-of-work loop for learning, not a pool, GPU, or production miner. Create a wallet first, stop the foreground node, and use the wallet's testnet address as the reward destination.
# Stop the foreground node first; mine starts its own node
luracoin mine --network testnet --address <YOUR_TESTNET_ADDRESS> --host 127.0.0.1 --port 9999 --rpc-port 18444luracoin mine starts its own full node and RPC services, so it must replace—not run beside—the earlier node command on the same ports and data directory. “Ready” means initialized and caught up with every known connected peer; with zero peers, it says nothing about the wider network.
06
Configure the runtime
Configuration files are templates only: neither CLI loads .env automatically. Export variables in the shell that starts the process, or pass supported CLI flags.
export LURACOIN_NETWORK=testnet
export LURACOIN_HOME=/path/to/private/luracoin-data
export LURACOIN_REDIS_HOST=127.0.0.1
export LURACOIN_REDIS_PORT=6379LURACOIN_HOMERoot for per-network data directories.LURACOIN_DATA_DIRAn exact directory for one node; keep it private and network-specific.LURACOIN_REDIS_HOST / PORT / DBMempool connection and optional network-specific database override.LURACOIN_TESTNET_RPC_URLElectron override; only HTTP loopback URLs are accepted.LURACOIN_EXPLORER_*Developing read-only API and optional SQLite projection. Keep local until deliberately hardened for public use.VITE_* for secrets.Vite embeds public-prefixed variables into renderer code. The node's bearer, mnemonic, xprv, private key, and passwords must never enter frontend bundles.
07
Understand the protocol
The current alpha uses peer protocol v2 and RPC / Explorer API v1. Do not identify it by package version alone: the earlier, incompatible public prototype also reports 0.1.0.
P2P v2 messages and consensus encodings may change before any public network. Pin an exact source revision when testing interoperability.
Addresses and units
- Addresses are 34-character Base58Check strings.
- The payload is version byte
0x30plus HASH160 of a compressed public key. 1 LURA = 100,000,000 lurashis.- Consensus uses integers—never floating point.
Transactions
The unsigned payload is 85 bytes. A deterministic ECDSA secp256k1 signature over SHA-256, normalized to low-S, is paired with the 64-byte public key. The final transaction is exactly 213 bytes; its ID is double SHA-256 of those bytes.
Blocks and proof of work
A serialized block begins with a 118-byte header followed by one or more 213-byte transactions. Post-genesis blocks begin with one coinbase paying the height-specific subsidy plus fees; genesis instead contains its fixed 100,000 LURA test allocation. Difficulty adjusts every 480 blocks and may change by at most a factor of four per period.
P2P v2
Every TCP message has a 24-byte envelope: network magic, 12-byte command, payload length, and checksum. Peers exchange version and verack before blocks, transactions, inventory, peer lists, and ping/pong messages.
08
Protect recovery material
Luracoin, the public website, and the explorer never need private wallet material. Keep each of these out of screenshots, logs, analytics, issue trackers, cloud notes, and frontend environment variables.
The testnet genesis key is already public by design. Never reuse it, even for other test systems. Do not publish sensitive vulnerability details or any wallet secret; follow the repository security policy.
Open the security policy ↗09
Read confirmations carefully
The current node follows one linear next-block path. It does not store competing branches, compare cumulative work, or reorganize account state.
Two nodes can therefore stay on different histories after simultaneous valid blocks. Explorer “confirmations” describe depth in one node's observed chain; they do not imply globally safe finality.
- No public seed infrastructure or faucet.
- No header-first synchronization, durable peer scoring, or Sybil protection.
- No hardware wallet, multisig, smart contracts, staking, burn, or multi-address wallet.
- No mainnet genesis or release gate approval.
10
Troubleshoot common states
Redis is unavailable
Run redis-cli ping. The node may still read confirmed chain state, but cannot safely admit, relay, or mine pending transactions. The wallet disables sending when the mempool is unavailable.
The node is healthy but shows zero peers
This is expected without seeds. The correct state is isolated, not globally connected. Add a controlled --seed HOST:PORT endpoint. For an inbound LAN experiment, restart with an explicit trusted-LAN --host; never Internet-expose this alpha.
The wallet cannot connect
Confirm that the node uses testnet and RPC port 18444, that rpc.token exists in the same data directory Electron expects, and that you did not expose or rewrite the loopback URL.
The browser wallet has no network functions
npm run dev serves only the renderer. Build it and use the Python node's --wallet-dir gateway, then open the exact localhost URL.
A transaction was accepted but is not confirmed
Acceptance is local mempool admission. Check peer count, relay information, miner status, and node readiness. An isolated node cannot propagate to a broader test network.
Mainnet fails to start
That is intentional. Mainnet has no genesis manifest and fails closed until the implementation, protocol, and release process are ready and audited.
Inspect the chain model.
The explorer preview recognizes block, transaction, and address queries while the public endpoint is being prepared.
