Home / Blink Labs / dingo
May 28, 12-1 AM (0)
May 28, 1-2 AM (0)
May 28, 2-3 AM (0)
May 28, 3-4 AM (0)
May 28, 4-5 AM (0)
May 28, 5-6 AM (4)
May 28, 6-7 AM (0)
May 28, 7-8 AM (0)
May 28, 8-9 AM (0)
May 28, 9-10 AM (1)
May 28, 10-11 AM (0)
May 28, 11-12 PM (1)
May 28, 12-1 PM (1)
May 28, 1-2 PM (1)
May 28, 2-3 PM (3)
May 28, 3-4 PM (0)
May 28, 4-5 PM (4)
May 28, 5-6 PM (0)
May 28, 6-7 PM (4)
May 28, 7-8 PM (2)
May 28, 8-9 PM (5)
May 28, 9-10 PM (5)
May 28, 10-11 PM (1)
May 28, 11-12 AM (0)
May 29, 12-1 AM (0)
May 29, 1-2 AM (0)
May 29, 2-3 AM (0)
May 29, 3-4 AM (0)
May 29, 4-5 AM (0)
May 29, 5-6 AM (0)
May 29, 6-7 AM (0)
May 29, 7-8 AM (0)
May 29, 8-9 AM (0)
May 29, 9-10 AM (0)
May 29, 10-11 AM (0)
May 29, 11-12 PM (2)
May 29, 12-1 PM (0)
May 29, 1-2 PM (2)
May 29, 2-3 PM (1)
May 29, 3-4 PM (1)
May 29, 4-5 PM (1)
May 29, 5-6 PM (2)
May 29, 6-7 PM (1)
May 29, 7-8 PM (1)
May 29, 8-9 PM (3)
May 29, 9-10 PM (1)
May 29, 10-11 PM (0)
May 29, 11-12 AM (0)
May 30, 12-1 AM (0)
May 30, 1-2 AM (0)
May 30, 2-3 AM (0)
May 30, 3-4 AM (2)
May 30, 4-5 AM (0)
May 30, 5-6 AM (0)
May 30, 6-7 AM (0)
May 30, 7-8 AM (0)
May 30, 8-9 AM (0)
May 30, 9-10 AM (0)
May 30, 10-11 AM (0)
May 30, 11-12 PM (0)
May 30, 12-1 PM (0)
May 30, 1-2 PM (1)
May 30, 2-3 PM (2)
May 30, 3-4 PM (0)
May 30, 4-5 PM (0)
May 30, 5-6 PM (0)
May 30, 6-7 PM (0)
May 30, 7-8 PM (0)
May 30, 8-9 PM (0)
May 30, 9-10 PM (0)
May 30, 10-11 PM (0)
May 30, 11-12 AM (0)
May 31, 12-1 AM (0)
May 31, 1-2 AM (0)
May 31, 2-3 AM (0)
May 31, 3-4 AM (0)
May 31, 4-5 AM (0)
May 31, 5-6 AM (0)
May 31, 6-7 AM (0)
May 31, 7-8 AM (0)
May 31, 8-9 AM (0)
May 31, 9-10 AM (0)
May 31, 10-11 AM (0)
May 31, 11-12 PM (0)
May 31, 12-1 PM (0)
May 31, 1-2 PM (0)
May 31, 2-3 PM (1)
May 31, 3-4 PM (0)
May 31, 4-5 PM (0)
May 31, 5-6 PM (0)
May 31, 6-7 PM (0)
May 31, 7-8 PM (1)
May 31, 8-9 PM (0)
May 31, 9-10 PM (0)
May 31, 10-11 PM (0)
May 31, 11-12 AM (4)
Jun 01, 12-1 AM (3)
Jun 01, 1-2 AM (0)
Jun 01, 2-3 AM (0)
Jun 01, 3-4 AM (0)
Jun 01, 4-5 AM (0)
Jun 01, 5-6 AM (0)
Jun 01, 6-7 AM (0)
Jun 01, 7-8 AM (0)
Jun 01, 8-9 AM (0)
Jun 01, 9-10 AM (0)
Jun 01, 10-11 AM (0)
Jun 01, 11-12 PM (0)
Jun 01, 12-1 PM (11)
Jun 01, 1-2 PM (1)
Jun 01, 2-3 PM (0)
Jun 01, 3-4 PM (0)
Jun 01, 4-5 PM (0)
Jun 01, 5-6 PM (0)
Jun 01, 6-7 PM (1)
Jun 01, 7-8 PM (3)
Jun 01, 8-9 PM (2)
Jun 01, 9-10 PM (4)
Jun 01, 10-11 PM (0)
Jun 01, 11-12 AM (0)
Jun 02, 12-1 AM (0)
Jun 02, 1-2 AM (0)
Jun 02, 2-3 AM (0)
Jun 02, 3-4 AM (0)
Jun 02, 4-5 AM (0)
Jun 02, 5-6 AM (0)
Jun 02, 6-7 AM (0)
Jun 02, 7-8 AM (0)
Jun 02, 8-9 AM (0)
Jun 02, 9-10 AM (1)
Jun 02, 10-11 AM (0)
Jun 02, 11-12 PM (0)
Jun 02, 12-1 PM (1)
Jun 02, 1-2 PM (1)
Jun 02, 2-3 PM (2)
Jun 02, 3-4 PM (1)
Jun 02, 4-5 PM (0)
Jun 02, 5-6 PM (0)
Jun 02, 6-7 PM (2)
Jun 02, 7-8 PM (2)
Jun 02, 8-9 PM (2)
Jun 02, 9-10 PM (0)
Jun 02, 10-11 PM (3)
Jun 02, 11-12 AM (0)
Jun 03, 12-1 AM (0)
Jun 03, 1-2 AM (0)
Jun 03, 2-3 AM (2)
Jun 03, 3-4 AM (0)
Jun 03, 4-5 AM (0)
Jun 03, 5-6 AM (0)
Jun 03, 6-7 AM (0)
Jun 03, 7-8 AM (0)
Jun 03, 8-9 AM (0)
Jun 03, 9-10 AM (0)
Jun 03, 10-11 AM (0)
Jun 03, 11-12 PM (2)
Jun 03, 12-1 PM (0)
Jun 03, 1-2 PM (2)
Jun 03, 2-3 PM (0)
Jun 03, 3-4 PM (1)
Jun 03, 4-5 PM (1)
Jun 03, 5-6 PM (2)
Jun 03, 6-7 PM (5)
Jun 03, 7-8 PM (3)
Jun 03, 8-9 PM (8)
Jun 03, 9-10 PM (1)
Jun 03, 10-11 PM (3)
Jun 03, 11-12 AM (0)
Jun 04, 12-1 AM (0)
128 commits this week May 28, 2026 - Jun 04, 2026
fix(logging): address PR review on #1647
- emit unknown logging format/level warnings to stderr so a high
  configured level (e.g. error) can't suppress the format warning
  (CodeRabbit)
- accept --logging-format/--logging-level case-insensitively via
  transformStringFlag + normalizeLoggingValue, matching --run-mode/--storage-mode
  (CodeRabbit); drop the now-unused shorthand param from transformStringFlag
- TestLoad_LoggingFromYAML unsets DINGO_LOGGING_* so a developer's exported
  env vars can't override the YAML values under test (cubic)

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
feat(logging): selectable text/json log output via logging config
Add logging.format (text|json) and logging.level (debug|info|warn|error)
config, env vars DINGO_LOGGING_FORMAT/DINGO_LOGGING_LEVEL, and
--logging-format/--logging-level flags. commonRun now builds the slog handler
from config via a testable newLogger(); --debug stays the highest-precedence
override (forces debug + source). JSON output is for ELK/Loki ingestion.

BEHAVIOR CHANGE: the default output format is now text. Previously commonRun
hardcoded a JSON handler, so deployments parsing dingo's stdout as JSON must
set logging.format=json (or DINGO_LOGGING_FORMAT=json).

Updates dingo.yaml.example and README env-var list. Closes #1647.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
test(backfill): benchmark fixed-shape utxo writer vs GORM
Add a head-to-head ImportUtxos benchmark (fixed-shape vs the prior GORM
CreateInBatches path) on the heaviest flush table, complementing the existing
key_witness pair. With -benchmem the fixed-shape writers cut allocations
~3.5-4.8x (e.g. key_witness 3.6k vs 17.4k allocs/op; utxo 3.8k vs 13.4k) and
wall-clock by ~7-32% depending on row width.

Phase 5 of #2458.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
perf(backfill): per-tx transaction upsert via INSERT...RETURNING id
Replace the GORM upsert + conditional follow-up SELECT in
SetTransactionBatched with a fixed-shape INSERT ... ON CONFLICT(hash) DO
NOTHING RETURNING id. A returned id is a fresh insert (the common path, now one
statement). On conflict the row exists (a retry): preserve the prior DO UPDATE
on block_hash/block_index/slot, refetch the id, and keep needsIdFetch so stale
child rows are deleted before re-insert. transactionCols is pinned by the
schema-guard test; the #2459 two-pass test covers the retry path.

Phase 4 of #2458.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
perf(backfill): batchSpendUtxos uses a stable per-row UPDATE
Replace the per-chunk dynamic CASE UPDATE (whose SQL shape changed with
the chunk, preventing prepared-statement reuse) with a single stable per-row
UPDATE executed on the raw conn pool and reused via PrepareStmt. The
deleted_slot = 0 guard is kept, so re-applying a spend on an already-spent row
is a no-op (resumed backfill and the #2459 create-before-spend ordering rely on
this). Adds a guard test; TestFlushBatch_MultipleSpends now covers the per-row
path.

Phase 3 of #2458.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
perf(backfill): fixed-shape SQL for importUtxosWithDB utxo/asset inserts
Replace the two GORM CreateInBatches loops in importUtxosWithDB with stable
multi-row INSERTs on the raw conn pool, keeping the ON CONFLICT DO NOTHING
targets. execRawOnConn now returns rows-affected, preserving the
hydration-candidate detection. A raw INSERT does not write back autoincrement
IDs, but BatchRefetchUtxoIDs already recovers them by (tx_id, output_idx) for
asset linking; asset-stripping and provenance hydration are unchanged.
types.Uint64's Valuer (decimal string) keeps amount storage byte-identical.
Adds a round-trip test (catches column-order drift) and a conflict-idempotency
test, and extends the schema-guard test to utxo/asset.

Phase 2 of #2458.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
perf(backfill): fixed-shape SQL for FlushBatch child-table writers
Replace GORM CreateInBatches for key_witness, witness_scripts, script,
plutus_data, redeemer, and address_transaction with stable multi-row INSERTs
executed on the transaction's raw conn pool (db.Statement.ConnPool), which
avoids GORM's per-call model reflection and its []byte arg expansion while
still using the write pool's PrepareStmt cache. Conflict semantics are kept
(scripts: ON CONFLICT(hash) DO NOTHING; delete-first retry for the rest). A
schema-guard test pins the column lists to the migrated schema. ~32%% faster
than CreateInBatches for 1000 key_witness rows.

Phase 1 of #2458.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
fix(backfill): use in-flight produced outputs for same-batch provenance lookups (#2481)
* fix(backfill): use in-flight produced outputs for same-batch provenance lookups

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>

* fix(backfill): repair existing spent rows before in-flight short-circuit

Address review: ensureTransactionConsumedUtxos must run the metadata lookup
and same-slot spender-link repair before skipping in-flight producers. On a
resumed backfill an existing row can be DeletedSlot==point.Slot with a nil
SpentAtTxId; skipping the repair would leave it partially written because
batchSpendUtxos only updates rows where deleted_slot=0. Add a two-pass
regression test.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>

---------

Signed-off-by: Chris Guiney <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>