Protocol & join path
Essential protocol reference, then the static join path — works with zero backend. mfnd JSON-RPC is newline-delimited TCP; browsers need an HTTP proxy for live stats only.
Privacy-tx fees fund a self-balancing storage treasury; users prepay an endowment sized for perpetual bytes; operators prove random chunk possession every block or lose pay (and eventually bond).
Upstream sourceView codebasegithub.com/shanecloonan/permawriteRingCT / CLSAG stack — what hides on-chain and what stays visible.
Consensus-enforced under uniform-ring tier.
Off-chain bytes, on-chain anchors — SPoRA audits every block.
min_replication = 3, max_replication = 32 (consensus bounds)
inflation_ppb (2%) treated as conservative assumed deflation rate d (Kryder's law). No yield harvested from locked endowment principal; treasury + fees pay operators.
Worked example
Defaults, 1 GiB, 3× replication:
Default fee_to_treasury_bps = 9000 → treasury must receive full endowment from fee share.
Three money flows, stake-weighted finality, intentionally separated roles.
Bitcoin halvings + Monero tail.
| Action | Default cost | Enforced by | Split |
|---|---|---|---|
| Transfer / claim | 0.0001 PFP flat | Wallet only | 90% treasury / 10% producer |
| Storage upload | ~ceil(E₀×10000/9000)+tip | Consensus | 90% treasury / 10% producer |
| Validator bond | full stake | Consensus | 100% treasury |
| Slashing | forfeited stake/bond | Consensus | 100% treasury |
No fee burn. Flat fee ≠ % of amount sent.
Validators
Consensus, block production, bonded stake, always-on
Storage operators
Hold replicas, answer SPoRA, consumer-grade hardware OK
Observers / light nodes
Sync headers, verify, no stake
Wallets
CLSAG sign, upload, scan
Fork legitimacy invariants:
PFP Chain · Privacy-Funded Permanence
Live network →Join the mesh
Minimum join
Build and sync an observer. Seed nodes auto-dial from the manifest beside genesis; optional explicit dials below.
git clone https://github.com/shanecloonan/permawrite.git
cd permawrite
cargo build -p mfn-node --release --bin mfnd
cargo build -p mfn-cli --release --bin mfn-climfnd --data-dir ./observer-data \
--genesis mfn-node/testdata/public_devnet_v1.json \
--store fs \
--rpc-listen 127.0.0.1:18734 \
--p2p-listen 127.0.0.1:0 \
serve# optional: --p2p-dial 5.161.201.73:19001 # optional: --p2p-dial 5.161.201.73:19002 # optional: --p2p-dial 5.161.201.73:19003
mfn-cli --rpc 127.0.0.1:18734 status
mfn-cli --rpc 127.0.0.1:18734 tipExpect matching genesis_id and rising tip_height.
Browser or CLI
Prefer the testnet wallet for faucet / balance / send. Or use the CLI against a local observer — keep the seed / wallet JSON private forever.
mfn-cli --rpc 127.0.0.1:18734 --wallet ./alice.json wallet new
mfn-cli --rpc 127.0.0.1:18734 --wallet ./alice.json wallet addressmfn-cli --rpc 127.0.0.1:18734 --wallet ./alice.json wallet scan
mfn-cli --rpc 127.0.0.1:18734 --wallet ./alice.json wallet balancemfn-cli --rpc 127.0.0.1:18734 --wallet ./alice.json wallet upload ./sample.txt --jsonOptional
Build mfn-storage-operator; point it at a synced local observer RPC. No validator keys required. Details in upstream OPERATORS.md.