Skip to content

Commit f0e1df7

Browse files
committed
docs: surface bounded storage and scalable time-aware discovery on the README and landing page
README gains a "Bounded storage & scalable discovery" section, and the Pi note now covers bounded on-disk history. The landing-page honest ledger and FAQ describe fixed-budget storage (no more "storage that grows over time") and add FAQs on storage growth and staying usable as the network changes. Also fix the multi-resolution plan link in cli.md (moved to plan/done).
1 parent 8fcd708 commit f0e1df7

3 files changed

Lines changed: 41 additions & 6 deletions

File tree

README.md

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,30 @@ Start here depending on what you want:
5151
- **event bounds discovery** — the enclosing chain's endpoint timestamps `(lower, upper)`;
5252
- **event order discovery** — compare two events' intervals → `-1`, `+1`, or `0`.
5353

54+
## Bounded storage & scalable discovery
55+
56+
Two capabilities keep a node viable as a long-lived, always-on service.
57+
58+
- **Bounded storage.** Each node keeps several independent clock chains at geometrically spaced
59+
resolutions — fine-grained for recent events, progressively coarser for older ones — and
60+
ring-prunes each to a fixed capacity, so total on-disk storage stays **flat at a configurable
61+
budget** — tens of MB on a Pi, tens of GB on a server. No event is ever dropped: old events stay
62+
provably orderable and only lose time-bound *precision*, gracefully, with age — recent events are
63+
pinned to the second, a decade-old event to about a minute, with a horizon of centuries. `lotid`
64+
runs a sensible default schedule; `loti db gc` re-asserts the prune and `loti db stat` reports the
65+
chains and retention. See
66+
[doc/theory.md](doc/theory.md#bounding-storage-multi-resolution-clock-chains) and
67+
[doc/cli.md](doc/cli.md).
68+
69+
- **Scalable, time-aware discovery.** A proof has to trace the overlay *as it was during the target
70+
event's time range*, not the current topology — so forwarding is a **time-dependent, pluggable,
71+
bounded** routing decision: directed where a routing table exists, degrading to a bounded flood
72+
(width, hop-limit, visited-set) over the *historical* neighbor set where it does not, so lookups
73+
scale and survive peer churn. Soundness stays free — every returned chain is re-validated by the
74+
math, so heuristic routing can only cost completeness, never correctness. See
75+
[doc/dynamic-discovery.md](doc/dynamic-discovery.md) and the design in
76+
[plan/pending/scalable-pluggable-discovery.md](plan/pending/scalable-pluggable-discovery.md).
77+
5478
## Simulation model
5579

5680
Each host runs three co-located application modules; one helper module builds the overlay.
@@ -172,8 +196,10 @@ a multi-node notary proof over real UDP).
172196

173197
`lotid` is small and dependency-light enough to run always-on as a node on a **~$15 Raspberry
174198
Pi Zero**. The DAG is read through a page-cache-backed store, so a node's memory stays bounded
175-
as it grows. [doc/embedded.md](doc/embedded.md) is the full guide: cross-compiling for
176-
**aarch64** (Zero 2 W) and **ARMv6** (Zero / Zero W) with the toolchains in
199+
as it grows — and its on-disk history is bounded too (see
200+
[Bounded storage & scalable discovery](#bounded-storage--scalable-discovery)), so the node runs
201+
indefinitely without filling the card. [doc/embedded.md](doc/embedded.md) is the full guide:
202+
cross-compiling for **aarch64** (Zero 2 W) and **ARMv6** (Zero / Zero W) with the toolchains in
177203
[cmake/](cmake/) and [scripts/build-cross.sh](scripts/build-cross.sh), the recommended Pi flags
178204
(`--store-mapsize`, `--store-sync-interval` for SD-card wear), and the honest limits (the 32-bit
179205
DAG-lifetime ceiling, cold-read latency, microSD wear).

doc/cli.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ loti verify order.loti
463463
- ~~What is the exact retention policy that keeps proofs reconstructible years later without
464464
unbounded storage growth (~3–30 GB/year of clock events per the paper)?~~ **Answered** by
465465
multi-resolution clock chains (see [`db gc`](#storage--maintenance) above and
466-
[plan/pending/multi-resolution-clock-chains.md](../plan/pending/multi-resolution-clock-chains.md)):
466+
[plan/done/multi-resolution-clock-chains.md](../plan/done/multi-resolution-clock-chains.md)):
467467
`N` independent clock chains at geometrically spaced intervals, each ring-pruned to a fixed
468468
`keep`, bound total clock-event storage to ≈ `chains · keep` — old events are never dropped,
469469
they degrade from exact to ≈ `a/C` precision of their age (`C` = events kept per chain) once

index.html

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -595,8 +595,8 @@ <h2>What it costs, and what you get.</h2>
595595
<div class="panel cost">
596596
<h3>What it takes</h3>
597597
<ul>
598-
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"><path d="M5 12h14"/></svg><span>A node needs a little storage that grows over time, and a bit of bandwidth — like a modest background service.</span></li>
599-
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"><path d="M5 12h14"/></svg><span>Hardware is cheap: a node runs always-on, low-power, on a <strong>~$15 Raspberry Pi Zero</strong> — its memory stays bounded as it grows. <a href="https://github.com/levy/loti/tree/master/doc/embedded.md" target="_blank" rel="noopener">Embedded guide →</a></span></li>
598+
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"><path d="M5 12h14"/></svg><span>A node needs a bit of bandwidth and a slice of storage <strong>capped at a budget you pick and flat forever</strong>, so it never outgrows its disk. Like a modest background service.</span></li>
599+
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"><path d="M5 12h14"/></svg><span>Hardware is cheap: a node runs always-on, low-power, on a <strong>~$15 Raspberry Pi Zero</strong>both its memory and its on-disk history stay bounded, so it runs indefinitely without filling up. <a href="https://github.com/levy/loti/tree/master/doc/embedded.md" target="_blank" rel="noopener">Embedded guide →</a></span></li>
600600
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"><path d="M5 12h14"/></svg><span>Proofs pin an event to a <em>window</em> — think under a minute — not an exact instant.</span></li>
601601
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"><path d="M5 12h14"/></svg><span>It proves <em>time and order</em>. Pair it with a signature when you also need to prove <em>who</em>.</span></li>
602602
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"><path d="M5 12h14"/></svg><span>Like any network, its reach depends on participation — the more nodes, the tighter and more trusted the proofs.</span></li>
@@ -609,6 +609,7 @@ <h3>What you gain</h3>
609609
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 6.5"/></svg><span>Proofs a third party can verify offline — no account, no platform, no trust in you.</span></li>
610610
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 6.5"/></svg><span>Freedom from fees, gatekeepers, and single points of failure.</span></li>
611611
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 6.5"/></svg><span>Privacy — publish as much as you like; only fingerprints ever leave your machine.</span></li>
612+
<li><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M4 12.5l5 5L20 6.5"/></svg><span>Proofs that last — on a fixed storage budget a node keeps ordering events for centuries; recent ones stay pinned to the second, old ones fade in precision but never in order.</span></li>
612613
</ul>
613614
</div>
614615
</div>
@@ -691,7 +692,11 @@ <h2>The things people ask first.</h2>
691692
</details>
692693
<details>
693694
<summary>Does it cost money?<span class="plus"></span></summary>
694-
<p>Publishing an event is effectively free. Running a node costs a little storage — which grows gradually over time — and a bit of bandwidth. There are no per-proof fees.</p>
695+
<p>Publishing an event is effectively free. Running a node costs a bit of bandwidth and a fixed slice of storage — capped at a budget you choose and flat forever. There are no per-proof fees.</p>
696+
</details>
697+
<details>
698+
<summary>Won't the storage grow forever?<span class="plus"></span></summary>
699+
<p>No. Each node keeps its clock history at several resolutions at once — fine-grained for recent events, progressively coarser for older ones — and trims each down to a fixed size. Total storage is capped at a budget you set, from tens of megabytes on a Raspberry Pi to tens of gigabytes on a server, and stays flat. You never lose the ability to order an old event; only its time window widens gently with age — recent events pinned to the second, a decade-old event to about a minute, with a reach of centuries.</p>
695700
</details>
696701
<details>
697702
<summary>How precise is a proof?<span class="plus"></span></summary>
@@ -709,6 +714,10 @@ <h2>The things people ask first.</h2>
709714
<summary>Who runs the network?<span class="plus"></span></summary>
710715
<p>Anyone. People, companies, cities, courts, laboratories, even sensors and IoT devices. The more participants there are, the tighter and more widely trusted the proofs become.</p>
711716
</details>
717+
<details>
718+
<summary>Does it keep working as the network grows and changes?<span class="plus"></span></summary>
719+
<p>A proof traces the network as it was when your event happened — not as it looks today — so peers coming and going never invalidates an old proof. To stay fast as the network grows, a lookup heads straight for its destination where the route is known and falls back to a bounded search where it isn't. However it's found, every proof is re-checked by the math, so a wrong turn can only make a lookup miss — never make it lie.</p>
720+
</details>
712721
</div>
713722
</div>
714723
</section>

0 commit comments

Comments
 (0)