Skip to content

v0.4.0

Latest

Choose a tag to compare

@shayanb shayanb released this 04 May 16:18
f59fd46

v0.4.0 — logosup rebrand + everything since v0.2.2

Headline: the project moves to its own org (logosnode) and the CLI's primary command is now logosup. Both old commands (logos-node, logosnode) keep working forever as aliases. Existing operators run logos-node update once and the CLI auto-migrates the git remote and rebuilds the symlinks — zero manual steps.

This release also bundles ~13 versions of incremental work that landed between v0.2.2 (Apr 14, 2026) and now, none of which were tagged as standalone releases.

Install (new operators)

curl -sL https://raw.githubusercontent.com/logosnode/logosup/main/install.sh | bash
logosup install

Existing operators

logos-node update      # works exactly the same as before — and self-migrates

After that single command:

  • Git remote auto-rewrites from shayanb/logos-nodelogosnode/logosup (GitHub redirects either form, but the rewrite cleans up warnings)
  • Symlinks are healed: logosup becomes the primary command, logos-node and logosnode keep working
  • Config gets a one-time patch that disables runaway disk-based tracing logs (see "Disk fixes" below)

Headline features

logos-node wallet — new subcommand for transfers, balance, tx lookup

Thin HTTP client over the node's existing /wallet/* and /cryptarchia/* endpoints. All cryptography happens inside the node; no new dependencies.

logosup wallet balance                       # all known_keys + total
logosup wallet balance <key>                 # single key + per-note breakdown
logosup wallet transfer <to_pk> <amount>     # auto-pick funding key, confirm, submit
logosup wallet send <to> <n> --from <key> --change <key> --yes
logosup wallet tx <tx_hash>                  # transaction lookup

This is the base-layer wallet built into the node. The Logos Execution Zone (LEZ) layer-2 wallet is tracked separately as a future feature.

keys backup / keys restore actually preserves keys across resets and node upgrades

Previous implementation only saved the wallet.known_keys block — public mappings without the corresponding KMS signing material. A restore-after-reset gave you an unsignable wallet.

Backup is now a small keys-only YAML containing every key-bearing path (wallet.known_keys, full kms.backend.keys with !Zk / !Ed25519 secrets, libp2p node_key, blend signing key ids, funding-pk references). Restore splices those paths into the existing config without touching anything else — cross-version safe. Operators can back up on one node version and restore onto another. Soft dep on python3 + PyYAML (pre-installed on most distros).

Honest tx-lookup messaging

After deep research traced both the wallet API hash (MantleTx::hash() = Poseidon2 over Fr from BLAKE) and the public testnet explorer's id (SHA-256 of canonical JSON, derived in logos-blockchain-block-explorer-template), and confirmed /cryptarchia/transaction/<id> was added in upstream PR #2550 (merged 3 days after v0.1.2 was cut, so the operator's v0.1.2 node returns 404 because the route literally doesn't exist), the post-transfer + wallet tx 404 messages are now precise instead of hand-waving "in-progress upstream." When the operator's node upgrades to v0.1.3+, wallet tx <hash> starts working without any CLI change.


Disk-fill fixes (two distinct causes, both seen in production)

Container log rotation (v0.2.2)

Generated docker-compose.yml now caps Docker's json-file logs:

  • logos-node: max-size: 50m, max-file: 5 (250 MB ceiling)
  • logos-exporter / logos-otel / logos-prometheus / logos-grafana: 20m × 3 (60 MB each)

Without these, an operator's pi filled with a single 60 GB json log over a few weeks.

Reset now regenerates the node compose (v0.3.2)

Previous behavior only regenerated the monitoring compose. Operators whose docker-compose.yml was generated before v0.2.2 (no logging caps) stayed on the old schema indefinitely, even after multiple resets.

Tracing module disk logs disabled (v0.3.2)

By default the upstream node tracing module writes the SAME log lines to BOTH stdout (Docker captures, capped) AND to per-hour files in the data dir, which were NOT capped. At DEBUG level this hits ~10 GB/hour. One operator's pi went from clean to full (102 GB consumed) in 17 hours.

Added patch_user_config_for_log_files in lib/docker.sh that rewrites tracing.logger.file: { directory, prefix }file: null after init. Stdout via logos-node logs is sufficient for diagnostics. Idempotent.

Post-update auto-fix

When lib/docker.sh changes in an update, the on-disk docker-compose.yml is regenerated and the operator is offered a one-click container recreate to apply the new caps. Same hook for monitoring compose.


UX polish (cumulative across the release window)

  • HTTP error messagingwallet balance / status show the actual API response inline (e.g., error (HTTP 408): timeout) instead of a silent "unavailable". For HTTP 000 (connection refused / timeout / no response), prints (no response — connection refused, timed out, or node API not reachable) instead of an empty message.
  • confirm fail-closed when no /dev/tty — previously fell through to the default answer when /dev/tty wasn't available (non-interactive SSH, automation pipes), silently submitting destructive operations like wallet transfer. Now pre-flight tests /dev/tty openability via fd 3; if missing, log a warn and return 1 (cancel).
  • Full 64-char addresses in wallet balance, wallet transfer summary, status wallet section — copy-paste from terminal works.
  • keys subcommand: import/export aliases — keys silently fell into the * default (which printed keys) when the operator typed keys import. Now import/export work as aliases for restore/backup, and unknown subcommands print help and return 1.
  • keys_io.py handles all YAML tag forms — scalar (!Zk hex), mapping (!Otlp { endpoint, host_identifier }), and sequence — so backup/restore round-trips the entire config including tracing.metrics: !Otlp etc.
  • Subshell unbound-var fix in wallet helpers — early version of wallet balance used $(wallet_get_balance ...) which ran the helper in a subshell, so WALLET_HTTP_CODE (set as a global) didn't propagate back. Under set -u this crashed every wallet command. Helpers now set globals; callers invoke bare and read globals.
  • Drift detection in update flow — settings.env entries that mask network.yml (e.g. stale bootstrap peer IDs from an older install) trigger a one-time interactive cleanup prompt.
  • Update flow re-exec passthroughcli_changed_files is now passed through the re-exec via env var so post-update hooks (compose regen, monitoring rebuild) actually fire on a normal logos-node update. Previous behavior silently disabled all the hooks because the re-exec dropped state.

Monitoring / dashboards

  • Deep Dive dashboard rewritten to align with metrics actually exported by the OTel collector on a v0.1.2 testnet node. Removed panels backed by un-emitted metrics (consensus apply latency, proposals, blend, KMS sign requests, SDP, orphans). Added: consensus_connections, network dial failures, KMS public key requests, block download latency. New "Wall-clock vs Chain Time" section computing sync lag (time_current_slot − consensus_current_slot).
  • Pi cgroup memory hint — System & Containers dashboard panels for Memory now point operators at the cgroup_enable=memory cgroup_memory=1 cmdline flag when memory shows 0 B (Pi kernel default omits this).
  • Prometheus exporter wallet-key parsing fix — exporter was matching all 64-hex strings in user_config.yaml (including KMS key IDs and node_key), producing 6 wallet legend entries when the operator only has 2 keys. Now navigates wallet.known_keys correctly. Also stops zeroing the gauge on transient API failures (was painting fake "balance dropped to zero" lines).

Upstream issues filed during this work

For transparency on the operator-side investigations:

  • logos-blockchain#2622 — wallet service crash loop on initial backfill (LIBUpdate vs LIB race). Hit reliably on a long-running testnet; documented the cascade and operator-side symptoms.
  • logos-blockchain#2663 — wallet service silently never starts after enough crash-loop iterations (overwatch supervisor exhausts restart budget).
  • logos-blockchain#2661 — clarification ask about which consensus_* / blend_* / kms_* / sdp_* metrics are wired vs. declared-but-uncalled.
  • logos-blockchain-block-explorer-template#15 — docs ask: clarify in the README that the explorer's transaction id is SHA-256 of canonical JSON (independent from the node's TxHash).

Files NOT renamed (intentionally)

  • ~/.logos-node/ data dir — refers to the upstream node, not our tool. Renaming would break every existing install.
  • logos-node Docker container, logos-net Docker network — refer to the actual node.
  • Internal env vars (LOGOS_NODE_VERSION, LOGOS_NODE_DIR, LOGOS_NODE_LIB, LOGOS_CLI_REPO, ...) — no flag day on operators' ~/.logos-node/settings.env.
  • File names inside lib/cmd_*.sh filenames stay as is.

What's coming next

  • Once upstream lands a fix for the wallet backfill race, base-layer wallet usage on long-running testnets becomes reliable.
  • Once upstream cuts v0.1.3, wallet tx <hash> starts working against the operator's own node.
  • Logos Execution Zone (LEZ) wallet integration is tracked at logosnode/logosup#9 — separate layer-2, separate binary, separate concern.

Full Changelog: v0.2.2...v0.4.0