@blinklabs/dingo 0.27.2 → 0.27.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/RELEASE_NOTES.md CHANGED
@@ -1,6 +1,90 @@
1
1
  # Release Notes
2
2
 
3
3
 
4
+ ## v0.27.3 (March 17, 2026)
5
+
6
+ **Title:** Safer rollbacks and steadier leader election
7
+
8
+ **Date:** March 17, 2026
9
+
10
+ **Version:** v0.27.3
11
+
12
+ Hi folks! Here’s what we shipped in v0.27.3.
13
+
14
+ ### ✨ What's New
15
+
16
+ - **Follow-tip reset and rollback:** Tip tracking is easier to manage because the follow-tip API now supports safe reset and rollback with clearer metadata about what changed.
17
+ - **Leader election readiness:** Block producer readiness is easier to track because leader election now surfaces epoch-nonce readiness and carries schedule state more reliably across restarts.
18
+
19
+ ### 💪 Improvements
20
+
21
+ - **More consistent cache sizing:** Sizing runs are easier to tune because cache defaults are more consistent and the BP/PI sizing script now supports explicit memory limits and optional cache overrides.
22
+ - **Predictable KES period semantics:** Operational certificate (KES) periods are more predictable because KES endpoints now standardize on absolute periods while translating internally from the certificate start period.
23
+ - **Preserved original block bytes:** Downstream tooling can retain exact block bytes because API block objects now include the original encoded bytes.
24
+ - **Standard network identifiers from genesis:** Network identification is simpler because genesis reads now return a standard CAIP-2 network identifier derived from network magic.
25
+ - **Smoother peer switching:** Sync stays more rock-solid because chain-sync now preserves its state while only swapping the active connection during a peer switch.
26
+ - **More consistent Mithril imports:** Mithril snapshot imports are more consistent across epochs because imports now normalize snapshot types and centralize persistence and epoch-summary handling.
27
+ - **Protocol dependency validation:** Modern-era transaction handling is more reliable because protocol dependencies were updated and regression tests now guard transaction size behavior.
28
+ - **Safer default containers:** Default containers are safer because the main Docker image now runs as a non-root `dingo` user.
29
+
30
+ ### 🔧 Fixes
31
+
32
+ - **Resilient background monitoring:** Long-running monitoring is more rock-solid because the stall checker now recovers from panics instead of crashing its background loop.
33
+ - **Robust block fetch batching:** Block fetch serving is more robust because batching now handles iterator errors and connection closes correctly.
34
+ - **Clearer unexpected event handling:** Event processing is easier to debug because chain-sync and block fetch now log unexpected event payload types instead of failing silently.
35
+ - **Reliable shutdown error reporting:** Shutdowns are easier to troubleshoot because node and metrics server shutdown now propagates errors instead of exiting abruptly.
36
+ - **Clear tx-submission failures:** Transaction submission fails more clearly because the tx-submission handlers now return an explicit error when no mempool consumer exists.
37
+
38
+ ### 📋 What You Need to Know
39
+
40
+ - **Docker volume permissions:** If you run Dingo in Docker with mounted volumes, make sure the data directory is writable by the `dingo` user inside the container.
41
+ - **API integrations:** If you integrate with follow-tip or KES APIs, give your client code a quick check for the updated reset/rollback and period semantics.
42
+
43
+ ### 🙏 Thank You
44
+
45
+ Thank you for trying!
46
+
47
+ ---
48
+
49
+ ## v0.27.2 (March 16, 2026)
50
+
51
+ **Title:** Snapshot events and safer services
52
+
53
+ **Date:** March 16, 2026
54
+
55
+ **Version:** v0.27.2
56
+
57
+ Hi folks! Here’s what we shipped in v0.27.2.
58
+
59
+ ### ✨ What's New
60
+
61
+ - **Snapshot event publishing and clean shutdown:** Relay operation is more reliable because the relay now publishes events from snapshots and shuts down cleanly without dropping in-flight work.
62
+
63
+ ### 💪 Improvements
64
+
65
+ - **HTTP timeouts for public APIs:** Network-facing services are more resilient under slow or stalled connections thanks to new write/read/idle timeouts on the Bark, Blockfrost, and UTxO RPC HTTP servers.
66
+ - **Streamlined peer and connection management:** Peer and connection management is faster and uses fewer resources on constrained machines thanks to quicker inbound host lookups, tighter Badger cache defaults, and expanded benchmarks and sizing guidance.
67
+ - **More consistent key-period handling:** Block production key period handling is more consistent across configurations thanks to improved key-period calculations with added validation and tests.
68
+ - **Race detection in CI:** Test runs catch concurrency bugs earlier because the Linux test job now runs with the Go race detector enabled.
69
+
70
+ ### 🔧 Fixes
71
+
72
+ - **Safer concurrent chain reads:** Reads are more consistent under load because primary chain and protocol-parameter access are now protected with read locks.
73
+ - **Validated epoch nonce reuse:** Nonce reuse is safer because cached epoch nonce entries are now validated against the nonce provided for the current run before reuse.
74
+ - **Graceful invalid hash handling:** Malformed block metadata no longer crashes encoding because previous-hash length issues now return errors instead of panicking.
75
+ - **SQLite VACUUM actually runs:** Database maintenance now completes as intended because SQLite VACUUM is now executed rather than only prepared.
76
+
77
+ ### 📋 What You Need to Know
78
+
79
+ - **Release notes alignment:** Release documentation was updated to reflect the final set of changes, including a detailed v0.27.1 section in `RELEASE_NOTES.md`.
80
+ - **Build provenance updates:** Supply-chain attestations are easier to verify because build provenance now uses `actions/attest` and updated Docker Hub image subjects.
81
+
82
+ ### 🙏 Thank You
83
+
84
+ Thank you for trying!
85
+
86
+ ---
87
+
4
88
  ## v0.27.1 (March 16, 2026)
5
89
 
6
90
  **Title:** Smoother reconnects and safer chain-sync
@@ -8,6 +8,11 @@ CACHE_DIR="${CACHE_DIR:-/tmp/dingo-bp-pi-go-cache}"
8
8
  GOMAXPROCS_VALUE="${GOMAXPROCS_VALUE:-4}"
9
9
  BENCH_TIME="${BENCH_TIME:-5s}"
10
10
  IMMUTABLE_PATH="${IMMUTABLE_PATH:-database/immutable/testdata}"
11
+ RSS_LIMIT_MB="${RSS_LIMIT_MB:-1024}"
12
+ GOMEMLIMIT_VALUE="${GOMEMLIMIT_VALUE:-}"
13
+ BLOCK_CACHE_SIZE_VALUE="${BLOCK_CACHE_SIZE_VALUE:-}"
14
+ INDEX_CACHE_SIZE_VALUE="${INDEX_CACHE_SIZE_VALUE:-}"
15
+ MEMTABLE_SIZE_VALUE="${MEMTABLE_SIZE_VALUE:-}"
11
16
  DEFAULT_DB_DIR="${DEFAULT_DB_DIR:-}"
12
17
  DEFAULT_LOG_FILE="${DEFAULT_LOG_FILE:-}"
13
18
  DB_DIR_BASE="${DB_DIR_BASE:-/tmp}"
@@ -16,6 +21,7 @@ TIME_FORMAT_STYLE=""
16
21
  TIME_CMD=()
17
22
  AUTO_DEFAULT_DB_DIR=0
18
23
  AUTO_DEFAULT_LOG_FILE=0
24
+ DINGO_CACHE_ARGS=()
19
25
 
20
26
  cleanup() {
21
27
  local exit_status=$?
@@ -197,18 +203,25 @@ run_load_profile() {
197
203
  validate_db_dir "$db_dir" "$log_file"
198
204
  rm -rf "$db_dir"
199
205
  : > "$log_file"
206
+ local -a env_args=(
207
+ PATH="$PATH"
208
+ HOME="${HOME:-/tmp}"
209
+ GOMAXPROCS="$GOMAXPROCS_VALUE"
210
+ DINGO_RUN_MODE=serve
211
+ DINGO_STORAGE_MODE=core
212
+ )
213
+ if [[ -n "$GOMEMLIMIT_VALUE" ]]; then
214
+ env_args+=(GOMEMLIMIT="$GOMEMLIMIT_VALUE")
215
+ fi
200
216
  env -i \
201
- PATH="$PATH" \
202
- HOME="${HOME:-/tmp}" \
203
- GOMAXPROCS="$GOMAXPROCS_VALUE" \
204
- DINGO_RUN_MODE=serve \
205
- DINGO_STORAGE_MODE=core \
217
+ "${env_args[@]}" \
206
218
  "${TIME_CMD[@]}" \
207
219
  ./dingo \
208
220
  --config /dev/null \
209
221
  --blob badger \
210
222
  --metadata sqlite \
211
223
  --data-dir "$db_dir" \
224
+ "${DINGO_CACHE_ARGS[@]}" \
212
225
  load "$IMMUTABLE_PATH" "$@" \
213
226
  > "$log_file" 2>&1
214
227
 
@@ -231,6 +244,16 @@ parse_metric() {
231
244
 
232
245
  configure_time_cmd
233
246
 
247
+ if [[ -n "$BLOCK_CACHE_SIZE_VALUE" ]]; then
248
+ DINGO_CACHE_ARGS+=(--block-cache-size "$BLOCK_CACHE_SIZE_VALUE")
249
+ fi
250
+ if [[ -n "$INDEX_CACHE_SIZE_VALUE" ]]; then
251
+ DINGO_CACHE_ARGS+=(--index-cache-size "$INDEX_CACHE_SIZE_VALUE")
252
+ fi
253
+ if [[ -n "$MEMTABLE_SIZE_VALUE" ]]; then
254
+ DINGO_CACHE_ARGS+=(--memtable-size "$MEMTABLE_SIZE_VALUE")
255
+ fi
256
+
234
257
  DB_DIR_BASE="$(resolve_path "$DB_DIR_BASE")"
235
258
 
236
259
  if [[ -z "$DEFAULT_DB_DIR" ]]; then
@@ -279,6 +302,12 @@ if [[ ! "$default_rss_kb" =~ ^[0-9]+$ ]]; then
279
302
  fi
280
303
 
281
304
  default_rss_mb="$(awk "BEGIN { printf \"%.1f\", ${default_rss_kb} / 1024 }")"
305
+ rss_limit_kb=$((RSS_LIMIT_MB * 1024))
306
+
307
+ if (( default_rss_kb > rss_limit_kb )); then
308
+ echo "error: peak RSS ${default_rss_mb} MB exceeds limit ${RSS_LIMIT_MB} MB" >&2
309
+ exit 1
310
+ fi
282
311
 
283
312
  {
284
313
  echo "# Four-Thread Block Producer Sizing Report (Non-Pi Host)"
@@ -287,7 +316,23 @@ default_rss_mb="$(awk "BEGIN { printf \"%.1f\", ${default_rss_kb} / 1024 }")"
287
316
  printf -- "- \`storageMode=core\`\n"
288
317
  printf -- "- \`runMode=serve\`, \`blob=badger\`, \`metadata=sqlite\`\n"
289
318
  printf -- "- \`GOMAXPROCS=%s\`\n" "$GOMAXPROCS_VALUE"
319
+ printf -- "- target peak RSS: \`<= %s MB\`\n" "$RSS_LIMIT_MB"
290
320
  printf -- "- immutable fixture: \`%s\`\n" "$IMMUTABLE_PATH"
321
+ if [[ -n "$GOMEMLIMIT_VALUE" ]]; then
322
+ printf -- "- test-only \`GOMEMLIMIT=%s\`\n" "$GOMEMLIMIT_VALUE"
323
+ fi
324
+ if [[ -n "$BLOCK_CACHE_SIZE_VALUE" || -n "$INDEX_CACHE_SIZE_VALUE" || -n "$MEMTABLE_SIZE_VALUE" ]]; then
325
+ echo "- explicit Badger test-only overrides:"
326
+ if [[ -n "$BLOCK_CACHE_SIZE_VALUE" ]]; then
327
+ printf -- " - \`--block-cache-size=%s\`\n" "$BLOCK_CACHE_SIZE_VALUE"
328
+ fi
329
+ if [[ -n "$INDEX_CACHE_SIZE_VALUE" ]]; then
330
+ printf -- " - \`--index-cache-size=%s\`\n" "$INDEX_CACHE_SIZE_VALUE"
331
+ fi
332
+ if [[ -n "$MEMTABLE_SIZE_VALUE" ]]; then
333
+ printf -- " - \`--memtable-size=%s\`\n" "$MEMTABLE_SIZE_VALUE"
334
+ fi
335
+ fi
291
336
  echo "- measurements were collected on non-Pi hardware and are a sizing proxy, not Raspberry Pi device benchmarks"
292
337
  echo "- block producer peer count remains small; this is not a relay profile"
293
338
  echo
@@ -295,11 +340,16 @@ default_rss_mb="$(awk "BEGIN { printf \"%.1f\", ${default_rss_kb} / 1024 }")"
295
340
  echo
296
341
  echo "| Profile | Elapsed | Peak RSS | Notes |"
297
342
  echo "| --- | --- | --- | --- |"
298
- printf -- "| \`core-default\` | \`%ss\` | \`%s MB\` | Current default \`serve/core\` cache profile |\n" "$default_elapsed" "$default_rss_mb"
343
+ if [[ -n "$BLOCK_CACHE_SIZE_VALUE" || -n "$INDEX_CACHE_SIZE_VALUE" || -n "$MEMTABLE_SIZE_VALUE" || -n "$GOMEMLIMIT_VALUE" ]]; then
344
+ printf -- "| \`core-constrained\` | \`%ss\` | \`%s MB\` | Explicit test-only memory/cache overrides |\n" "$default_elapsed" "$default_rss_mb"
345
+ else
346
+ printf -- "| \`core-default\` | \`%ss\` | \`%s MB\` | Current default \`serve/core\` cache profile |\n" "$default_elapsed" "$default_rss_mb"
347
+ fi
299
348
  echo
300
349
  echo "## Recommendation"
301
350
  echo
302
- printf -- "For Raspberry Pi-class sizing in \`storageMode=core\`, the current default \`serve/core\` profile is already in the measured low-memory range on this four-thread non-Pi host.\n"
351
+ printf -- "For Raspberry Pi-class sizing in \`storageMode=core\`, keep production defaults aligned with normal Badger behavior and use explicit memory/cache constraints only in this harness when validating low-memory targets.\n"
352
+ printf -- "This run stayed under the configured \`%s MB\` RSS limit.\n" "$RSS_LIMIT_MB"
303
353
  echo "Explicit Badger cache settings still override these defaults if an operator wants to tune further."
304
354
  echo "Treat this as a sizing baseline rather than a direct Raspberry Pi hardware measurement."
305
355
  echo
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blinklabs/dingo",
3
- "version": "0.27.2",
3
+ "version": "0.27.4",
4
4
  "description": "Dingo is a Cardano blockchain data node",
5
5
  "main": "index.js",
6
6
  "bin": {