Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
09522df
fix(gql): truthful hasNextPage when id-dedup collapses a full CH page
Jun 22, 2026
1a573a3
docs(gql): fix stale getGqlTransactions hasNextPage TSDoc
Jun 22, 2026
241ca26
feat(arns): serve ArNS names whose ANT record targets an IPFS CID
vilenarios Jun 22, 2026
5591d1e
Merge pull request #792 from ar-io/PE-9124_gql_pagination_hasnextpage
arielmelendez Jun 22, 2026
23b2413
feat(s3): optional dedicated Turbo AWS client via TURBO_AWS_* vars
Jun 22, 2026
27316b1
refactor(arns,ipfs): review touches for ArNS->IPFS
vilenarios Jun 22, 2026
4a1fbc0
fix(s3): treat empty-string TURBO_AWS_* env vars as unset; add TSDoc
Jun 22, 2026
fd40337
test(arns): extract + unit-test resolved-target protocol classification
vilenarios Jun 23, 2026
03013f3
Merge pull request #794 from ar-io/PE-9125_turbo_aws_client
arielmelendez Jun 23, 2026
efd485b
feat(gql): route owner-filtered ClickHouse queries through owner_proj…
Jun 25, 2026
e3ef6ef
fix(compose): forward CLICKHOUSE_GQL_OWNER_PROJECTION_* env to core
Jun 25, 2026
8bc1163
fix(gql): address CodeRabbit review on owner-projection routing
Jun 25, 2026
66813f7
Merge pull request #796 from ar-io/gql-owner-filter-projection-routing
arielmelendez Jun 25, 2026
0454de4
docs: remove orphaned AI-generated ar-io-0X draft guides
vilenarios Jun 25, 2026
d9d0153
chore(config): remove dead ARWEAVE_PEER_CHUNK_POST_* env vars
vilenarios Jun 25, 2026
f0c6732
Merge branch 'develop' into feat/arns-ipfs-protocol
vilenarios Jun 26, 2026
d9aea1d
fix(data): guard chunk streaming against non-terminating loops
Jun 26, 2026
36eb375
fix(chunks): reject and self-heal zero-length chunk cache poison
Jun 26, 2026
3f331cb
docs(metrics): add TSDoc to chunk guard counters; test(chunks): cover…
Jun 26, 2026
4221b3d
Merge pull request #799 from ar-io/PE-9127_chunk-loop-guard
arielmelendez Jun 26, 2026
cdab9cc
feat(gql): extend owner_projection routing to owners+ids queries
Jun 26, 2026
78d36d8
docs: clarify owners+ids eligibility and windowing-fallback exclusion
Jun 26, 2026
9e58bea
Merge pull request #800 from ar-io/gql-owner-ids-projection-routing
arielmelendez Jun 26, 2026
e84457a
perf(chunk-offset): resolve offset->block locally to avoid chain bina…
vilenarios Jun 26, 2026
c767d45
Merge pull request #795 from ar-io/chore/remove-dead-arweave-peer-chu…
vilenarios Jun 26, 2026
de4dbb4
Merge pull request #797 from ar-io/docs/remove-orphaned-ai-generated-…
vilenarios Jun 26, 2026
a7da3d8
refactor(chunk-offset): address review - deterministic boundary, TSDo…
vilenarios Jun 26, 2026
96ede32
feat(metrics): add block_offset_resolution_total for offset->block fa…
vilenarios Jun 26, 2026
dc35a10
Merge branch 'fix/cold-data-block-offset-local' into feat/arns-ipfs-p…
vilenarios Jun 26, 2026
43d62a7
Merge pull request #801 from ar-io/fix/cold-data-block-offset-local
vilenarios Jun 26, 2026
ca79d91
Merge remote-tracking branch 'origin/develop' into feat/arns-ipfs-pro…
vilenarios Jun 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,10 @@ yarn service:start / stop / restart / status / logs
bundle unbundling, verification, and webhooks. Controlled by `START_WRITERS`.
- IPFS serving (`src/ipfs/`) is opt-in via `IPFS_ENABLED`. Uses a Kubo sidecar
for content retrieval with its own cache, rate limiter, and blocklist. Routes
mount before ArNS in `app.ts`. See `docs/ipfs-integration.md`.
mount before ArNS in `app.ts`. ArNS names whose ANT record has
`targetProtocol: ipfs` resolve to a CID and are routed to the same IPFS
handler by the ArNS middleware (`src/middleware/arns.ts`); the on-demand
resolver reads `targetProtocol`. See `docs/ipfs-integration.md`.
- Responses include trust headers indicating verification status.
- HTTPSIG signs response headers (RFC 9421); `Content-Digest` is in
`CO_SIGNABLE_HEADERS` so when present it binds the body to the signature.
Expand Down
10 changes: 7 additions & 3 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -183,9 +183,6 @@ services:
- CHUNK_OFFSET_CHAIN_FALLBACK_TX_OFFSET_CACHE_TTL_MS=${CHUNK_OFFSET_CHAIN_FALLBACK_TX_OFFSET_CACHE_TTL_MS:-}
- ARWEAVE_PEER_CHUNK_GET_MAX_PEER_ATTEMPT_COUNT=${ARWEAVE_PEER_CHUNK_GET_MAX_PEER_ATTEMPT_COUNT:-}
- ARWEAVE_PEER_CHUNK_GET_PEER_SELECTION_COUNT=${ARWEAVE_PEER_CHUNK_GET_PEER_SELECTION_COUNT:-}
- ARWEAVE_PEER_CHUNK_POST_CONCURRENCY_LIMIT=${ARWEAVE_PEER_CHUNK_POST_CONCURRENCY_LIMIT:-}
- ARWEAVE_PEER_CHUNK_POST_MAX_PEER_ATTEMPT_COUNT=${ARWEAVE_PEER_CHUNK_POST_MAX_PEER_ATTEMPT_COUNT:-}
- ARWEAVE_PEER_CHUNK_POST_MIN_SUCCESS_COUNT=${ARWEAVE_PEER_CHUNK_POST_MIN_SUCCESS_COUNT:-}
- ARWEAVE_CHUNK_GET_GEOMETRY_TIMEOUT_MS=${ARWEAVE_CHUNK_GET_GEOMETRY_TIMEOUT_MS:-}
- ARWEAVE_CHUNK_GET_GEOMETRY_RETRY_COUNT=${ARWEAVE_CHUNK_GET_GEOMETRY_RETRY_COUNT:-}
- WEBHOOK_TARGET_SERVERS=${WEBHOOK_TARGET_SERVERS:-}
Expand Down Expand Up @@ -241,6 +238,11 @@ services:
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-}
- AWS_REGION=${AWS_REGION:-}
- AWS_ENDPOINT=${AWS_ENDPOINT:-}
- TURBO_AWS_REGION=${TURBO_AWS_REGION:-}
- TURBO_AWS_ENDPOINT=${TURBO_AWS_ENDPOINT:-}
- TURBO_AWS_ACCESS_KEY_ID=${TURBO_AWS_ACCESS_KEY_ID:-}
- TURBO_AWS_SECRET_ACCESS_KEY=${TURBO_AWS_SECRET_ACCESS_KEY:-}
- TURBO_AWS_SESSION_TOKEN=${TURBO_AWS_SESSION_TOKEN:-}
- AWS_S3_CONTIGUOUS_DATA_BUCKET=${AWS_S3_CONTIGUOUS_DATA_BUCKET:-}
- AWS_S3_CONTIGUOUS_DATA_PREFIX=${AWS_S3_CONTIGUOUS_DATA_PREFIX:-}
- AWS_S3_TURBO_CONTIGUOUS_DATA_BUCKET=${AWS_S3_TURBO_CONTIGUOUS_DATA_BUCKET:-}
Expand Down Expand Up @@ -383,6 +385,8 @@ services:
- CLICKHOUSE_QUERY_TIMEOUT_SECONDS=${CLICKHOUSE_QUERY_TIMEOUT_SECONDS:-}
- CLICKHOUSE_GQL_MAX_ROWS_TO_READ=${CLICKHOUSE_GQL_MAX_ROWS_TO_READ:-}
- CLICKHOUSE_GQL_DEDUPE_HEADROOM=${CLICKHOUSE_GQL_DEDUPE_HEADROOM:-}
- CLICKHOUSE_GQL_OWNER_PROJECTION_ROUTING_ENABLED=${CLICKHOUSE_GQL_OWNER_PROJECTION_ROUTING_ENABLED:-}
- CLICKHOUSE_GQL_OWNER_PROJECTION_ENTITY_TYPES=${CLICKHOUSE_GQL_OWNER_PROJECTION_ENTITY_TYPES:-}
- CLICKHOUSE_SQLITE_CIRCUIT_BREAKER_TIMEOUT_MS=${CLICKHOUSE_SQLITE_CIRCUIT_BREAKER_TIMEOUT_MS:-}
- CLICKHOUSE_SQLITE_CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE=${CLICKHOUSE_SQLITE_CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE:-}
- CLICKHOUSE_SQLITE_CIRCUIT_BREAKER_ROLLING_COUNT_TIMEOUT_MS=${CLICKHOUSE_SQLITE_CIRCUIT_BREAKER_ROLLING_COUNT_TIMEOUT_MS:-}
Expand Down
20 changes: 20 additions & 0 deletions docs/arweave/transaction-and-chunk-offsets.md
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,26 @@ for (const range of ranges) {
1. **Direct Chunk Access**: Using absolute offsets allows O(1) chunk lookup
2. **Minimal Data Transfer**: Only fetch chunks containing requested bytes
3. **Streaming Support**: Process chunks as they arrive without buffering all
4. **Local offset→block resolution**: When data is retrieved by absolute offset
(the cold-data chunk-by-offset path), the gateway must first find the block
containing the offset. Rather than walking the chain with ~log₂(height)
sequential `GET /block/height/{h}` requests, the Arweave client first
consults a local index over `stable_blocks.weave_size`
(`getBlockByWeaveOffset`, backed by `stable_blocks_weave_size_idx`): the
containing block is the lowest block whose cumulative `weave_size` reaches
the offset. The local result is only trusted when the immediately-preceding
block is also present and ends before the offset (a tight bracket, so no
missing block can hide the true container); otherwise — and for offsets in
the not-yet-stable chain tip — it falls back to the chain binary search.
This only changes how the block is *found*; the block returned is identical.

Note this resolves offset→**block** only. Resolving offset→**transaction**
within that block cannot be done from local block/transaction columns,
because per-transaction offsets follow the block's binary tx-ID sort order
(see [Transaction Order vs Offset Order](#transaction-order-vs-offset-order))
and a transaction's true weave contribution is not always captured by
`data_size` (e.g. v1 inline data). Per-transaction offsets are therefore
taken from the chain's authoritative `/tx/{id}/offset` endpoint.

### Edge Cases

Expand Down
Loading
Loading