Repository navigation
Lantern — status overview #24
Description
2026-06-15 refresh: see the latest status COMMENT below — zero-Glif READ path is live (#43+#44) and the WRITE path is now local-capable (#45 Stages 1-5, live-verified on a calibration test deployment). The V1.5.3 snapshot below is historical.
Living overview. Lantern stays small, pure-Go, embeddable. Curio Core work lives on Reiers/curio-core (see #11 for the cross-repo thread).
What works today (V1.5.3 live; mainnet daemon bumped 2026-05-24)
Lantern is now a usable chain backend for SP deployments, not just a credibility-play light client.
Production-shape surface
- Mainnet light client running on a mainnet test node, wired as secondary
ChainApiInfoin Curio. - Public beacon on our public server: Bitswap state + F3 cert-exchange +
lantern/beacon/v1rendezvous. - HTTP gateway
gateway.lantern.reiers.io(Cloudflare-fronted, nginx → :8088). - Installer endpoint
get.lantern.reiers.io(Cloudflare Pages). - 5-of-N bootstrap quorum at first run (ChainSafe + PL libp2p + glif + chain.love).
- Lotus-compat RPC: 71/71 Curio
FULLNODE_APImethods + 14/14eth_*methods synapse-sdk uses (V1.4). - VMBridge for FEVM forwarding:
eth_call/eth_estimateGas/eth_sendRawTransactionroute to operator's choice of Forest/Lotus (V1.4). - DHT protocol-prefix fix: peer count climbs 4 → 80 in 3 minutes, stabilizes around MinPeers=50.
- SIGTERM-responsive: clean shutdown in 0.55-0.58s across back-to-back lifecycle cycles.
Embeddable surface (the curio-core path)
pkg/daemonDaemon API exported. Curio Core consumes this in-process; no separate process required.- V1.5 today: pkg/daemon now wires the full chain-sync stack in embedded mode (49642e0). Header store at
<data-dir>/<network>/headerstore, headnotify.Distributor over the store, hstore.Sync polling Glif. Embedded consumers can subscribe to head changes viaDaemon.HeadChanges()directly — bypasses the HTTP/JSON-RPC out-channel restriction. - headnotify first-subscribe semantics fixed (6932227): emits
{Type:"current", Val:nil}instead of an empty batch when no head observed yet. Downstream consumers (curio's chainsched) reject empty first batches. - Embedded-mode logging visible (7f11493): header-store wiring emits an Info-level log line regardless of EmbeddedMode, so operators can confirm the wiring from journalctl.
V1.3 calibration support (shipped earlier in this session)
build.Networkselector +build/bootstrap_calibnet.go+--network mainnet|calibrationflag ondaemonandbeaconsubcommands.- Live calibration sync working in curio-core's embedded daemon (verified at calibration epochs 3743070-3743094+).
Open work
Architecture / swarm
- StateMinerInfo / StateMinerPower timing out at 30s on cold state #3 StateMinerInfo / StateMinerPower 30s timeout on cold state — Bitswap / HAMT walk issue, peer-count ruled out
- Beacon cert-exchange upstream should default to other Lantern beacons, not Glif #6 Beacon cert-exchange upstream should default to other Lanterns, not Glif (B-11-01-followup)
Shipped today
- pkg/daemon header store + headnotify.Distributor + hstore.Sync (49642e0)
-
Daemon.HeadChanges()accessor for embedded callers (49642e0) - headnotify: 'current' Val=nil on first subscribe (6932227)
- pkg/daemon: log header-store wiring in embedded mode (7f11493)
UX
- Mac .app notarization (B-11-03) #23 Mac
.appnotarization (B-11-03, deferred — workaround sufficient)
Cross-repo umbrella
- Curio Core: PDP-only Curio + Lantern as a single bundled binary #11 Curio Core: PDP-only Curio + Lantern as a single bundled binary. Status thread with Andy. Real work lives on Reiers/curio-core.
Firewall
The Lantern repo MUST stay small. PDP-specific code, Curio integration logic, and SQLite/harmonytask wiring all live on Reiers/curio-core. The only Lantern-side surface for Curio Core is pkg/daemon. If that surface starts churning, that's the early-warning signal.
Today's pkg/daemon additions (header store wiring + HeadChanges accessor) are within scope: they expose existing internal subsystems (chain/header/store, chain/headnotify) to embedded callers without growing the conceptual surface. The standalone cmd/lantern already used them.
Architecture note (from Reiers/curio-core#12)
Lantern serves BOTH RPC surfaces now: Filecoin.* Lotus-compatible (chain RPC) AND eth_* (FEVM client traffic, synapse-sdk's primary surface). An SP running curio-core with embedded Lantern serves both surfaces without an external Glif sidecar. That's the architectural keystone the FilOzone client stack needed.
Activity
Reiers commentedon May 23, 2026
2026-05-23 evening — pkg/daemon RPC mount (V1.4 architectural foundation)
What landed today
12207e0pkg/daemon: mount JSON-RPC server inline, expose AdminToken + MintTokenPath A from today's curio-core wiring: finished the
TODO(daemon-extraction)for the JSON-RPC server. Embedded callers (notably curio-core) now get a fully-functional/rpc/v1endpoint without hand-rolling internal handler state or borrowing TrustedRoot directly.Daemonstruct gainsrpcServer+authfields, populated duringStart.AdminToken(),MintToken(perms []auth.Permission),FullNodeAPIInfo().startInternalnow: TrustedRoot anchor →combined.New(gateway, glif)fetcher →handlers.ChainAPI→rpc/server.New.stopInternaldoes gracefulsrv.Stop(ctx)../...build clean.What's still in cmd/lantern (not yet extracted)
The lighter subsystems remain in
cmd/lantern/main.go. Embedded consumers don't need them today; the cmd-line daemon does. Migration order for the rest:Concrete consumer: curio-core wiring is live
Curio-core now dials embedded Lantern at
http://127.0.0.1:0/rpc/v1(ephemeral loopback) with the self-minted admin JWT fromDaemon.AdminToken(). Two clients side-by-side:lotus/api/client.NewFullNodeRPCV1→ handlesFilecoin.*(ChainHead, StateMinerInfo, etc.)go-ethereum/ethclient→ handleseth_*(chainId, getBalance, blockNumber, call, etc.)Surprise win:
*ethclient.Clientalready satisfiescurio/lib/ethchain.EthClientend-to-end (including SendRawTransactionSync, SubscribeTransactionReceipts, BlobBaseFee). No shim required.Verified end-to-end on a test deployment
Filecoin.ChainHeadvia in-process /rpc/v1: real TipSet ✓eth_chainId:0x4cb2f✓eth_getBalance(0xe5a17b...):0x2544faa778090e00000✓eth_blockNumber:0x39154a✓Size discipline holding
The "minimal node that just works under 1GB" architectural promise is intact. pkg/daemon extraction doesn't add weight; it just exposes the right embedded surface.
Ask: which subsystems should pkg/daemon own vs. stay in cmd/lantern?
Working theory: pkg/daemon owns everything an embedded consumer needs (RPC, chain reads, signing). cmd/lantern owns operator-facing surface (libp2p networking, metrics dashboard, signal handling, the install/service flows).
Concretely: should
libp2p + bitswapmigrate to pkg/daemon? Pros: curio-core gets faster state-tree fetches for free. Cons: pulls libp2p stack into every embedder, increases curio-core binary by ~10 MB. Open question for #11 / #24.Open issues snapshot
#3p2 — StateMinerInfo cold state 30s timeout (bitswap/HAMT walk, not peer count). Real perf bug. Becomes load-bearing when curio-core does proof challenges.#6p2 — Beacon cert-exchange should peer to other Lantern beacons by default, not Glif. Swarm-thesis correctness.#11p2 — Curio Core umbrella (this work's parent epic; arguably should close now)#23p3 — Mac .app notarization (cosmetic)Status
V1.4 baseline holds. Architecture for embedded consumers is now stable. Next Lantern work item that actually affects curio-core: deciding whether libp2p+bitswap belong in pkg/daemon (open question above) and #3 (state-tree fetch performance, becomes critical once curio-core does cold proof reads).
Reiers commentedon May 23, 2026
Day 8 milestone hit (2026-05-23 20:00 CEST)
pkg/daemon RPC + VMBridge + 4 new forwarded eth_* methods. Real on-chain tx through embedded Lantern. txHash
0x4f350323788ecfd52454eefcde8d070f9ebbc9363b9b0e6cdeb5e5db5e90bfe8on calibration block 3,741,096. Full ship report on #11 and curio-core#16.Reiers commentedon Jun 15, 2026
🔄 Status refresh — 2026-06-15: zero-Glif read path LIVE, write path local-capable (Stages 1-5)
The big shift since the V1.5.3 snapshot above: Lantern no longer needs the VMBridge for FEVM reads, and the write path is now local-capable too. This is the keystone that lets an SP run curio-core with NO external Glif/Forest RPC.
Local FEVM execution — the keystone (#43, #44)
eth_callexecutes locally against verified state, bridge fallback on miss. v1.6.x.Local FEVM write path (#45, Stages 1-5 DONE + live-verified)
Key finding: every primitive already existed in Lantern — this was wiring + an ETH↔Filecoin tx codec, not new infra.
eth_getTransactionCount(nonce): served from the accessor, anchored at the live head (caught+fixed a boot-anchor staleness bug that lagged a busy EOA ~44 txs = nonce-collision risk). 4/4 live EOA senders nonce-match Glif exactly. v1.7.4.eth_estimateGas: local via vm.GasEstimator (conservative method-based ceiling). Verified local ≥ glif always — never under-estimates (the invariant a writing SP needs). v1.7.3.chain/ethtx): new pure-Go pkg, NO go-ethereum, NO FFI. RLP codec + ParseSignedEIP1559 + ecrecover Sender() + ToSignedFilecoinMessage(). Verified by full round-trip (genkey→sign→encode→decode→ecrecover==addr). v1.7.5.eth_sendRawTransaction: decode → SignedMessage → MpoolPush (gossipsub /fil/msgs). Bridge fallback only on decode failure, never after publish (double-broadcast guard). Wired the mempool publisher into the embedded daemon (was missing). v1.7.6-v1.7.7.eth_getTransactionReceipt: resolves SP-originated txs via the sent-tx index → StateSearchMsg → eth-receipt shape. nil-until-found. v1.7.6.All write-path methods (nonce/gas/send/receipt) are now local-capable.
Remaining before full bridge-off
eth_feeHistory+eth_getLogs(lower priority, can stay bridge-backed longest).--vm-bridge-rpc-disableon a calibration test deployment. Only flip the disable flag after a real confirmed tx bridge-off.Also shipped this stretch (cross-ref curio-core)
Firewall check
chain/ethtxis new but self-contained and Lantern-general (any FEVM client needs it), not curio-core-specific — within scope.pkg/daemongrew one field (mempool publisher wiring on the existing head-tracking pubsub). The dependency direction stays curio-core → lantern.HEAD
023357b, tagv1.7.7. Tracker for the write path: #45.Reiers commentedon Jun 15, 2026
📍 Current open issues (2026-06-15, post-cleanup)
Cleaned up the tracker so this reflects reality. 6 open issues:
FEVM / zero-Glif (the headline track)
maxPriorityFeePerGasuncovered dep. This is the true--vm-bridge-rpc-disableblocker.Local FEVM execution for eth_call (remove Glif VMBridge dependency) #43(closed) — localeth_callread path delivered + proven zero-Glif on a calibration test deployment. Read path done; write-path remainder → Local FEVM write path — the zero-Glif keystone (estimateGas/nonce/sendRawTx/receipt) #45/#45 Stage 7: real SP tx declines local send path bridge-off (parser mismatch + uncovered maxPriorityFeePerGas dep) #46.Embedded state-block availability for local eth_call (last blocker for --vm-bridge-rpc-disable) #44(closed) — embedded state-block availability + adaptive warming.Standing items
.appnotarization (deferred;xattr -dr com.apple.quarantineworkaround sufficient).CI
e0ea5a1(fixed gofmt drift + a real flaky-unsubscribe bug —EthUnsubscribeis now deterministic). Self-hosted GitHub Actions runner for CI on every push #15 (self-hosted runner) stays closed; GitHub-hosted is fine at current cadence.The dependency story (for a fresh reader)
Firewall holds:
chain/ethtxis Lantern-general;pkg/daemongrew only the mempool-publisher wiring. Dependency direction stays curio-core → lantern.Reiers commentedon Jun 15, 2026
Added #47 — mpool pending-tx confirm + rebroadcast loop. Closes the "published-but-unmined message silently stalls" gap (Lantern is a fire-and-forget publisher today, no rebroadcast/confirmation). Design: 3-epoch confidence window → rebroadcast the same signed bytes (idempotent, same nonce/CID), give up loudly on stale fee-cap; auto-RBF explicitly out of scope. Complements the write path (#45) and the bridge-off gate (#46). Status: building.
Reiers commentedon Jun 15, 2026
Status refresh (2026-06-15) — zero-Glif write path + bitswap block source
Current: v1.7.16 (HEAD 2b2ffff). CI green (hermetic: -short + LANTERN_OFFLINE=1).
Landed today
/chain/ipfs/bitswap(boxo defaults to IPFS/ipfs/bitswap, which Filecoin peers don't speak — same lesson as the/fil/kad/<net>DHT prefix). Live bridge-off: balance + nonce + send all local, glif-block-fetch = 0.Open
Durable lessons
/fil/kad/<net>, bitswap =/chain/ipfs/bitswap. Any boxo client vs Filecoin must set the prefix.Reiers commentedon Jun 21, 2026
2026-06-22 — current status (supersedes the 2026-05-23 V1.4 snapshot above)
Lantern has moved a long way since that V1.4 note. The headline: the bridge is no longer load-bearing. Both the read path and the write path are served from locally verified state + libp2p, with the VM bridge proven removable.
Where we are: v1.7.22 (mainnet + calibration)
latest).curl -fsSL https://get.golantern.io | bash.CGO_ENABLED=0. ~40.8k LoC. The "minimal node under 1 GB" promise holds (mainnet disk footprint still ~200 MB, Badger header store dominates).filcensus.reiers.ioand is embedded in Curio Core, which completed its first mainnet PDP end-to-end on it (2026-06-21).Zero-Glif: done end-to-end (the big arc since V1.4)
The entire read+write path now resolves locally with the bridge disabled, byte-identical to Glif where it counts:
eth_callagainst verified state + on-head contract-state prefetcher + retry-on-miss. Self-healing (aneth_callmiss feeds the address back into the prefetcher). Live sample 100% local, zero bridge fallback.chain/ethtx),eth_sendRawTransaction→ MpoolPush,eth_getTransactionReceipt→ StateSearchMsg,eth_getTransactionByHash. The keystone was StateSearchMsg fails decoding block message AMT ('cbor input had wrong number of fields') — blocks local eth_getTransactionReceipt #49 (block-message/receipt AMTs are go-amt-ipld v2, not v4)./chain/ipfs/bitswapprotocol prefix. Glif block-fetch count = 0 during the bridge-off window.eth_callexecutes SSTORE/LOG via an ephemeral overlay (no false reverts); Glif-class gas ceiling so estimateGas doesn't under-count swaps/payment rails.Operational hardening (v1.7.17 → v1.7.22)
~/.lantern/<net>/secrets/, auto-migrated, auto-backed-up on every start (keep 7). Recovery ops structurally can't delete keys.lantern service installnow wires the keystore passphrase into the generated unit/plist (--passphrase-filefor encrypted; explicit unencrypted default) so background/non-TTY startup no longer hard-errors.Open issues (current)
PreferredPeers→ SP's own block producers, or prefetch-on-send. The remaining reliability gap before unconditional bridge-off..appnotarization (p3, cosmetic).Closed since V1.4
#43, #44, #45 (write-path engine), #46, #48, #49, #51 — the whole zero-Glif read+write keystone line.
Bottom line: Lantern is a working light client and a working local execution/submission layer. The path from "trust an RPC" to "verify it yourself" is closed for reads and for writes; #50 is the last reliability item before flipping an SP fully bridge-off on a production network.
Reiers commentedon Jun 29, 2026
2026-06-29 — current status (supersedes the 2026-06-22 v1.7.22 snapshot above)
Three release trains since the last refresh: the v1.7.23/24 receipt-field work, the v1.8.0 security-hardening sweep, and two field-driven sync/read-path fixes (v1.8.1, v1.8.2). The bridge stays non-load-bearing on both read and write paths; these releases hardened the trust surface and closed real desync/coverage bugs reported from the field.
Where we are: v1.8.2 (mainnet + calibration)
latest). Install unchanged.CGO_ENABLED=0-trimpath, SHA-256 manifests published per binary.-short+LANTERN_OFFLINE=1);go vet+gofmtclean across the module.Landed since v1.7.22
v1.7.24 — receipt completeness
eth_getTransactionReceiptnow includesfrom/to/contractAddress/effectiveGasPrice, fixingcast receipt"missing field from" and unblocking gas-cost display in consumers.v1.8.0 — security hardening (#54–#59)
--insecure-gateway.eth_*write path + refuse non-loopback RPC bind.v1.8.1 — sync resilience + chain-watcher (#53, #68) — both field-reported
backfillFailup and desyncing the node, surfacing downstream ascannot draw randomness from future epoch ... (head ...).ChainGetTipSet(key)now served from the header store (previously only resolved the synthetic head, looping Curio'smessage/watch.goontipset not in local store). Surfaces even on a healthy synced node — distinct from Header backfill falls back to Glif → node loses sync when Glif is slow #53.v1.8.2 — bridge-off read-path coverage for stock Curio (#69) — field-reported
eth_calls (e.g. Settle'sServiceProviderRegistry.getProviderByAddress) local-missed → bridge →FEVM method requires --vm-bridge-rpc.--vm-bridge-rpc.Open work
Architecture / read-write completeness
StateSearchMsgstill fetches message blocks via the bridge, stalls bridge-off. (PR feat(#50): prefetch-on-send (UN-DEPLOYED — needs supervised bridge-off verify) #52 prefetch-on-send is code-complete but UN-DEPLOYED — needs a supervised daytime bridge-off verify.)StateMinerInfo/StateMinerPowercold-state timeout (Bitswap/HAMT walk).UX
.appnotarization (deferred; workaround sufficient).Repo hygiene (2026-06-29)
RELEASE-NOTES-v*.mdfiles (redundant — release notes live on the GitHub release;CHANGELOG.mdis the canonical in-repo history) and the internalINSTALLER-SPEC.md..gitignorenow keeps future per-tag notes out of the tree.Firewall (unchanged, still holding)
The only Lantern-side surface for Curio Core is
pkg/daemon. PDP-specific code, Curio integration, and SQLite/harmonytask wiring all live on Reiers/curio-core. The #69 fix is in-scope: it adds well-known address constants + a merge helper to the existing prefetcher, not PDP logic.Reiers commentedon Jul 1, 2026
2026-07-01 refresh — PDP/mid tier landed + Full-node track opened
Work on branch
fix/lightnode-messages-2026-07-01(local, not yet pushed). Full Go suite green throughout (build + vet + gofmt + race where relevant, 0 failures).Three-tier node model (chosen at INSTALL time, not a runtime flag)
The installer asks Light / PDP / Full and persists the choice (
lantern node-type,pkg/nodeprofile), so the light node stays light — only the chosen tier provisions the larger footprint.Head-trust spine hardened (#79 / #80 / #85 / #86)
Merged the #86 divergence monitor + blockpub gate; added continuous Kind-diverse head corroboration (Forest RPC + gateway + Glif as distinct source kinds) and an observable
HeadCorroboration()status. Status-only, never auto-halts (a false positive must not self-DoS).Full-node feasibility settled (investigated against lotus master)
Full block validation needs
filecoin-ffi(Rust) in exactly two places:VerifyWinningPoSt(a Groth16/BLS12-381 SNARK) andTipSetState(FVM/WASM re-exec). Everything else is pure-Go BLS/arith we already have.Staged "kill Rust" roadmap:
chain/exchangeBlockSync (chain/exchange BlockSync port: snapshot-free full-node boot #91); single-digit-GB via retention-finality pruning (Retention-finality pruning: full node in single-digit GB (not 76) #92).proofs/winningpostlanded (stub + types + green test).Security angle: a snapshot import trusts one host for all pre-snapshot state; Lantern's multi-source F3-finalized quorum anchor is strictly stronger. Plus wallet import-from-lotus + passphrase (#93).
New issues from this thread
#87 (Full epic), #88 (Stage B WinningPoSt), #89 (Stage C wazero FVM), #90 (full-node tier pipeline), #91 (BlockSync snapshot-free), #92 (retention pruning), #93 (wallet import-lotus), #94 (PDP tier + live-soak gate).
Honest open gates
feat(#131): land pure-Go FVM prototype in research/fvm/ scoped module (…
Reiers commentedon Jul 14, 2026
2026-07-14 refresh (supersedes the 2026-07-01 snapshot above)
Two big arcs landed since the last refresh: the v1.8.5 hardening train and the v1.9.0-rc1 + Full-Node epic tail. The bridge-off story is now provable end-to-end (
--no-fallback-rpcruns Glif-free from cold boot), a first-class local Curio devnet is supported, and the two Rust-in-critical-path dependencies (WinningPoSt SNARK verify + FVM execution) both have pure-Go replacements landed and vector-tested againstfilecoin-ffi.Where we are: v1.9.0-rc1 → v1.9.0 (ready to tag)
mainis nowv1.9.0-rc1-28-g996833fwith 8 landed PRs on top of rc1.CGO_ENABLED=0-trimpath, per-binary SHA-256 manifests.-short+LANTERN_OFFLINE=1);go vet+gofmtclean.Landed since v1.8.2
v1.8.3 to v1.8.5 (bridge-off hardening + soft-consensus + PDP scaffolding + wallet import)
--no-fallback-rpcproduces a provably Glif-free daemon. Boot anchor, header stitching, and read path all resolve without any centralised fallback.HeadCorroboration(), block-publish gate.KeyInfocompatible, bulkimport-lotus, passphrase-gated.eth_*write path + non-loopback bind refusal, dashboard auth, fail-loud empty passphrase, trusted beacon floor.v1.9.0-rc1 to main (bridge-off polish + devnet + snapshot-free boot)
--no-fallback-rpcfor a provably Glif-free standalone daemon.--no-fallback-rpc(PR feat(#109): seed boot anchor from ChainExchange peers under --no-fallback-rpc #113).Store.Close(PR fix(#114): wait for async touch/eviction goroutines before closing badger DB #115).backfillFail=0, zero Glif hits.build.DevnetNetwork variant +lantern devnet-init --lotus-rpc <URL>+ auto-flag-flipping in daemon boot. Unlocks 4-second-epoch soak against a local Curio docker devnet. F3 skipped, gateway/glif verification bypassed cleanly, single-source trust posture. Docs atdocs/DEVNET.md, 10 tests (7 config + 3 e2e).--devnet-head-poll-intervalknob and auto-cadence match.curio-forkdocker stack up, lotus RPC at127.0.0.1:1234, lantern devnet daemon at127.0.0.1:2346, networklocalnet-1069c685-..., chainId0x1df5e76.Repo hygiene (2026-07-14)
LICENSE,LICENSE-LOTUS,LICENSE-LOTUS-APACHE,LICENSE-LOTUS-MIT) into a singleLICENSEwith full Apache-2.0 + full MIT + Lotus NOTICE. No legal change; the old top-levelLICENSEwas actually broken (pointed at files that didn't exist).MODULES.md/SCOPE.md/TRUSTED-ROOT.mdtodocs/design/. Deleted staleRELEASE-NOTES-v1.8.5.md. Root .md files down from 12 + 4 licenses to 5 + 1 license.Full Node epic (#87) — Stages B and C landed in a single push
Full block validation historically needed
filecoin-ffi(Rust) in exactly two places:VerifyWinningPoSt(Groth16/BLS12-381) andTipSetState(FVM/WASM re-exec). Both now have pure-Go replacements landed onmain:Stage B — pure-Go WinningPoSt verify (#88, PRs #134 + #135, closed)
proofs/groth16.go: pure-Go Groth16 verify over BLS12-381 using gnark-cryptoPairingCheck. Bellperson-compatible parsers.proofs/: verifies a real filecoin-ffi 2KiB WinningPoSt proof, rejects tampered. Bit-for-bit fidelity vs Rust reference. Committed the real proof fixture + official v28 VK. 12 tests.libfilcrypto(no Rust compile).Stage C — pure-Go FVM prototype (#89, closed)
research/fvm/(scoped module, wazero-only dependency firewall on the main module via CI): state tree, machine, address resolution, value transfer, revert, nested-from-WASM proven via 137-byte hand-emitted caller WASM (Stage C3: FVM send recursion + call-manager frames (pure-Go FVM, #89) #129, Land the pure-Go FVM prototype into a scoped module (C1+C2 from #89) #131).compute_unsealed_sector_cid(SHA254 merkle, canonical zero-tree matches through L5) +verify_consensus_fault(all 3 fault types) (Stage C4: pure-Go FVM proof-verify syscalls (crypto module, #89, shares core with #88) #130 T1).ProofVerifierinterface, default RejectAll (safe) (Stage C4: pure-Go FVM proof-verify syscalls (crypto module, #89, shares core with #88) #130 T2, PR feat(#130 Tier 2): wire proof-verify syscalls through ProofVerifier interface #136).Open work
Full Node epic remaining (#87)
proofs/VerifyWinningPoStinto block validation; wireresearch/fvm/intoTipSetState. This is the remaining integrator: the building blocks are all done, tested, merged.rcto release).Correctness / coverage
/rpc/v2tipset selectors (latest / finalized / safe) parity.UX / longstanding
.appnotarization (p3, cosmetic).Reiers/curio-core).Firewall (unchanged)
The only Lantern-side surface for Curio Core stays
pkg/daemon. PDP-specific code, Curio integration, SQLite/harmonytask wiring all live onReiers/curio-core.research/fvm/is a scoped module with its owngo.modand a CI wazero-only dependency firewall on the main module. Bringing FVM execution into shipping binaries is a deliberate future step, not an accident.Bottom line: Lantern light + PDP tiers are shipped and hardened; the Full Node tier has both its "impossible without Rust" pieces done and vector-tested on
main, waiting on integrator wiring to become the runnable third tier. Zero Rust in critical path is now a code reality, not a plan.Reiers commentedon Jul 23, 2026
2026-07-23 refresh — the write path becomes real; v1.9.0 + v1.9.1 shipped
Releases: v1.9.0 (54 commits of rc1-hardening: bridge-off #76, ChainExchange #91, pure-Go WinningPoSt verify, FVM prototype, devnet) and v1.9.1 (eth_getLogs structured errors, gasPrice premium). Both pre-stable: the #104 soak is the stable gate and it's now actually running.
Today's arc: 'a node that can send any message on-chain'
Deep pass against fresh lotus master + live cluster testing found and fixed, in merge order:
ErrLocalRangeTooWide/ErrLocalOutOfRetentioninstead of the misleading 'requires --vm-bridge-rpc'; eth_gasPrice now baseFee+premium (14% → 3.9% delta vs Glif, live-measured)lantern daemoncould read but never write;wallet sendwas a silent no-op (signed, failed publish, exit 0). Both fixed; wallet send now drives the daemon over RPC with live gas estimationinit --network calibrationused to build a mainnet/calibration chimera and write a wrong-network anchor 136 days stale claiming success. Now: flag alias + wall-clock anchor sanity gate (2880-epoch tolerance) + per-network gateway (mainnet gateway no longer poisons calibration fetch chains) + t-prefix addressesLive proof (calibration, standalone node, zero Lotus): two sends through Lantern's own gossipsub mpool, independently confirmed by Glif — CIDs
bafy2bzaceaknsr...fpajfc(ExitCode 0 @ 3916380) andbafy2bzacearvl...jjysw(ExitCode 0 @ 3916431, CLIwallet send, funds verified moved).Fleet
Open (tracked)
Reiers commentedon Oct 26, 2026
Status 2026-10-26
scripts/repro-build.shlets anyone verify a release (build: byte-reproducible releases (pinned container toolchain, fixed sha256 manifests, repro script) #174).initwrites (fix: mainnet bootstrap works out of the box (refresh peers from lotus v1.38.3, operator-aware quorum) #176). Details in TRUST-MODEL.md section 2.9.