Skip to content

v0.1.4

Choose a tag to compare

@ogaworld369 ogaworld369 released this 05 Nov 14:59
· 34 commits to main since this release

v0.1.4 — maintenance update

A maintenance release for the Android full node. It fixes all five findings of the full-section audit of v0.1.3 (three new lows and two carried-over items; no critical, high or medium issues, and nothing deferred this time). No changes to the node's launch arguments, the database format, or the app's permissions: it installs over v0.1.3 and keeps your settings and synced data — verified on the reference device, where the node resumed at the chain tip after the update without re-syncing and a stop → immediate start worked cleanly.

What's fixed

  • The orphan recovery can no longer misfire across sessions — the v0.1.3 orphan-termination gate judged by a captured flag and the current pid record, without re-checking that the deciding worker still belonged to the current session. A stale worker from a destroyed service instance, resuming late, could have mistaken a newer session's healthy node for an orphan and terminated it. The kill decision now re-validates, immediately before acting, that the worker's generation is still the current one; any doubt falls back to the previous wait-and-refuse behaviour. (One part of the new check — re-reading the pid record — is deliberately redundant: pid-file changes are serialized by the pid lock, so it restates an invariant as defence in depth. The generation check is the one that closes the audited sequence. Both are documented in the code and the changelog.)
  • RPC judgement is now uniform for missing fields — a missing isSyncing was decided as false outright, and a non-numeric peers value collapsed to a real 0 over the retained count. Both now follow the same rule as every other field since v0.1.2: an absent or unusable value means "not said", and the judgement uses the retained values.
  • The translation table is verified, not just written — docs/I18N.md's generated table still carried v0.1.1 in its footer row while the app itself already showed the newer version. The table has been regenerated from the compiled string table (the only stale cells were that row) and the project's release checklist now verifies the current version in the footers and a zero-diff regeneration of the whole table, so staleness of any age is caught mechanically. This release's own version bump was run through that strengthened check.
  • Repository hygiene — the Gradle staging directory for the native libraries (src/main/jniLibs/) is now git-ignored, closing the chance of a stray 53 MB binary being committed by accident (this item had been carried over without being counted in earlier deferral lists; the accounting is now explicit).
  • Documentation accuracy — the app README's settings section described "two user settings"; it now documents all four (telemetry, display name, language, and the settings lock).

Verification

  • JVM checks: 951 assertions, zero failures — string-table completeness and placeholders (49 keys × 9 languages, all footers at v0.1.4), the regenerated I18N table compared cell-by-cell (490 comparisons, zero mismatches), the sanitizing regression suite, the orphan-gate predicate truth table, and the RPC judgement expressions over the audit's scenarios (including reproductions of the old behaviour).
  • API-surface re-check against the official API database: no reference beyond API 31; sensitivity controls confirmed (a deliberate readAllBytes use is flagged, Process.pid() surfaces as unresolved).
  • Desk check: the audit's cross-instance sequence (stale worker resuming late) traced through the new code — the gate now stands down — and the genuine orphan case still recovers as before.
  • Byte-level comparison with the v0.1.3 APK: only classes.dex, the version in AndroidManifest.xml, and the signature files differ — the node binary, the CA bundle and all resources are byte-identical.
  • On device (Pixel 9a, GrapheneOS): updated in place over v0.1.3, resumed at the tip, steady state; stop → immediate start confirmed working.
  • Honest notes: the cross-instance race is verified by code tracing and predicate exercises, not reproduced on a device; a full Gradle build remains not runnable in the maintainer's build environment, so Gradle compilation itself is still unverified.

Requirements

  • Android 12 or newer, arm64 device
  • Verified on: Pixel 9a + GrapheneOS. Other devices are expected to work, but vendor power management may stop the background service
  • About 3 GB of free storage (measured after a full sync: 1.30 GB total)
  • Wi-Fi recommended for the first sync (about 2–3 hours; battery went from 71% to 27% in our first-sync test, including time on mobile data)

Install

  1. Download quantus-node-v0.1.4.apk from the assets below.
  2. Install it (you may need to allow installs from your browser/file manager). If v0.1.3 is installed, install over it — do not uninstall first, or your synced data will be lost.
  3. Open the app, tap Start, and keep it charging on Wi-Fi for the first sync.
  4. Optional: set a node name and turn telemetry on in Settings if you want to appear on the public telemetry list.

See the repository's Usage Guide for details and troubleshooting.

Checksum (SHA-256)

f662112bc213b0ae5f9be724b5421badf39730652381ca0ae3dc22e8b1ec74b2 — quantus-node-v0.1.4.apk (55,700,181 bytes)