@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 +84 -0
- package/generate_bp_pi_report.sh +57 -7
- package/package.json +1 -1
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
|
package/generate_bp_pi_report.sh
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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\`,
|
|
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
|