Skip to main content
LTHN Documentation
Back to website
Components

Core Ledger

The sovereignty layer — a CryptoNote privacy chain, the Lethean Name System sidechain, and a .lthn DNS resolver with no ICANN dependency.

doc/components/ledger.md

Core Ledger is the sovereignty layer of the stack, made of three native-Go components. go-blockchain is a CryptoNote privacy main chain. go-lns is a full sidechain running the Lethean Name System for .lthn names. go-dns is an authoritative resolver for the .lthn top-level domain that answers with no ICANN fallback. Value, names, and resolution all live on infrastructure you can run yourself.

Install

The three packages are imported under dappco.re/go:

go get dappco.re/go/blockchain@latest
go get dappco.re/go/lns@latest
go get dappco.re/go/dns@latest
import "dappco.re/go/dns"

How a .lthn name resolves: names live on the go-lns sidechain, anchored to the go-blockchain main chain, and go-dns resolves them with no upstream fallback — it either resolves or returns NXDOMAIN.

The privacy main chain

go-blockchain is a native-Go CryptoNote chain, forked from Zano. It provides the privacy primitives of the protocol — ring signatures, stealth addresses, and confidential transactions (RingCT with Pedersen commitments and Bulletproofs) — over proof-of-work blocks of roughly two minutes.

It runs as a full node with HD wallets, P2P networking over the Levin protocol, a JSON-RPC interface, and mining. The performance-critical cryptography sits in a C++ library reached through a narrow CGo bridge; the rest is pure Go.

core-chain chain sync
core-chain chain rpc --rpc-bind 127.0.0.1:46941

The name sidechain

go-lns is a full sidechain to the main chain, running the Lethean Name System. It registers .lthn names through an auction — OPEN, BID, REVEAL, then REGISTER — a model forked from Handshake and reimplemented in native Go with no JavaScript runtime dependency.

Beyond registration, it handles covenants (name rules, reserved and locked catalogues), DNS records for names, and VPN gateway discovery. Every subsystem registers as a Core service, so its actions are exposed through MCP, REST, and the CLI.

import "dappco.re/go/lns"

available, err := lns.NameAvailable("myapp.lthn")
records, err := lns.ResolveAll("charon.lthn")

DNS without ICANN

go-dns is the authoritative resolver for the .lthn zone. It serves the full DNS protocol over UDP and TCP on port 53, plus an HTTP lookup API for clients that cannot use native DNS. It is authoritative for .lthn and offers no recursion, so a query for a name outside the zone is REFUSED and a query for an unknown name inside the zone returns NXDOMAIN — it never forwards upstream.

Records come from the sidechain as the source of truth, with main-chain alias comments as a bootstrap fallback. The cache is invalidated by tree-root change: a single check detects any change to the zone instead of polling each name. DNSSEC records (DS, DNSKEY, RRSIG) are served for secure delegation.

curl "http://127.0.0.1:5554/resolve?name=charon.lthn&type=A"
curl "http://127.0.0.1:5554/health"

Sovereign end to end

The three components compose into one chain of control. Value lives on the privacy main chain, names live on the LNS sidechain anchored to it, and resolution comes from a .lthn resolver with no dependency on ICANN — each piece is something you can run yourself.