blobarchive.net

docs / guide · updated 2026-08-01

Independent writer FAQ

This page is for someone who has read the call for an independent writer and wants the operational detail before deciding. It is deliberately long. The post is the summary; this is the part you read once you are seriously considering the work.

Current status

The network has one writer. It is operated by the project, it runs on one machine, and there is no second writer.

A writer becomes part of anything only when individual follower operators choose to authorize it in their own configuration. The project may include other writers as part of the default configuration once they are launched.

What a writer is, what are the other network roles

RoleWhat it decidesWhat it holds
WriterWhich blobs belong in each head, from its own Ethereum inputs, and signs that claim.Its own store, publication signing key, libp2p identity, IPNS name, indexers, and ingest credential.
Public edgeNothing. It verifies a writer’s signed state against a pinned contract and relays it.Read-only access to immutable blocks. No signing key, no mutation credential.
FollowerWhich writers to authorize, which heads to retain, and what to serve locally.Its own verified copy of the heads it selected, and its own durable replay floors.
Kubo replicaThe same decisions as a follower.An existing Kubo repository as the block store, pin database, and swarm identity.
RelayNothing. It is a libp2p introduction and hole-punching control path.Nothing. It is not the bulk transfer path for archive data.

The distinction that matters for this role: replicas decentralize availability, and independently deriving writers decentralize completeness assurance. A hundred copies of one writer still inherit that writer’s source schedule and acquisition assumptions. How BlobArchive works has the full role breakdown.

Which heads would I publish?

At launch the production archive publishes four finalized heads, all, arbitrum-one, robinhood and base, and one bounded unfinalized head.

An independent writer publishes finalized heads. The multi-writer contract applies to finalized-monotonic heads only. An unfinalized-mutable head has exactly one authority by design, and a follower’s source set may name exactly one source for it; a second writer does not publish it.

You do not have to take all four. A writer that publishes only all, or only one filtered chain head, is a coherent deployment. Writers for other networks, eg testnets or other L2s, than the ones published at launch are welcome. The trade-off is that a filtered head requires you to independently obtain both the beacon blob bytes and the parent-chain history that determines which batches belong in the head, and to maintain that chain’s source schedule as its owner changes posting mechanisms. The all head has no filter manifest and is the simpler commitment. See heads and retention.

What independence requires, specifically

The point of a second writer is a second failure domain. Each writer must have its own:

Three things are never shared between concurrently running writers: private signing keys, libp2p keys, mutable KV state, IPNS sequence counters, or store directories. Content-addressed blocks may be copied freely; mutable authority state may not. There is also no lease, coordinator, or leader election to serialize writers, and adding one would break the model rather than improve it.

An ALL-head writer should obtain finalized existence from an independent beacon authority. Post-Fusaka this is a real design decision rather than a formality: a healthy ordinary consensus node may custody too few data columns to reconstruct complete blobs, and a node configured for long retention does not retroactively acquire history it never received. Measure your node’s actual serving frontier rather than trusting its configuration or an HTTP status. Discovery and trust covers why this is a common-mode boundary between writers and not just an acquisition detail.

Who holds the signing key?

You do. Always.

You generate your publication signing key on your own host, it stays there, and it is never sent to us, escrowed with us, backed up by us, or held by us in any form. There is no protocol mechanism for the project to hold another writer’s signer and no circumstance in which we would ask.

Consequences worth understanding before you generate it:

What does it cost to run?

Every number below was measured on the production writer on 2026-08-01. It is a one-operator sample from a network with essentially one consumer, not a benchmark.

MeasureValue (measured 2026-07-31)
Archive on disk2.8 TiB
Growth, last 24h7.94 GB
Growth, last 7 days55 GB, an average of about 7.9 GB/day
Implied growth at that rateroughly 240 GB/month, about 2.9 TB/year
Writer memorymedian RSS 0.48 GB, peak 2.08 GB over 7 days
Edge memorypeak 2.63 GB over 7 days
Writer CPUp95 3.28 cores over 7 days
Egressnot reliably measured yet

Three qualifications, each of which matters more than the numbers:

How would I bootstrap?

There are two safe paths. They differ in how much trust the new writer inherits from the existing one.

This is the bounded help we offer: an authenticated snapshot or bootstrap assist to shorten the initial data transfer. It is bounded because it is a data convenience, not a shortcut through the proof gate. If you take the seed path, the manifest chain still has to be replayed separately and an independent anchored audit still has to be completed.

The independent-writer guide has the exact procedures, and the operations guide has the promotion runbook, the backup and restore procedures, and the deterministic replication audit.

What has to match, and what may differ?

Every writer in a logical archive shares:

Operational settings — batch size, polling cadence, cache size, worker count — do not define logical identity and may differ. Keep everything that defines content identical and under version control.

Writers may temporarily have different finalized coverage. That is safe when the lower root is an exact prefix of the higher root and their manifest tips are equal or ancestor and descendant in the same direction. If one writer has greater coverage while another has the descendant manifest, the claims are incomparable and followers hold their last good generation until the directions agree.

What is the proof gate?

Before a follower operator adds a writer to an active source set, all of the following must hold:

  1. the signed publication document authenticates under the expected public key;
  2. archive ID, network, head name, head kind, and immutable parameters match the logical archive inventory exactly;
  3. at a fixed coverage boundary, the root is equal to, or an exact projected extension of, an already trusted writer’s root;
  4. the manifest tip is equal to or a valid descendant of the recorded history, with root and manifest ordering pointing in compatible directions;
  5. the follower can fetch the signed document and required proof blocks through that source’s own publication and peer paths; and
  6. the writer has advanced from its own independent upstreams after bootstrap, proving it is no longer coupled to whatever seeded it.

Matching timestamps, a larger revision number, a higher IPNS sequence, arrival order, source-list order, and majority agreement are explicitly not substitutes for any of these. A timeout or a missing proof block means not yet proven, which is a different state from conflict.

How do followers authorize a writer?

Locally, by explicit configuration, one operator at a time. A follower’s source roster names each writer by a stable local source ID with its pinned public key, its name channel, and the exact heads it may contribute:

follow:
  archive_id: "<64 lowercase hex characters>"
  sources:
    writer-a:
      url: https://writer-a.example.org
      ipns: k51qzi5uqu5d...
      pubkey: "<64 lowercase hex characters>"
      heads: [all, unfinalized]
    writer-b:
      url: https://writer-b.example.org
      ipns: k51qzi5uqu5d...
      pubkey: "<64 lowercase hex characters>"
      heads: [all]
  source_set:
    revision: 1
    acknowledge_digest: "sha256:<canonical roster digest>"

The roster digest must be acknowledged by that operator and the revision is an irreversible local authorization floor. There is no writer registry in the protocol, no feed of recommended writers that a follower consumes automatically, and no DNS name that silently rotates between writers. Publishing does not require our approval either: any operator may run a writer, publish through IPNS, use DNSLink under a domain they control, and distribute a signer-pinned follow profile, with no involvement from this project at all.

Human review applies only to the two things the project controls: names under blobarchive.net and the follow profiles shipped inside released binaries. That is a distribution decision, not admission to the protocol, and its absence does not make an independently published writer less functional.

What happens when two writers disagree?

Nothing votes. A follower durably latches a finalized head only after closing a cryptographic contradiction: equal coverage with different roots, a failed prefix projection, or two readable manifest histories that are not descendants of one another. A latch freezes advancement of that head while the follower keeps serving its last durably admitted generation, and clearing it requires an operator to review the evidence and clear that exact evidence ID.

A missing proof, a timeout, a malformed publication, or temporarily incomparable coverage is not a latch and is retried without intervention.

The practical implication for a writer operator: being briefly behind is normal and safe. Being wrong is visible, durable, and requires a human to resolve. The system is built so that disagreement surfaces instead of being copied through the replica fleet.

What about upgrades and compatibility over time?

What monitoring is expected?

Start with the writer deployment monitoring table, which separates the private writer, indexers, public edge, and end-to-end canary. On your side, as a writer operator, alert on:

Keep one non-empty historical blob as a byte-exact regression anchor. A successful HTTP status is not an archive-integrity test — a beacon endpoint can answer 200 with an empty array for a slot that provably held a blob, which is how an incomplete archive passes a status-only check.

Followers observe writers locally rather than writers reporting to a central service. A source-set follower exports per-source availability, last-success timestamp, per-head covered and synced-to values, and a one-hot durable selection series, with labels drawn only from its own configuration. Nothing about your keys, CIDs, revisions, URLs, or PeerIDs becomes a metric label anywhere. Operate and troubleshoot covers the follower side of this.

What are the incident and contact expectations?

We would ask an independent writer operator to:

We hold ourselves to the same communication expectations for the writer we run. Neither side is offering the other an uptime SLA or a guarantee of individual operational support.

What does the project provide?

What does the project not promise?

The staged path, in detail

  1. Informal interest. A public thread or a message. No commitment either way, and nothing is provisioned. The output is a shared understanding of whether this is worth either party’s time.
  2. Architecture and cost fit. Your provider, region, hardware, storage plan, upstream beacon and parent-chain sources, and expected growth headroom, checked against the envelope above before anything is built. The likely outcome of this stage is sometimes that it does not fit, which is a useful result and not a failure.
  3. Isolated canary. You provision the writer with its own keys, store, identity, endpoint, and upstreams, and run it. It is authorized in no follower’s source set. It publishes nothing anyone depends on. This stage exists so that a new writer can be wrong in private, and it should run long enough to cover at least one upgrade, one restart, and one scrub cycle.
  4. Compatibility. At a fixed finalized boundary your roots match, your manifest history matches exactly, your writer has advanced from its own upstreams after bootstrap.
  5. Optional public authority. If you want a name under blobarchive.net or inclusion in the shipped follow profiles, that is a human-reviewed curation decision at this point. It is genuinely optional: publishing under your own domain, your own signer, and your own distributed profile requires nothing from us at any stage.

How to apply

Open a thread on GitHub Discussions: https://github.com/blobarchive/bloar/discussions. A useful first message answers:

Operator:        who you are, and whether you are acting for an organization
Region/network:  region, provider, and ASN if you know it
Hardware:        CPU, memory, storage type and capacity, and headroom plan
Experience:      relevant operational experience, especially Ethereum
                 infrastructure, IPFS/libp2p, or long-lived archival storage
Heads:           which finalized heads you would want to publish
Timing:          when you could realistically start, and at what pace

None of that is a form to be scored. It is the information needed to have the stage-2 conversation without three rounds of clarifying questions.