Skip to content

Instantly share code, notes, and snippets.

Ensuring FOC retrievability

Hypothesis

In a permissionless incentivized decentralized system, incentive-motivated peers maximize reward and minimize cost.

Since FOC isn't a philantropic/public goods product, many SPs will be incentive motivated.

Unless there is retrieval incentives, or non-retrievability-penalties, for FOC, a good amount of SPs will eventually not serve retrievals, leading to unhappy users.

FilBeam as Proxy

Hypothesis

SPs don't want the FilBeam cache sitting in front of them, as it means that SPs will not be rewarded for every retrieval. Instead, they are only rewarded for cache misses (a percentage of retrievals).

Proposal

Disable the Filbeam cache, and proxy every request through to SPs. This is what is going to be explored in the rest of the document.

@juliangruber
juliangruber / filbeam-architecture.md
Last active April 7, 2026 13:22
FilBeam architecture
import http from 'node:http'
import { once } from 'node:events'
const server = http.createServer((req, res) => {
res.writeHead(200)
res.write('some data')
setTimeout(() => {
console.log('server: destroying socket')
res.socket.destroy(new Error('abort'))
console.log('server: socket destroyed')

Chain Indexer

First iteration

  • PDPVerifier.onProofSetCreated(proofSetId, ownerAddress)
  • PDPVerifier.onRootsAdded(proofSetId, rootIDs)
proof_sets:
+==============+===============+
| proof_set_id | owner_address |
+==============+===============+
import Fastify from 'fastify'
import pg from 'pg'
const app = Fastify()
const client = new pg.Client()
app.post('/:subnet/measurement', {
schema: {
body: {
type: 'boolean'
const aggregators = [
"https://aggregator.walrus-testnet.walrus.space",
"https://wal-aggregator-testnet.staketab.org",
"https://walrus-testnet-aggregator.bartestnet.com",
"https://walrus-testnet.blockscope.net",
"https://walrus-testnet-aggregator.nodes.guru",
"https://walrus-cache-testnet.overclock.run",
"https://walrus-testnet-aggregator.stakin-nodes.com",
"https://testnet-aggregator-walrus.kiliglab.io",
"https://walrus-cache-testnet.latitude-sui.com",
0x002fE59EB60a4ca445A44937efcf7BC5c564Cada
0x010B1Bb03Bf1C67fa8AA7b87d6056d835E3E8834
0x0119Dc04217b943119C8817eCe605a73b20c09a2
0x018D22d18cDeD23a39D94C3B21910E29dAc1ba1E
0x01b3Ef7995b14F1b98c5ECaECAc84e177a282365
0x01C1000288e44466e2c48160DC8DC4dbc45C86C2
0x01D25877898FC20f0a07ABE67F0f65b293D08858
0x01e60b4635db2B6281B98C8E6191ea122aFFbeef
0x0229ab18438Fd5Af6235D5011dF53e3b724D1544
0x026C4936017074EDADf93D8B187B4C7219967c4D
import { InfluxDB } from '@influxdata/influxdb-client'
const client = new InfluxDB({
url: 'https://eu-central-1-1.aws.cloud2.influxdata.com',
token: process.env.INFLUX_TOKEN, // julian-station-read
timeout: 5 * 60 * 1000
})
const queryApi = client.getQueryApi('Filecoin Station')
const query = `
from(bucket:"station")
const notaries = await findNotaries()
const allLdnClients = []
for (const notaryAddressId of notaries) {
const clients = await getVerifiedClientsOfNotary(notaryAddressId)
allLdnClients.push(...clients)
}
removeDuplicates(allLdnClients)
async function findNotaries (filter) {