blobarchive.net

docs / walkthrough · updated 2026-08-01

How BlobArchive uses IPFS

You do not need to understand all of IPFS to run BlobArchive. IPFS is a stack of separate protocols and data structures; BlobArchive uses a deliberately small subset of them.

At a high level:

human name                     peer discovery
DNSLink -> IPNS -> document CID     auxiliary DHT hints
                    \               /
                     verified peers
                           |
                    libp2p connection
                           |
                        Bitswap
                           |
              metadata DAGs + raw blob blocks
                           |
                    local pinned store
                           |
                 local beacon blob API

DNSLink and IPNS locate a writer operator’s current publication. In a public deployment, a separate read-only edge presents that signed state to the network and serves immutable blocks. The DHT helps nodes find peers. libp2p connects those peers. Bitswap transfers exact blocks by CID. BlobArchive adds the rules that decide which publication to trust, which DAGs to retain, and which blobs an L2 may read.

Content addressing: the CID is a hash-based name

An IPFS CID identifies content rather than a server location. BlobArchive stores each 131,072-byte EIP-4844 blob as one raw IPFS block, without UnixFS files, directories, or chunking. Its index, manifests, and head structures are small DAG-CBOR blocks that link to other blocks by CID.

The practical consequences are:

A CID proves byte identity, not meaning or completeness. BlobArchive separately checks the signed publication, head structure, coverage, KZG commitment, and requested versioned hash. A malicious writer can publish an incomplete history under its own key even though every block in that history has a valid CID.

Archive state advances, while CIDs are immutable. BlobArchive uses two pointer layers to bridge that difference:

_dnslink.ethereum-mainnet-arb1-live-a.blobarchive.net
  TXT "dnslink=/ipns/<ipns-name>"

<signed IPNS record>
  /ipfs/<publication-document-cid>

DNSLink is an ordinary DNS TXT record. It gives operators a readable, replaceable domain name and selects one IPNS authority. DNSLink does not contain the archive or point to an HTTP server.

IPNS is a signed, sequence-numbered mutable record. The private writer constructs and signs the record and the content-addressed publication document. The public edge verifies their complete binding, provides the exact document CID, and only then puts the already-signed IPNS record into the DHT. The edge cannot sign a different record or document.

This separation is intentional:

The provider-before-IPNS ordering is the cold-bootstrap guarantee: a new follower should not learn a document CID from a fresh IPNS record before the public edge has advertised that exact document. Periodic exact-pointer hints for the current document, root, and manifest are auxiliary discovery redundancy, not the publication authority and not proof that the primary transaction succeeded.

The shipped profiles pin the document signer as well as the DNSLink name. Changing DNS or publishing a newer IPNS record cannot silently authorize a different signer.

Peer IDs and multiaddrs: who and where

Every IPFS/libp2p node has a durable Peer ID derived from its private identity key. A multiaddr describes one way to reach that peer, including the network address, transport, port, and Peer ID:

/ip4/203.0.113.10/tcp/4001/p2p/12D3KooW...

The Peer ID answers “which cryptographic network identity?” The rest of the multiaddr answers “how can I dial it?”

BlobArchive can connect to peers from several bounded sources:

An address is only a route to try. It does not authorize a writer or prove that the peer still has a requested block.

What the DHT does—and does not do

The public Amino DHT is a distributed routing table. A node first joins it through known bootstrap peers. BlobArchive then uses it for three narrow jobs:

  1. publish and resolve IPNS records;
  2. advertise and find a small set of current document/root/manifest pointers;
  3. advertise and find deterministic rendezvous keys for selected (network, head) pairs.

A provider record roughly says: “Peer X claims it can help with CID Y; here are addresses to try.” BlobArchive treats that as an untrusted lead, bounds how many results and address bytes it accepts, and then dials the peer. The later publication and CID checks remain unchanged.

The DHT does not store the blobs, choose a canonical writer, establish a majority, or prove that a peer is reachable.

The embedded follower also does not hand the DHT to Bitswap as a generic per-block search engine. It uses the DHT to find and connect useful peers, then asks only connected peers for blocks. This keeps peer selection observable and prevents every missing blob from becoming an open-ended public routing query.

Rendezvous: find nodes interested in the same head

For every selected network and head, BlobArchive derives a stable synthetic rendezvous CID. A serving node periodically advertises itself as a provider for that CID. A joining node looks up the same CID, receives candidate Peer IDs and multiaddrs, and attempts bounded connections.

The rendezvous CID is a meeting point, not archive data. Knowing it does not grant access or trust. It only helps nodes interested in the same head find one another without a central peer registry.

BlobArchive may also advertise a bounded set of current entry points into the real archive: publication document, head root, and manifest tip. These exact-pointer hints are auxiliary to the load-bearing document provide that precedes each IPNS write. It deliberately does not walk the multi-terabyte archive and publish a provider record for every blob.

The swarm: connected peers, not one central service

The swarm is the graph of libp2p connections a node currently has. A BlobArchive node can be connected to public edges, followers, Kubo replicas, DHT bootstrap peers, and relay peers at the same time.

Joining the swarm does not mean trusting every connected node. The follower first selects a writer authority and exact head CIDs. Other peers are useful only if they can supply blocks matching those already-authenticated CIDs.

Public edges and embedded followers serve retained blocks over Bitswap by default. The edge has only read access to the writer operator’s immutable blocks and no signer. A follower can become a useful source for later followers without becoming a writer or gaining publication authority.

Bitswap: move immutable blocks

Bitswap is the IPFS block-exchange protocol. A follower traversing a selected head asks connected peers for missing CIDs. Each successful fetch is verified and written into its local block store.

Replication is therefore a DAG walk:

  1. obtain and verify the publication document;
  2. select an authenticated head root;
  3. fetch its directory and segment blocks;
  4. fetch the raw blob CIDs those segments name; and
  5. pin the closure required by local retention policy.

The follower checks local storage first and uses Bitswap only for a miss. Once stored, the same block can be served to other peers. The local beacon API reads the committed local generation; it is not a public IPFS gateway and does not make an unauthenticated HTTP request trigger arbitrary swarm work.

NAT, relays, and hole punching

The most reliable configuration is a directly reachable swarm listener. Forward the shipped embedded node’s TCP port 4001 through the router and firewall when possible. The shipped Compose sample publishes host TCP 4001 by default; set BLOAR_P2P_PORT before starting it if that host port is already in use. BlobArchive may also request UPnP/NAT-PMP mappings, but an explicit verified forwarding rule is easier to reason about.

A node behind NAT can still dial public peers outbound. For two private peers, libp2p can use a circuit relay and DCUtR hole punching:

  1. the private node reserves a reachable address at a relay;
  2. peers meet through the limited relay circuit;
  3. the relay coordinates simultaneous outbound dials; and
  4. if the NATs permit it, the connection upgrades to a direct path.

In BlobArchive, the relay is an introduction and control plane—not the bulk archive path. The configured circuit allowance is 128 KiB, exactly one raw blob before Bitswap framing, and embedded Bitswap does not use limited relay connections for transfer. A relay reservation or successful discovery can therefore coexist with a failed blob fetch. Complete replication needs a usable direct connection.

Hole punching is helpful, not guaranteed. Carrier-grade or symmetric NATs may still prevent a direct upgrade. Port forwarding, a public peer, or a network where the private node can dial the serving peer directly remains the stronger path.

Embedded follower versus Kubo replica

Both deployment shapes speak the same content-addressed archive, but ownership differs:

ConcernEmbedded followerKubo replica
Peer ID and libp2p hostbloardExisting Kubo
Block store and BitswapbloardExisting Kubo
Pin database and GCBlobArchive storeExisting Kubo
Publication verification and replay floorsbloardReplica controller
Local beacon APIbloardOptional controller gateway

The embedded follower applies BlobArchive’s bounded DHT and peer-selection policy directly.

The Kubo replica leaves Kubo’s swarm and routing behavior intact. The controller uses Kubo’s RPC to authenticate a publication and move one controller-owned generation pin. The shipped configuration constrains Kubo’s provider strategy to roots, and the controller explicitly announces only bounded rendezvous and generation entry points rather than the entire repository.

What BlobArchive is not using

For clarity, the normal BlobArchive path is not:

The public service is the peer-to-peer block swarm. Each operator runs a local follower or replica, chooses its writer trust, retains its own archive, and serves its own L2 node locally.

Next, read discovery and trust for the authentication boundary, heads and retention for the DAG and pin model, or operate and troubleshoot for layer-by-layer diagnostics.