A resolver that learns about blocklists only after the first scam needs a release before it can warn anyone. The consumer ships now, pointed at a list with no entries, so the first real report costs a transaction instead. A list is an address, named by a BNS name whose bl record holds it. Entries are RPT (the report), BLK and UBK. A flag counts only when it names a valid report in the same list for the same name and reason, and only when its transaction is spent FROM the list address: anyone can pay an address, so being in its history proves nothing. That spend rule is what lets the authority change hands later without the resolver learning the difference. resolveName attaches blocked, blockReason, blockReportTxid and blockedBy to a flagged name and leaves every other answer untouched. With no subscription it is the old resolver exactly. A list that cannot be read never stops a name from resolving. Lists are read from full electrum servers: the project's beacon-only indexers answer 'no history' for any other address, which would look like an empty list. The default list is sirius-blocklist.x, a two-part name because a three-part one collapses to its parent. Address conversion is dependency-free so this file stays a single-file drop-in. |
||
|---|---|---|
| contracts | ||
| setup | ||
| src | ||
| test | ||
| .gitignore | ||
| ariadne.config.json | ||
| BROWSER-PROMPT.md | ||
| build-web.mjs | ||
| DESIGN-collision-modes.md | ||
| DESIGN-hosting-pact.md | ||
| DESIGN-root-tld-cert.md | ||
| ENGINE.md | ||
| LICENSE | ||
| namespaces.pdf | ||
| OPERATIONS-electrum.md | ||
| package-lock.json | ||
| package.json | ||
| PROTOCOL.md | ||
| README.md | ||
| ROADMAP.md | ||
| sia-test.html | ||
BNS — Namecoin-style decentralized names on Bitcoin Cash (chipnet)
A working prototype of "Option 3": names are CashTokens name certificates on the BCH chain (no fork, no sidechain), records ride in OP_RETURN, discovery via a beacon address, and the resolver is embedded in a wallet app with a built-in browser pane — the Brave/MetaMask-browser architecture in miniature.
See PROTOCOL.md for the on-chain design and its honest limitations.
Layout
src/lib/bns.js— protocol core: payload codec, chain indexer/resolver, tx builderssrc/wallet-app.js— wallet + embedded resolver + browser UI (npm run wallet→ http://localhost:4626)src/register.js/src/update.js/src/resolve.js— CLI equivalentswallets.json— chipnet seed phrases (TESTNET ONLY — never reuse for real funds)src/lib/gen-wallets.js— one-time wallet generation (already run)
Setup
npm install- Fund the wallet with free chipnet tBCH: go to https://tbch.googol.cash/,
paste the wallet address (shown in the app sidebar or by
node src/lib/gen-wallets.js), pick chipnet, solve the captcha. ~0.001 tBCH funds hundreds of registrations. npm run walletand open http://localhost:4626
Standalone resolver daemon (make EVERY browser resolve .bch)
src/daemon/bnsd.js— DNS server (answers*.bchfrom the chain, forwards everything else upstream) + HTTP gateway that serves on-chain sites by Host header. Test unprivileged:node src/daemon/bnsd.js --dns-port 5354 --http-port 8081, thennode src/daemon/dig.js hello.bch.setup/install.ps1— run from an elevated PowerShell. Installs the daemon as a boot-time scheduled task (SYSTEM, auto-restart) and wires the OS to it:- default (
-Mode nrpt): adds an NRPT rule so only.bchqueries reach the daemon; all other DNS is untouched. -Mode full: points every adapter's DNS at 127.0.0.1 (daemon forwards non-.bch upstream, ncdns-style); original servers are saved and restored on uninstall.
- default (
setup/uninstall.ps1— reverses everything (rule/adapters/task).
HTTPS for .bch: the "BNS Local Root CA" (created on demand in ca/, keep
root-ca.key private) signs per-name certs. The daemon's :443 gateway mints
them on the fly for locally-served names; node src/lib/issue-cert.js <name>
issues one for a real server (see the coinspectrum.bch nginx vhost). The
installer trusts the root machine-wide and enables Firefox's
enterprise-roots policy; cert fingerprints are published in "tls" chain
records for pinning.
Caveats: browsers with "secure DNS" (DoH) enabled bypass the OS resolver — disable it or add an exception; ports 53/80/443 must be free.
Try it
- Register
hellowith inline HTML (a website stored entirely on-chain), then typehello.bchin the address bar — the app resolves it from the blockchain (not DNS) and renders it. - Or CLI:
node src/register.js hello '{"h":"<h1>Served from the BCH chain</h1>"}'thennode src/resolve.js hello