@blinklabs/dingo 0.37.0 → 0.39.0

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/.dockerignore CHANGED
@@ -1,5 +1,8 @@
1
+ .claude/
2
+ .codex
1
3
  .dingo/
2
4
  .github/
5
+ .worktrees/
3
6
  dingo
4
7
  Dockerfile
5
8
  README.md
package/RELEASE_NOTES.md CHANGED
@@ -1,6 +1,116 @@
1
1
  # Release Notes
2
2
 
3
3
 
4
+ ## v0.38.0 (April 29, 2026)
5
+
6
+ **Title:** Smarter sync decisions, clearer operations, and ready made dashboards
7
+
8
+ **Date:** April 29, 2026
9
+
10
+ **Version:** v0.38.0
11
+
12
+ Hi folks! Here’s what we shipped in v0.38.0.
13
+
14
+ ### ✨ What's New
15
+
16
+ * Added **inbound peer controls and visibility:** Operators can now track how inbound peers are accepted, denied, warmed, promoted, cooled down, and pruned, which makes public relays easier to tune and unsolicited traffic easier to manage.
17
+ * Expanded **dashboard based monitoring setup:** Operators can now deploy a full Grafana dashboard bundle with Prometheus scrape settings, alert rules, provisioning files, and setup guidance, which makes node monitoring faster to stand up.
18
+ * Introduced **parallel backup block delivery near tip:** Nodes can now request the same near tip block range from a second suitable peer and prefer the faster response, which keeps sync steadier when multiple peers report the same tip.
19
+ * Delivered **structured era mismatch errors:** Integrations can now detect era mismatch failures through consistent error details instead of relying on plain text parsing.
20
+ * Surfaced **earlier era transition stability signals:** Operators and integrators can now see when an upcoming era transition has effectively stabilized before the epoch boundary arrives, which makes planning safer around governance driven changes.
21
+
22
+ ### 💪 Improvements
23
+
24
+ * Improved **one step era advancement safety:** Era changes now advance one boundary at a time, which avoids skipping required transition handling when the chain crosses into a new era.
25
+ * Refined **future protocol setting audit guidance:** Maintainers now have a clearer note about a future audit at era boundaries, which makes upcoming governance work easier to track.
26
+ * Enhanced **Windows and macOS build reliability:** Automation now avoids platform specific native linker issues on Windows and macOS, which keeps routine build verification steadier.
27
+ * Modernized **Windows test stability on slower runners:** Automation now gives slower Windows runners more room to finish successfully, which reduces avoidable test failures.
28
+ * Updated **OpenTelemetry stdout tracing support:** Tracing support now stays current with the newer `go.opentelemetry.io/otel/exporters/stdout/stdouttrace` release.
29
+ * Refreshed **Connect API compatibility:** Connect based integrations now stay current with the newer `connectrpc.com/connect` release.
30
+ * Advanced **AWS S3 integration currency:** S3 backed workflows now stay aligned with the newer `github.com/aws/aws-sdk-go-v2/service/s3` release.
31
+ * Polished **AWS client compatibility:** AWS backed components now stay aligned with the newer `github.com/aws/smithy-go` release.
32
+ * Completed **v0.37.0 release history refresh:** Release history now includes the refreshed v0.37.0 notes entry for easier scanning.
33
+
34
+ ### 🔧 Fixes
35
+
36
+ * Fixed **active block download continuity during peer switches:** Near tip sync can now keep a block download moving even when the best peer changes, which reduces the chance of repeated restarts during equal tip switching.
37
+ * Corrected **stale nonce cleanup after rollbacks:** Rollback recovery now removes outdated nonce data after fork changes and while loading tip state, which keeps nonce dependent behavior aligned with the active chain.
38
+ * Hardened **async block delivery failure reporting:** Connection error handling now surfaces asynchronous block delivery failures, which makes stuck or failed block delivery easier to detect.
39
+ * Stabilized **connection setup diagnostics:** Connection failure logs now include the remote peer address, which makes troubleshooting failed handshakes easier.
40
+
41
+ ### 📋 What You Need to Know
42
+
43
+ * Adopt the new Grafana and Prometheus dashboard bundle and alert rules to monitor Dingo nodes more quickly.
44
+ * Expect steadier near-tip sync and smoother equal-tip peer switching because shadow blockfetch, latency aware peer choice, preserved in-flight batches, and clearer blockfetch failure reporting now work together.
45
+ * Note more explicit era and hard-fork handling because Dingo now surfaces upcoming transition stability earlier, advances only one era at a time, and returns typed era mismatch errors.
46
+ * Review the dependency refreshes and the updated v0.37.0 release history entry when maintaining integrations and internal release records.
47
+
48
+ ### Recommended Network Compatibility ⚠️
49
+
50
+ | Network | Compatible |
51
+ |---------------------|------------|
52
+ | mainnet | ⛔ |
53
+ | preprod-testnet | ⛔ |
54
+ | preview-testnet | ✅ |
55
+
56
+ ### 🙏 Thank You
57
+
58
+ Thank you for trying!
59
+
60
+ ---
61
+
62
+ ## v0.37.0 (April 27, 2026)
63
+
64
+ **Title:** Genesis bootstrap, governance, and steadier Mithril recovery
65
+
66
+ **Date:** April 27, 2026
67
+
68
+ **Version:** v0.37.0
69
+
70
+ Hi folks! Here’s what we shipped in v0.37.0.
71
+
72
+ ### ✨ What's New
73
+
74
+ * Added **Ouroboros Genesis bootstrap support:** Operators can now start from Genesis bootstrap flows, which gives early sync a clearer path before the node reaches the current chain tip.
75
+ * Expanded **Genesis mode chain selection:** Nodes can now choose the chain more safely during Genesis mode, which keeps early sync aligned with the right history.
76
+ * Introduced **bootstrap aware peer promotion:** Peer promotion now accounts for bootstrap state, which helps early sync keep useful peers active while the node is still catching up.
77
+ * Delivered **Conway governance ratification support:** Governance aware services can now track ratified actions more completely as Conway governance advances.
78
+ * Enabled **Conway governance enactment handling:** Governance state now follows enacted actions more accurately, which gives operators and integrators a clearer view of active governance outcomes.
79
+ * Preserved **committee quorum persistence:** Committee quorum information now persists across restarts, which keeps governance state steadier after interruptions.
80
+ * Opened **broader governance state handling:** Governance aware integrations can now read and handle more of the Conway governance state without losing important context.
81
+ * Unlocked **new Blockfrost compatible block endpoints:** Blockfrost compatible users can now retrieve additional block details through new block endpoints.
82
+ * Extended **new Blockfrost compatible network endpoints:** Network status integrations can now access new network endpoints in a Blockfrost compatible shape.
83
+ * Introduced **new Blockfrost compatible era endpoints:** Era aware clients can now request era information through new Blockfrost compatible endpoints.
84
+ * Added **new Blockfrost compatible genesis endpoints:** Genesis data is now available through new Blockfrost compatible endpoints for services that need network bootstrap details.
85
+
86
+ ### 💪 Improvements
87
+
88
+ * Improved **newer Mithril snapshot compatibility:** Bootstrap runs now accept newer snapshot shapes more reliably, which makes setup and recovery smoother across current Mithril data.
89
+ * Refined **interrupted Mithril resume safety:** Resuming after an interrupted Mithril run now behaves more safely, which reduces the chance of a broken recovery path.
90
+ * Enhanced **bootstrap aware peer governance:** Peer promotion and selection now align more closely with bootstrap state, which helps early sync keep useful peers active.
91
+ * Modernized **bootstrap and governance observability:** Operators can now see more metrics and event signals around bootstrap and governance behavior.
92
+ * Updated **operator and integrator guidance:** Documentation and workflow refreshes make recent bootstrap, governance, and API behavior easier to follow.
93
+
94
+ ### 🔧 Fixes
95
+
96
+ * Fixed **Mithril bootstrap resume reliability:** Mithril bootstrap and resume handling now recover more reliably when a previous run stopped before completion.
97
+ * Corrected **snapshot bootstrap handling:** Snapshot based bootstrap flows now handle current snapshot layouts correctly, which reduces failed setup paths.
98
+ * Hardened **early sync recovery behavior:** Recovery during early sync now follows Genesis mode chain selection and bootstrap aware promotion more safely after interruptions.
99
+ * Stabilized **governance state continuity:** Governance state now keeps ratification, enactment, and committee quorum handling steadier across restarts and replay.
100
+
101
+ ### 📋 What You Need to Know
102
+
103
+ * Clarified **Genesis bootstrap rollout:** Ouroboros Genesis bootstrap changes early sync behavior, including Genesis mode chain selection and bootstrap aware peer promotion.
104
+ * Highlighted **governance support growth:** Conway governance coverage now reaches ratification, enactment, committee quorum persistence, and broader governance state handling.
105
+ * Emphasized **steadier Mithril recovery:** Mithril bootstrap and resume handling now work more reliably with newer snapshot shapes and safer interrupted resume behavior.
106
+ * Summarized **expanded Blockfrost compatibility:** Blockfrost compatible users can now use new block, network, era, and genesis endpoints.
107
+
108
+ ### 🙏 Thank You
109
+
110
+ Thank you for trying!
111
+
112
+ ---
113
+
4
114
  ## v0.36.1 (April 21, 2026)
5
115
 
6
116
  **Title:** Steadier catch-up sync and refreshed integrations
@@ -136,6 +136,12 @@ topology: ""
136
136
  # CLI: --metrics-port
137
137
  metricsPort: 12798
138
138
 
139
+ # TCP port to bind for pprof debug endpoints (heap, profile, goroutine, etc).
140
+ # 0 disables. Operators opt in; never enable in production by default — debug
141
+ # endpoints expose internal state and run on a separate listener from metrics.
142
+ # CLI: --debug-port Env: DINGO_DEBUG_PORT
143
+ debugPort: 0
144
+
139
145
  # Internal/private address to bind for listening for Ouroboros NtC
140
146
  privateBindAddr: "127.0.0.1"
141
147
 
@@ -180,10 +186,6 @@ meshPort: 8080
180
186
  # CLI: --bark-url
181
187
  barkBaseUrl: ""
182
188
 
183
- # number of slots from tip within which blocks
184
- # will not be found in the bark archive
185
- barkSecurityWindow: 10000
186
-
187
189
  # TCP port bind for listening for bark RPC calls
188
190
  # CLI: --bark-port
189
191
  barkPort: 0
@@ -0,0 +1,188 @@
1
+ # Dingo Grafana Dashboards
2
+
3
+ Monitoring dashboards for [Dingo](https://github.com/blinklabs-io/dingo), the Go Cardano node by Blink Labs.
4
+
5
+ ## Dashboards
6
+
7
+ | Dashboard | File | Description |
8
+ |-----------|------|-------------|
9
+ | **Node Overview** | `node-overview.json` | At-a-glance header (epoch, slot, tip gap, density, blockfetch, mempool, KES, peers, storage, runtime), block height, epoch progress, forging stats |
10
+ | **Block Production** | `block-production.json` | Forge latency heatmap, block delay CDFs, forge rates, KES lifecycle |
11
+ | **Peer Health** | `peer-health.json` | Hot/warm/cold peers, connection types, peer state timeseries, promotions/demotions, network I/O |
12
+ | **Mempool** | `mempool.json` | Pending TXs, mempool size, TX lifecycle, CBOR cache, event bus |
13
+ | **Resource Usage** | `resources.json` | CPU, memory, GC heatmap, disk I/O, IOPS, PSI pressure, Badger, file descriptors |
14
+
15
+ `full-panel.json` contains the standalone Business Text header panel for embedding into custom dashboards.
16
+
17
+ ## Prerequisites
18
+
19
+ Before you begin, make sure you have:
20
+
21
+ - **Grafana 12+** (tested on 12.4) — [install guide](https://grafana.com/docs/grafana/latest/setup-grafana/installation/)
22
+ - **Prometheus** scraping your Dingo node on port `12798` (configured in step 2 below)
23
+ - **Dingo** node with metrics enabled (default port `12798`)
24
+ - **[Business Text plugin](https://grafana.com/grafana/plugins/marcusolsson-dynamictext-panel/)** — required by all dashboards for the header panel
25
+ - **[prometheus-node-exporter](https://github.com/prometheus/node_exporter)** — required only by the Resource Usage dashboard for host-level CPU, memory, and disk metrics
26
+
27
+ ## Quick start
28
+
29
+ ### 1. Install the Business Text plugin
30
+
31
+ Open a terminal on the machine running Grafana and run:
32
+
33
+ ```bash
34
+ grafana-cli plugins install marcusolsson-dynamictext-panel
35
+ sudo systemctl restart grafana-server
36
+ ```
37
+
38
+ If you are running Grafana in Docker or Kubernetes, set the environment variable instead:
39
+
40
+ ```text
41
+ GF_INSTALL_PLUGINS=marcusolsson-dynamictext-panel
42
+ ```
43
+
44
+ ### 2. Configure Prometheus scrape targets
45
+
46
+ Prometheus needs to know where to find your Dingo node. Add the following to your `prometheus.yml` under `scrape_configs`:
47
+
48
+ ```yaml
49
+ - job_name: dingo
50
+ scrape_interval: 15s
51
+ static_configs:
52
+ - targets: ['localhost:12798']
53
+
54
+ # Optional: required for Resource Usage dashboard
55
+ - job_name: node
56
+ scrape_interval: 15s
57
+ static_configs:
58
+ - targets: ['localhost:9100']
59
+ ```
60
+
61
+ Then reload Prometheus to apply the change:
62
+
63
+ ```bash
64
+ sudo systemctl reload prometheus
65
+ ```
66
+
67
+ ### 3. Import dashboards
68
+
69
+ There are two ways to get the dashboards into Grafana.
70
+
71
+ **Option A: Provisioning (recommended)**
72
+
73
+ Provisioning automatically loads dashboards from files on disk. Grafana will pick them up on startup or within about 30 seconds if already running.
74
+
75
+ ```bash
76
+ sudo cp docs/dashboards/provisioning.yaml /etc/grafana/provisioning/dashboards/dingo.yaml
77
+ sudo mkdir -p /var/lib/grafana/dashboards/dingo
78
+ sudo cp docs/dashboards/*.json /var/lib/grafana/dashboards/dingo/
79
+ sudo chown -R grafana:grafana /var/lib/grafana/dashboards/dingo/
80
+ sudo systemctl restart grafana-server
81
+ ```
82
+
83
+ After restarting, go to **Dashboards → Browse** in the Grafana UI and search for "Dingo". All five dashboards appear in a **Dingo** folder automatically.
84
+
85
+ **Note:** `allowUiUpdates: true` lets you edit dashboards in the Grafana UI, but changes will be overwritten on the next provision cycle (every 30 seconds). To make permanent edits, modify the JSON files directly.
86
+
87
+ **Option B: Manual import**
88
+
89
+ 1. Open Grafana in your browser
90
+ 2. Go to **Dashboards → New → Import**
91
+ 3. Upload each JSON file
92
+ 4. Select your Prometheus datasource when prompted
93
+
94
+ ### 4. Alert rules (optional)
95
+
96
+ The alert rules file is ready to use as-is — no editing required.
97
+
98
+ Copy the file to your Prometheus rules directory:
99
+
100
+ ```bash
101
+ sudo cp docs/dashboards/alerts.yaml /etc/prometheus/rules/dingo.yaml
102
+ ```
103
+
104
+ Then add it to `prometheus.yml`:
105
+
106
+ ```yaml
107
+ rule_files:
108
+ - /etc/prometheus/rules/dingo.yaml
109
+ ```
110
+
111
+ Reload Prometheus:
112
+
113
+ ```bash
114
+ sudo systemctl reload prometheus
115
+ ```
116
+
117
+ ## Datasource
118
+
119
+ All dashboards expect a Prometheus datasource with UID `prometheus`. If your datasource has a different UID, update it before importing or recreate the datasource with UID `prometheus`.
120
+
121
+ ## Template variables
122
+
123
+ All dashboards include two template variables that auto-discover dingo instances:
124
+
125
+ | Variable | Query | Purpose |
126
+ |----------|-------|---------|
127
+ | `$network` | `label_values(dingo_build_info, network)` | Selects the Cardano network (`preview`, `preprod`, `mainnet`). |
128
+ | `$instance` | `label_values(dingo_build_info{network="$network"}, instance)` | Selects specific dingo instance(s). Multi-select with "All" default. |
129
+
130
+ `dingo_build_info` is a metric only dingo exposes (includes `network`, `version`, `commit` labels). This ensures dropdowns show only dingo targets, never Haskell cardano-node.
131
+
132
+ All panel queries use `{network="$network", instance=~"$instance"}` as their selector.
133
+
134
+ The **Resource Usage** dashboard adds a third variable:
135
+
136
+ | Variable | Query | Purpose |
137
+ |----------|-------|---------|
138
+ | `$node_instance` | `label_values(node_uname_info, instance)` | Selects the node_exporter target for host-level metrics (CPU, memory, disk, network). node_exporter runs on a different port (default `9100`) from the dingo metrics port, so it needs its own instance dropdown. |
139
+
140
+ Set `$node_instance` to the hostname/port reported by your node_exporter scrape target (typically `localhost:9100` or the host IP).
141
+
142
+ ## Navigation
143
+
144
+ Dashboard-level links at the top of each dashboard connect all 5 dashboards. Links preserve the selected time range and template variables.
145
+
146
+ ## Dormant metrics
147
+
148
+ Some metrics only emit when their feature is active. Panels display "No data" until activated:
149
+
150
+ | Metric | Activates when |
151
+ |--------|---------------|
152
+ | `cardano_node_metrics_Forge_node_is_leader_int` | Forging is enabled |
153
+ | `cardano_node_metrics_Forge_adopted_int` | Block is forged and adopted |
154
+ | `cardano_node_metrics_blockForgingLatency_seconds_bucket` | Block is forged |
155
+ | `cardano_node_metrics_remainingKESPeriods_int` | KES key is configured |
156
+ | `dingo_forge_tip_gap_slots` | Forging is enabled |
157
+ | `dingo_database_size_bytes` | Database stores are initialized |
158
+ | `database_blob_*` | Badger blob store is active |
159
+
160
+ ## File listing
161
+
162
+ ```text
163
+ docs/dashboards/
164
+ node-overview.json Node Overview dashboard
165
+ block-production.json Block Production dashboard
166
+ peer-health.json Peer Health dashboard
167
+ mempool.json Mempool dashboard
168
+ resources.json Resource Usage dashboard
169
+ full-panel.json Business Text header panel (standalone)
170
+ provisioning.yaml Grafana provisioning config
171
+ prometheus.yaml Prometheus scrape config snippet
172
+ alerts.yaml Prometheus alert rules
173
+ README.md This file
174
+ ```
175
+
176
+ ## Troubleshooting
177
+
178
+ **Business Text plugin not found / panels show "Panel plugin not found: marcusolsson-dynamictext-panel"**
179
+ Install the plugin (step 1 above) and restart Grafana. If running in a managed environment, add `marcusolsson-dynamictext-panel` to your `GF_INSTALL_PLUGINS` list.
180
+
181
+ **Panels show "No data"**
182
+ Check that Prometheus is scraping your Dingo node: open Prometheus in the browser, go to **Status → Targets**, and confirm the `dingo` job is up. Also verify the `$network` and `$instance` template variables at the top of the dashboard are set to the correct values.
183
+
184
+ **Datasource UID mismatch ("datasource not found")**
185
+ All JSON files use the datasource UID `prometheus`. If your Prometheus datasource has a different UID, either rename it to `prometheus` in **Connections → Data sources**, or do a find-and-replace of `"prometheus"` with your actual UID in the JSON files before importing.
186
+
187
+ **Dashboards not appearing after provisioning**
188
+ Confirm `/etc/grafana/provisioning/dashboards/dingo.yaml` references the correct path. Grafana auto-reloads provisioned dashboards every 30 seconds; if it hasn't appeared after a minute, check the Grafana log (`journalctl -u grafana-server`) for errors.
@@ -0,0 +1,29 @@
1
+ groups:
2
+ - name: dingo
3
+ rules:
4
+ - alert: DingoBlockStall
5
+ expr: changes(cardano_node_metrics_blockNum_int{network=~".+"}[5m]) == 0
6
+ for: 0m
7
+ labels:
8
+ severity: warning
9
+ annotations:
10
+ summary: "Dingo block height stalled on {{ $labels.network }}"
11
+ description: "Node {{ $labels.instance }} on {{ $labels.network }}: block height has not changed in 5 minutes."
12
+
13
+ - alert: DingoSlotDrift
14
+ expr: changes(cardano_node_metrics_slotNum_int{network=~".+"}[2m]) == 0
15
+ for: 0m
16
+ labels:
17
+ severity: warning
18
+ annotations:
19
+ summary: "Dingo slot counter stalled on {{ $labels.network }}"
20
+ description: "Node {{ $labels.instance }} on {{ $labels.network }}: slot counter has not advanced in 2 minutes."
21
+
22
+ - alert: DingoPeerLoss
23
+ expr: cardano_node_metrics_connectionManager_outgoingConns{network=~".+"} == 0
24
+ for: 5m
25
+ labels:
26
+ severity: critical
27
+ annotations:
28
+ summary: "Dingo has no outgoing peers on {{ $labels.network }}"
29
+ description: "Node {{ $labels.instance }} on {{ $labels.network }}: zero outgoing connections for 5+ minutes. Node cannot sync."
@@ -0,0 +1,16 @@
1
+ ## Prometheus scrape configuration for Dingo dashboards
2
+ ##
3
+ ## Add these jobs to your prometheus.yml under scrape_configs:
4
+
5
+ scrape_configs:
6
+ # Dingo node metrics (default port 12798)
7
+ - job_name: dingo
8
+ scrape_interval: 15s
9
+ static_configs:
10
+ - targets: ['localhost:12798']
11
+
12
+ # Node exporter for host-level metrics (required by Resource Usage dashboard)
13
+ - job_name: node
14
+ scrape_interval: 15s
15
+ static_configs:
16
+ - targets: ['localhost:9100']
@@ -0,0 +1,14 @@
1
+ apiVersion: 1
2
+
3
+ providers:
4
+ - name: dingo
5
+ orgId: 1
6
+ folder: Dingo
7
+ folderUid: dingo-dashboards
8
+ type: file
9
+ disableDeletion: false
10
+ updateIntervalSeconds: 30
11
+ allowUiUpdates: true
12
+ options:
13
+ path: /var/lib/grafana/dashboards/dingo
14
+ foldersFromFilesStructure: false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blinklabs/dingo",
3
- "version": "0.37.0",
3
+ "version": "0.39.0",
4
4
  "description": "Dingo is a Cardano blockchain data node",
5
5
  "main": "index.js",
6
6
  "bin": {