{"id":49227279,"url":"https://github.com/ben-arnao/messagechain","last_synced_at":"2026-05-23T00:07:16.145Z","repository":{"id":346858004,"uuid":"1190768715","full_name":"ben-arnao/MessageChain","owner":"ben-arnao","description":"A blockchain for sending messages. Quantum-resistant, proof-of-stake, built to last centuries.","archived":false,"fork":false,"pushed_at":"2026-04-29T02:30:12.000Z","size":7188,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-29T02:36:13.095Z","etag":null,"topics":["blockchain","censorship-resistant","cryptocurrency","decentralized","messaging","proof-of-stake","python","quantum-resistant"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ben-arnao.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-24T15:48:05.000Z","updated_at":"2026-04-29T02:30:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ben-arnao/MessageChain","commit_stats":null,"previous_names":["ben-arnao/messagechain"],"tags_count":85,"template":false,"template_full_name":null,"purl":"pkg:github/ben-arnao/MessageChain","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ben-arnao%2FMessageChain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ben-arnao%2FMessageChain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ben-arnao%2FMessageChain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ben-arnao%2FMessageChain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ben-arnao","download_url":"https://codeload.github.com/ben-arnao/MessageChain/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ben-arnao%2FMessageChain/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32581021,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blockchain","censorship-resistant","cryptocurrency","decentralized","messaging","proof-of-stake","python","quantum-resistant"],"created_at":"2026-04-24T09:01:56.959Z","updated_at":"2026-05-23T00:07:16.131Z","avatar_url":"https://github.com/ben-arnao.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MessageChain\n\n[![release](https://img.shields.io/github/v/release/ben-arnao/MessageChain)](https://github.com/ben-arnao/MessageChain/releases)\n[![license](https://img.shields.io/github/license/ben-arnao/MessageChain)](./LICENSE)\n\nAn uncensorable public square. Posts, replies, communities, votes —\non-chain forever. **Your message can never be deleted.** A\nwell-formed message that pays the fee floor is guaranteed inclusion;\nsuppression is slashable — validators that drop or refuse to attest\nto such a message lose stake on chain.\n\n**Status:** mainnet live. Chain ID `messagechain-v1`, genesis block 0\n`4eeb9edaadb42f1a460e95919bc667a3173c4a84aa9b5488da040ac7a1c054f6`.\n\n**Live feed:** [messagechain.org](https://messagechain.org)\n\n## Why\n\n- **Your message can never be deleted.** Once a message is on-chain,\n  no platform, government, ISP, or validator can hide, filter, or\n  remove it. The ledger is the source of truth and there is no\n  takedown path.\n- **Suppression is slashable.** A well-formed message that pays the\n  per-byte floor and fits the block budget cannot be quietly dropped.\n  Refusing to include or attest to such a message produces evidence\n  that any node can submit, and the offending validators lose stake.\n- **Permanence is funded forever.** Storage is paid for by perpetual\n  validator rewards, not a one-shot endowment. The security budget\n  never runs out, so the promise of permanence does not have an\n  expiry date.\n- **Costly to spam.** Every message costs real tokens, with the fee\n  scaling linearly in stored bytes. Bots can participate, but they\n  pay the same price as everyone else — AI-generated noise has a\n  floor.\n- **Simple and durable.** Designed to run for centuries with minimal\n  moving parts. Slow blocks and expensive fees are features, not bugs.\n  Zero runtime dependencies outside the Python stdlib.\n- **Democratic by default.** On-chain governance, distributed\n  validation, no privileged operators, no permissioned validator set.\n  L2s can layer reputation, identity, and moderation on top.\n- **Cheap to validate.** Runs on commodity hardware — no GPUs, no\n  specialized rigs. Quantum-resistant signatures throughout.\n\n## Install\n\nPython 3.10+, no third-party deps.\n\n```bash\ngit clone https://github.com/ben-arnao/MessageChain.git\ncd MessageChain\npip install .\n```\n\nThis puts a `messagechain` command on your PATH. You can run it the\nsame way via `python -m messagechain \u003ccmd\u003e` if you prefer.\n\n## Getting started — your first message\n\n### 1. Generate a private key (offline)\n\n```bash\nmessagechain generate-key    # write the 24-word recovery phrase on paper, 2–3 copies\nmessagechain verify-key      # re-type to confirm the backup\n```\n\n`generate-key` prints a **24-word BIP-39 recovery phrase** as the\nprimary backup. The phrase has a built-in checksum that catches\nsingle-word transcription errors when you type it back on\nrecovery — the hex form (also printed, labeled \"alternative\") has\nno such protection, so a single typo silently produces a\ndifferent key and loses access.\n\nPaper beats files — files get swept by cloud sync, backups, and\nmalware. Don't copy-paste (clipboard managers log history). Close\nthe terminal when done.\n\nYour entity_id and `mc1…` address are derived deterministically from\nthe key.\n\n### 2. Get tokens\n\nMessageChain uses a **receive-to-exist** model: you do not need to\nregister anything on-chain to receive tokens. Your account appears in\nchain state the moment someone sends you a transfer.\n\n### 3. Post\n\n**Fees.** Every CLI submission auto-prices by default. The picker\nsamples fee-per-byte across the last 50 blocks and bids the\npercentile that matches your urgency rung — `high` (~1 block, 90th\npct), `normal` (~3 blocks, 75th pct, default), `low` (~10 blocks,\n25th pct) — then multiplies by the tx's stored byte count, never\ndropping below the protocol floor. Override with `--fee N` for a\nspecific bid. `messagechain estimate-fee --tx-type \u003ckind\u003e ...`\npreviews the cost of any tx without submitting.\n\n**Post a message.**\n\n```bash\nmessagechain send \"hello world\"\nmessagechain send \"hello world\" --fee 500          # manual fee\nmessagechain send \"hi\" --urgency high              # ~1-block target\n```\n\n**Tag a community.** `--community-id NAME` groups the message under\na Reddit-style topic. The on-chain id is `sha256(name)[:16]`; any\nhuman-readable name maps deterministically. No registry, no claim —\nfirst-poster semantics; moderation is an app/indexer concern.\n\n```bash\nmessagechain send \"build report\" --community-id mc-dev\n```\n\n**Reply to a message.** `--prev \u003ctx_hash\u003e` attaches a 32-byte\npointer to a prior on-chain message — apps render this as a reply,\nchained long-form, citation, etc. The referenced tx must already\nbe in a strictly earlier block.\n\n```bash\nmessagechain send \"good point\" --prev \u003ctx_hash\u003e\n```\n\n**Long-form posts (\u003e1024 chars).** A single message is capped at\n1024 chars. For longer content, send a sequence and chain each\npiece with `--prev` pointing at the previous tx_hash. The chain\nrequires each `--prev` target to be in a strictly earlier block,\nso you'll wait one block (~10 min) between pieces.\n\n**Run a poll.** `--poll-option TEXT` (repeat 1–4 times) turns a\nmessage into a structured on-chain poll. The message body is the\nquestion; the option list is the answer set. Options are immutable\nonce on chain.\n\n```bash\nmessagechain send \"favourite colour?\" \\\n    --poll-option red --poll-option green --poll-option blue\n```\n\n**Vote on a poll.** `--vote-target POLL_TXID:INDEX` references the\npoll's tx_hash and the 0-based option you're picking. One vote per\n(entity, poll) is enforced at consensus — the first vote is binding\nforever, and the poll's author cannot vote on their own poll. The\nrunning tally is computable from chain alone; the receipt page\n(`/r/\u003cpoll_tx_hash\u003e`) shows it live.\n\n```bash\nmessagechain send --vote-target \u003cpoll_tx_hash\u003e:2\n```\n\n**Up/down-vote a message.** `react \u003ctx_hash\u003e --choice up|down|clear`\nvotes on a message. Re-voting supersedes; `--choice clear` retracts.\nEach (voter, target) pair has a single latest choice in consensus\nstate.\n\n```bash\nmessagechain react \u003ctx_hash\u003e --choice up\nmessagechain react \u003ctx_hash\u003e --choice clear\n```\n\n**Trust/flag a user.** Same `react` command with\n`--target-type user`, passing the target's entity_id (raw hex).\n`--choice up` = trust, `--choice down` = flag, `--choice clear` =\nretract. Self-trust is rejected by the protocol.\n\n```bash\nmessagechain react \u003centity_id\u003e --target-type user --choice up    # vouch\nmessagechain react \u003centity_id\u003e --target-type user --choice down  # flag\n```\n\n**First send.** Your first outgoing transaction reveals your\npublic key on-chain (the \"first-spend pubkey install\" path).\nSubsequent transactions verify against the installed key — the CLI\nhandles this automatically.\n\n**Defending against single-node suppression.** The default `send`\nposts through one RPC endpoint. If you have reason to believe a\nsingle validator might suppress your tx — say, posting under a\nnation-state takedown threat — `send-multi` fans the signed tx out\nto N≥3 validator HTTPS submission endpoints in parallel, persists\nthe signed receipts each accepting validator returns, and lets you\nfile a `CensorshipEvidenceTx` later if any receipted tx fails to\nland. Fee / nonce / leaf-watermark auto-resolve via `--server`\n(same as `send`); only `--keyfile` and `--endpoint` (×3+) are required.\n\n```bash\nmessagechain --keyfile ~/.messagechain/keyfile send-multi \"message body\" \\\n    --endpoint val-a.example:8443 \\\n    --endpoint val-b.example:8443 \\\n    --endpoint val-c.example:8443\n```\n\n`--keyfile` accepts the same formats `generate-key` produces — 24-word\nmnemonic, 72-char checksummed hex, or raw hex. Omit it to be prompted\ninteractively for your recovery phrase.\n\nThe protocol's structural defense against validator collusion is\nthe slashable-suppression rule. `send-multi` is the user-side tool\nfor invoking it: one honest validator in the fan-out set is enough\nto land the message, and any colluder that took the tx and dropped\nit produces evidence the chain will slash on.\n\n### 4. Read messages back\n\nWait one block (~10 minutes) for your message to be included, then:\n\n```bash\nmessagechain read --last 20\n```\n\n### 5. Back up your wallet\n\n**Your 24-word recovery phrase is your backup.** Write it down on\npaper (or stamp it into metal) and store it offline. Anyone with\nthose words controls the account; lose them and the funds are gone\nwith no recovery. Don't put it in cloud sync, don't email it to\nyourself, don't photograph it.\n\nThat's it. Restoring on a new machine just means feeding the phrase\nback to any signing command (`--keyfile \u003cpath\u003e` to a file containing\nthe phrase, or paste it at the prompt) — the wallet re-derives the\nkeypair and queries the network for your highest-used leaf so it can\nresume signing safely.\n\n#### Offline-signing power users only\n\nIf you sign on an air-gapped machine and broadcast later, the\nnetwork can't see leaves you've used until you broadcast them. In\nthat workflow the local leaf cursor at\n`~/.messagechain/leaves/\u003centity_id_hex\u003e.idx` IS security-critical\nbetween signings: re-signing at a leaf you've already burned offline\ndiscloses that leaf's WOTS+ private key and produces equivocation\nevidence on chain (100% slash on detection). Bundle the cursor with\nyour keyfile when moving the offline signer to new hardware:\n\n```bash\nmessagechain backup-wallet --keyfile /path/to/keyfile\n# writes \u003centity_id_hex\u003e-wallet-backup-\u003cYYYYMMDD\u003e.tar.gz in CWD\n```\n\nFor online wallets — the default path — ignore this section. The\ncursor is rebuilt from chain state on restore.\n\n## CLI reference\n\n### Personal wallet\n\n```bash\nmessagechain generate-key                       # new private key (offline)\nmessagechain verify-key                         # confirm backup\nmessagechain account                            # print your address + entity_id\nmessagechain balance                            # liquid + staked tokens\nmessagechain send \"hello\"                       # post a message\nmessagechain send \"hi\" --community-id mc-dev    # tag with a community\nmessagechain send \"reply\" --prev \u003ctx_hash\u003e      # reply/chain to a prior message\nmessagechain --keyfile \u003cpath\u003e send-multi \"msg\" \\\n    --endpoint host:port --endpoint host:port \\\n    --endpoint host:port                        # multi-validator HTTPS fan-out\n                                                # (defends against single-node\n                                                # suppression; auto fee/nonce)\nmessagechain react \u003ctx_hash\u003e --choice up        # up/down/clear-vote a message\nmessagechain react \u003centity_id\u003e --target-type user --choice up   # trust/flag a user\nmessagechain transfer --to mc1… --amount 100    # send tokens\nmessagechain read --last 50                     # recent messages\nmessagechain estimate-fee --tx-type message --message \"hi\"  # fee preview\nmessagechain receipt \u003ctx_hash\u003e                  # cross-check inclusion +\n                                                # auto-prints next-step\n                                                # escalation command on\n                                                # NOT_FOUND / PENDING\nmessagechain submit-evidence censorship \\\n    --receipt ~/.messagechain/receipts/\u003ctx_hash\u003e.json\n                                                # file slashable evidence\n                                                # if validators are dropping\n                                                # your tx (receipt bundle is\n                                                # what `send` writes on submit)\nmessagechain backup-wallet --keyfile \u003cpath\u003e     # offline-signers only:\n                                                # bundle keyfile + leaf cursor\n```\n\n### Chain \u0026 validator info\n\n```bash\nmessagechain info                               # chain height, supply, sync\nmessagechain validators                         # validator set, stakes, shares\nmessagechain peers                              # P2P peers of the target node\nmessagechain status --server HOST:9334          # one-call health check\nmessagechain status --server HOST:9334 --entity YOUR_ID\n                                                # validator-specific leaf usage\nmessagechain ping                               # first-run sanity check\n```\n\n### Governance\n\n```bash\nmessagechain propose --title \"…\" --description \"…\"\nmessagechain vote --proposal \u003cid\u003e --yes\nmessagechain proposals                          # open proposals + tallies\n```\n\n### Validator operations\n\n```bash\nmessagechain stake --amount 200                 # lock as validator stake\nmessagechain unstake --amount 200               # ~15-day unbonding\nmessagechain start --mine                       # run a validator\nmessagechain key-status                         # WOTS+ leaf usage\nmessagechain rotate-key                         # fresh keypair, old key retired\nmessagechain upgrade                            # install the latest mainnet tag\n```\n\n## Run a validator\n\nYou need 300 tokens (one faucet drip — 200 stays staked, 100 covers\nthe stake-tx fee) and an always-on Linux host (Python 3.10+, ~2 GB\nRAM) with inbound TCP **9333 + 9334** open in your cloud firewall.\n\n```bash\n# 1. on the host (as root) — installs MessageChain, generates the validator's\n#    keyfile, and prints its mc1... address.  Save that address.\n#\n# Pull the script down and read it before running.  The installer pins\n# the install to the latest signed `vX.Y.Z-mainnet` tag and refuses to\n# proceed if the tag isn't signed by a release signer baked into the\n# script — but the script itself is the trust root, so eyeball it.\ncurl -fsSL -o install-validator.sh \\\n    https://raw.githubusercontent.com/ben-arnao/MessageChain/main/scripts/install-validator.sh\nless install-validator.sh                  # review before running as root\nsudo bash install-validator.sh\n\n# 2. fund the address printed above with one faucet drip from\n#    messagechain.org, or transfer 300 tokens from any wallet:\nmessagechain transfer --to mc1... --amount 300\n\n# 3. back on the host, lock 200 of those tokens as stake (the\n#    remaining 100 covers the stake-tx fee):\nsudo -u messagechain messagechain stake --amount 200\n\n# 4. start\nsystemctl enable --now messagechain-validator messagechain-upgrade.timer messagechain-rotate-key.timer\n\n# 5. verify\nmessagechain status\n```\n\nThe installer's keyfile **is** the validator's identity — the same\nkey signs blocks and owns the stake. Back it up:\n`sudo cat /etc/messagechain/keyfile` and store the hex offline.\n**Important:** the keyfile alone is not a complete backup. See\n*Operating a live validator → Back up the keyfile* below for the\nWOTS+ leaf-state files that must be preserved alongside it; restoring\na keyfile without the matching leaf state will cause one-time WOTS+\nleaves to be re-used and the chain will slash 100% of your stake on\ndetection.\n\nRewards = block reward + tx fees + attester pool share, pro-rata by\nstake. The 200-token floor is a true minimum — there is no capital\nwall on validator entry, and rewards scale linearly with stake at\nthis end of the curve. `messagechain validators` shows the live set\nand per-validator share. Unbonding takes ~15 days (2176 blocks) —\nslashing windows extend past departure, so don't shut a validator\ndown inside the unbonding window.\n\n\u003cdetails\u003e\n\u003csummary\u003eOperating a live validator (backups, migration, retirement, monitoring)\u003c/summary\u003e\n\n**Back up the keyfile AND the leaf-index files.** Three files together\nmake up a complete validator backup:\n\n1. `/etc/messagechain/keyfile` — the hex secret. `sudo cat` it and\n   store offline (paper, hardware token, encrypted USB). Lose this\n   and the staked funds are gone with no recovery.\n2. `/var/lib/messagechain/leaf_index.json` — the WOTS+ next-leaf\n   counter for block signing.\n3. `/var/lib/messagechain/receipt_leaf_index.json` — the WOTS+\n   next-leaf counter for the submission-receipt key (only present on\n   validators that issue receipts).\n\nThe leaf-index files record which one-time WOTS+ leaves the keyfile\nhas already burned. **Restoring the keyfile without the matching\nleaf-index files re-signs already-used leaves**, which mathematically\ndiscloses the WOTS+ private key for those leaves and produces\nequivocation evidence on chain. Pre-Tier 20 the protocol slashed\n100% of stake on detection (`SLASH_PENALTY_PCT = 100`) with no\nrecovery path. At/after `SOFT_SLASH_HEIGHT = 15000` the per-offense\npenalty drops to `SOFT_SLASH_PCT = 5` and the validator stays in\nthe set with reduced stake — but a leaf-index restore burns leaves\nin BULK, producing many distinct equivocation events that compound\ngeometrically `(1 - 0.05)^N` toward total stake loss. Treat the\nleaf-index files as security-critical state, not as a regenerable\ncache. Snapshot them whenever you snapshot the keyfile, and never\nrestore one without the other.\n\n**Migrate to a new host.** Stop the validator on the old host\n(`systemctl stop messagechain-validator`), then copy **both** the\nkeyfile and the leaf-index files to the new host:\n\n```bash\n# on the OLD host — capture keyfile + leaf state atomically\n# (after systemctl stop, so leaf_index.json is no longer being written).\nsudo tar czf /tmp/mc-validator-backup.tgz \\\n    -C / etc/messagechain/keyfile \\\n    var/lib/messagechain/leaf_index.json \\\n    var/lib/messagechain/receipt_leaf_index.json\n# transfer /tmp/mc-validator-backup.tgz to the new host (scp, etc.)\n\n# on the NEW host — extract, fix ownership, then run the installer\nsudo tar xzf /tmp/mc-validator-backup.tgz -C /\nsudo chown messagechain:messagechain /etc/messagechain/keyfile \\\n    /var/lib/messagechain/leaf_index.json \\\n    /var/lib/messagechain/receipt_leaf_index.json\nsudo chmod 0600 /etc/messagechain/keyfile\n```\n\nThen run the installer on the new host. Init reuses the existing\nkeyfile rather than regenerating — no multi-hour keygen, and no\ndouble-sign risk because only one host runs at a time. Skipping the\nleaf-index files (e.g. copying just the keyfile, or restoring from a\nkeyfile-only paper backup after a disk-loss event) **will cause leaf\nreuse and a 100% slash** the first time the new validator signs.\nIf you ever find yourself with a keyfile but no leaf-index, do NOT\nstart the validator — instead, reach out to a peer for a chain-state\ninspection of your entity's existing on-chain signatures so you can\nrecover the high-water-mark leaf index before signing again.\n\n**Drain \u0026 retire.** `messagechain unstake --amount 200` (or whatever\nyour current stake is — `messagechain status --entity YOUR_ID`\nprints it), wait the full ~15-day unbonding window so the slashing\nwindow closes, *then* shut the host down. Bringing a validator down\nwith stake still bonded risks downtime slashing.\n\n**What gets you slashed.** Double-signing or equivocating — signing\ntwo competing blocks at the same height — or WOTS+ leaf reuse, which\nis detected as equivocation under the same rule. Leaf reuse is most\ncommonly caused by restoring a keyfile from backup without the\nmatching `leaf_index.json` (see *Back up the keyfile AND the\nleaf-index files* above). The unbonding window exists so peers can\nprove misbehavior committed before you left.\n\n**Health monitoring.** `messagechain validators` (your stake share +\nwhether you're in the active set). `messagechain key-status` (WOTS+\nleaf consumption — auto-rotation handles this at ≥95% but check by\nhand if curious). `journalctl -u messagechain-validator -f` to follow\nthe log live.\n\n**Manual upgrade.** `messagechain upgrade` installs the latest mainnet\ntag. The weekly timer does this automatically; run it by hand if you\ndisabled the timer.\n\n**Toggle automation.** `messagechain config set auto_upgrade false` /\n`auto_rotate false` disables the timers.\n\n**Cold authority.** `messagechain set-authority-key --authority-pubkey\n\u003ccold_hex\u003e` requires a cold-signed key for future rotations.\n`messagechain emergency-revoke --entity-id \u003chex\u003e` is the cold-signed\nkill switch.\n\n**Manual run (no installer).** `messagechain generate-key`, store the\nhex on paper, then `messagechain start --mine --rpc-bind 0.0.0.0\n--data-dir /var/lib/messagechain --keyfile /etc/messagechain/keyfile`.\nA systemd unit example ships at\n[`examples/messagechain-validator.service.example`](./examples/messagechain-validator.service.example).\n`messagechain doctor` runs preflight checks. `messagechain init` is\nwhat the installer wraps — run it directly if you don't want the\ncurl-pipe.\n\n\u003c/details\u003e\n\n## Learn more\n\nDeeper dives on specific features and the design thinking behind\nthem — written for users, not implementers. Full index in\n[guides/](./guides/README.md).\n\n- [Identity, keys, and rotation](./guides/identity.md) — one live\n  key per entity, rotation preserves identity, plus cold authority\n  key and emergency revoke.\n- [Quantum resistance and WOTS+](./guides/quantum-resistance.md)\n  — why MessageChain signs with hash-based signatures from day\n  one, and how versioned schemes handle future migrations.\n- [Stable money over centuries](./guides/stable-money.md) —\n  dormancy-filtered active supply and why \"X tokens\" should mean\n  the same thing in 2126 as it does today.\n- [Fees: how pricing actually works](./guides/fees.md) — flat\n  floor, per-byte component, EIP-1559-style burn, auto-fee picker.\n- [Keeping rewards fair](./guides/fair-rewards.md) — the\n  diminishing-returns curve, founder divestment, and the lottery\n  that redistributes seed stake to the broader validator set.\n- [Validator economics](./guides/validator-economics.md) — what\n  running a validator costs, what you earn, what's at risk, and\n  rough break-even math.\n- [Governance: expensive proposals, permanent record](./guides/governance.md)\n  — how proposals work, who gets paid for voting, why most\n  results are advisory but recorded forever.\n- [Anti-bloat: keeping the chain small enough to run forever](./guides/anti-bloat.md)\n  — slow blocks, the 1024-byte message cap, and worst-case storage\n  projections out to 50+ years.\n- [Permanence guarantees](./guides/permanence.md) — the\n  protocol-level mechanics behind \"your message can never be\n  deleted\": archive duty, forced inclusion, slashable censorship\n  evidence.\n- [Forum primitives](./guides/forum-primitives.md) — replies,\n  up/down votes, communities, long-form threading — the on-chain\n  building blocks any front-end can reassemble.\n- [Reputation primitive](./guides/reputation.md) — trust and flag\n  votes between users, what the protocol stores, and where richer\n  reputation systems can be built on top.\n- [Combating AI spam](./guides/ai-spam.md) — the thesis: real fee\n  floor + permanent reputation graph = bulk-AI-spam economics\n  that don't pencil out. No detection, no blocklists, no\n  proof-of-human.\n\n## How MessageChain compares\n\nHow MessageChain stacks up against Nostr, Arweave, and DeSo: see\n[COMPARISON.md](./COMPARISON.md).\n\n## Security \u0026 changelog\n\n- Vulnerabilities: see [SECURITY.md](./SECURITY.md) — private email\n  disclosure, 72h ack, 7d triage. Do not open a public issue.\n- Release notes: see [CHANGELOG.md](./CHANGELOG.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fben-arnao%2Fmessagechain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fben-arnao%2Fmessagechain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fben-arnao%2Fmessagechain/lists"}