13 KiB
13 KiB
Changelog
All notable changes to Triangles (TRI) are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[6.2.5] - 2026-08-03
Fixed
- Stake-age soft cap reverted in
src/kernel.cpp::GetWeight. The V5-fork 7-day soft cap (activated 2026-04-12) was the regression that capped long-dormant coins at 7 days of weight, killing the diamond-hands incentive. Restored to original Peercoinmin(nAge, nStakeMaxAge). Chain was frozen at block 2,224,763 since 2026-07-18 with no blocks ever produced under the soft cap, so reverting changes zero historical block validation results. ReadUtxolazy fallback insrc/txdb-base.cpp. The fallback totxindex.vSpent[]exists inHaveUtxobut was missing inReadUtxo, so nodes with incomplete UTXO snapshots could not find pre-snapshot unspent outputs (chain stalled at 2,224,763 since 2026-07-18). Added: when UTXO DB misses an entry buttxindex.vSpent[n].IsNull(), read the transaction from disk and reconstruct the full CUtxoEntry including exact block height viamapBlockIndexlookup.DisconnectBlockheight reconstruction insrc/main.cpp. Reorg path now recovers exact block height viamapBlockIndexinstead of leavingnHeight = 0on restored UTXOs.
[6.2.4] - 2026-08-02
Changed
- RocksDB bumped 8.9.1 → 10.10.1 in CI (
scripts/ci/build-rocksdb.sh). Required to read the Hetzner Dropbox bootstrap snapshot's chain DB, whose SST files are at format_version=7. RocksDB 10.10.1 still usesformat_version=6as its own default; the daemon does NOT pin a different value, so newly written SSTs continue to land at v6. This is deliberate: mixed v6/v7 SST files in the same DB are supported by RocksDB, and v7 writes from this build would close the door on downgrade to 6.2.3 (or any RocksDB < 10.4.0) without fixing anything.
Fixed
scripts/ci/build-rocksdb.shnow strips-std=c++XX(regex covers-std=c++17/-std=c++20/-std=c++2b/ future values) fromrocksdb.pcCflags instead of only the-std=c++17value. RocksDB 10.x writes-std=c++20, whichpkg-configinjects into every Triangles translation unit. C++ translation units ignore the redundant flag, but C units (e.g.src/lz4/lz4.c) hit a fatalerror: invalid argument '-std=c++XX' not allowed with 'C'from clang. Previously, the daemon build tolerated this as a warning; the fuzz build (clang-15+ sanitizers) treated it as a hard error and thetest-fuzz-smoke/test-fuzz-smoke-txjobs failed in the 6.2.4 CI run #30744702062 at theBuild fuzz_script/Build transaction_deserialize_fuzzstep.
Notes for operators upgrading from 6.2.3
- The daemon's runtime dependency is
librocksdb.so.10.10.1(replacing the previouslibrocksdb.so.8.9.1). Install or build rocksdb from source before rolling 6.2.4 onto a node; the .deb from CI bundles the right SONAME and should just work on Ubuntu 22.04 / 24.04. - If you imported the Hetzner Dropbox bootstrap snapshot's chain DB
into this node, that DB still contains v7 SSTs. Any daemon down to
RocksDB 10.4.0 will read it; RocksDB ≤ 10.3.x will reject the v7
SSTs with
Corrupt or unsupported format_version: 7. After the daemon compacts the imported chain DB, the v7 SSTs may be re-written at v6 and the DB becomes readable by older rocksdb again — that happens naturally as part of normal compaction, no extra action required. - Package checksums in
packaging/flatpak,packaging/scoop, andpackaging/wingetare regenerated during the CI release workflow after artifacts are produced; do not ship those package manifests until their SHA-256 sums match the v6.2.4 release artifacts.
[6.2.3] - 2026-08-01
Changed
- Local snapshot loading no longer requires a compiled-in SHA match.
Previously, loading
utxo-snapshot.binfrom the data dir rejected the file unless its SHA256 was present inCheckpoints::mapSnapshotHashes(which only knows about one or two canonical tips at compile time). Local file loads are operator-trusted — the operator already has filesystem access — so the SHA gate was friction without a security benefit. The gate still exists for P2P-delivered snapshots viaSnapshotNet(requireCheckpoint=true there).
Added
-acceptanylocalsnapshotCLI flag: forces acceptance of a localutxo-snapshot.binwhose SHA is not in the compiled map, with an explicit warning log line. Use only with operator-signed snapshots.
[6.2.2] - 2026-08-01
Fixed
- Snapshot regeneration: full chain index, not just the last 2000.
UTXO_SNAPSHOT_DEFAULT_HEADERSwas 2000, which silently trimmed the snapshot to the last 2000 blocks even though the v2+ format is designed to carry the full chain index. The too-small snapshot causedGetKernelStakeModifier() : block not indexederrors after a fresh node loaded it — the kernel-stake-modifier walk inCreateCoinStakeneeds blocks older than the last 2000 becausenStakeModifierSelectionIntervalis multi-day. The block index was effectively unusable for the StakeMiner on the recovered node. Default is now 0 (all headers); the trim is bypassed whennHeaders=0. Callers may still pass an explicit positive value for a small diagnostic snapshot.
Fixed
- Build portability: v6.1.9 binary crashed with SIGILL on every
production node. v6.1.9 was built on GitHub Actions' EPYC 7763
runner (AVX-512 capable). GCC 11.4 + libstdc++ inlining emitted 741
vpbroadcastqEVEX instructions into the daemon binary even though the cmakeAddCompilerFlags.cmakewas setting-march=x86-64-v2 -mtune=generic. The resulting binary crashed on every production CPU that lacks AVX-512: KVM-virtualized EPYC (DNS2), Ryzen 5 3600 (SAMI-PC), and any non-x86_64 node. v6.2.0 adds an explicit-mno-avx512f -mno-avx512*block to the global compile options so the build cannot leak AVX-512 regardless of what the build host supports. Carries forward the v6.1.9 staking-selfheal fix unchanged. Seereferences/avx-512-sigill-build-fix.mdfor the full diagnosis.
Changed
- Bump version 6.1.9 → 6.2.0 to reflect the build-system change.
[6.1.9] - 2026-07-31
Fixed
- Staking deadlock on idle networks.
IsStakingSafe()refused to stake wheneverIsInitialBlockDownload()was true, andIBDflipped true whenever the chain tip was older than 24h. After 24h of no blocks, every node simultaneously refused to stake and the chain deadlocked. Thestaking: trueflag ingetstakinginfowas misleading — it only reflected a single search in the brief window after a restart. Narrowed the gate to "refuse only when IBD is true AND local height is behind the peer/checkpoint estimate" (f69f087). A node at the peer median now clears the gate and keeps staking through idle periods, so the chain self-heals. Genuinely-behind nodes still hold off. Block validation, reorg rules, and checkpoint rules are unchanged. The-forcestakingbootstrap escape hatch still works on nodes caught up to the checkpoint.
Changed
- CLI:
-conf=(empty value) now falls back to the default config path instead of erroring out (41e3898). - CLI:
-conf/-datadir/-rpcuser/-rpcpasswordare honored in the documented order, with clearer error messages on bad input (64556dc). - Build: reproducible build + signed release pipeline (PR #26 chain).
[6.1.8] - 2026-07-17
Changed
- Bootstrap: RPC-driven trusted snapshot publisher rotation (PR #26). Operators can rotate the snapshot publisher via RPC instead of hard-coding it in the binary.
- Consensus: removed local-finality, fixed
getheadersfork recovery (935d1d5). - Consensus: fail-closed reorg guard when the startup checkpoint
pointer is null (
6116cff). - IBD: allow
getblocks/getheaderson OneShot peers during IBD (c68a8cb). - Build: bump revision 7 → 8.
⚠️ Known issue
- v6.1.8 introduced a staking deadlock on idle networks via the
IsStakingSafe()gate. Operators on v6.1.8 should setstaking=1andforcestaking=1intriangles.confand restart to unstick the chain. v6.1.9 fixes the root cause.
6.1.7 - 2026-07-08
Changed
- Overview page UI: the Total balance label is now rendered with
font-weight: 900(full bold) instead of Qt's default bold (75, medium-bold). On builds where the font has a true heavy variant, the Total now visually pops as the headline number against the Spendable / Stake / Unconfirmed rows. - Transactions amount column Confirming tier color is now
#4A8C5E(mid green) instead of#C5EBC9(pale mint). The pale mint was too close to the bright#7CDB8AConfirmed green on the dark background and read as the same color. Mid green sits clearly between grey (Unconfirmed) and bright green (Confirmed) so the three tiers are visually distinct. - Transactions amount column now reads confirmation depth
directly (new
DepthRoleonTransactionTableModel) instead of going through theTransactionStatusenum. The rule fires on every block increment, not just on enum state transitions. Affects bothtransactiontablemodel.cpp(Transactions tab) andoverviewpage.cpp(Overview recent-5 list).
6.1.6 - 2026-07-08
Changed
- Overview page UI: conditional color on the Total balance label.
Renders money-green (
#7CDB8A) when the total is greater than zero and brand-red (#e32105) when the wallet is empty. Previously a static green stylesheet rule failed to cascade on some Qt builds, leaving Total always red. - Transactions list (and Overview recent-5 list) amount column now
uses a 3-tier color rule keyed off the existing
TransactionStatusstate machine, so the amount color agrees with the status icon:- 0 confirms (
Unconfirmed) → grey (#61280E) - 1–3 confirms (
Confirming) → pale mint (#C5EBC9) - 4+ confirms (
Confirmed) → money-green (#7CDB8A) - Conflicted → grey
- Negative amounts (spent) stay red across all tiers.
- 0 confirms (
- Internal: added
COLOR_CONFIRMINGconstant inguiconstants.h; rewired both amount paint sites (overviewpage.cpp::TxViewDelegate::paintandtransactiontablemodel.cpp::ForegroundRole) to share the rule.
Fixed
overviewpage.cppnow includestransactionrecord.hso theTransactionStatus::Confirmingenum value is in scope (was previously only forward-declared viatransactiontablemodel.h).
6.1.5 - 2026-07-08
Added
- New
tweet@sami-ahmed.netuid on the maintainer signing key, withhello@sami-ahmed.netverified on the GitHub account — release tags now show as "Verified" on github.com. CHANGELOG.mdat the repo root (this file).
Changed
- Overview page UI: pending (
labelUnconfirmed) and immature (labelImmature) balance labels now render in olive green (#A8B847) instead of the same light green as confirmed balances. The distinction reads as "incoming but not yet confirmed" instead of "incoming and final". doc/release-process.md: corrected signing-key identity to match the actual key in use (RSA-4096Krystie Triangles Release <krystie-triangles-release@dns2.sami.tailnet>, not the Ed25519sami@cryptographic-triangles.orgthe doc previously claimed).
Fixed
- Wallet close-hang on Windows: detached
std::threadinstances backing the embedded Tor and I2P controllers now join cleanly on shutdown, removing the ~30s exit delay. (#20) - Consensus: live proof-of-stake checks run during stale-tip IBD instead of
being suppressed, fixing a divergence path where a node could accept a
stale chain tip while local PoS validity checks were off. (
#18) - CI:
simd.c:265UBSan build-id drift resolved; reproducible-build warnings now ignore untracked files. (#17)
Security
- Audit follow-ups merged: kernel coverage, keystore coverage, sigcache
fixes, wallet-DB test fixes. (
#14,#15)
6.1.4 - 2026-07-04
Fixed
- CI: Tor bundle download resilience.
NeedsBootstrapflag now correctly persists acrossrocksdb/restarts.
6.1.3 - 2026-07-01
Changed
- Chain-DB migration hardening.
- BIP39 passphrase support.
- HD-wallet indicator in the UI.
- Test isolation improvements.
6.1.2 - 2026-06-30 [YANKED]
Hotfix for v3 snapshot seek-offset corruption. Superseded by 6.1.3. Do not use.
6.1.1 - 2026-06-22
Fixed
- Minor wallet bugs.
6.1.0 - 2026-06-15
Added
- Initial 6.x release line. C++20 modernization, embedded Tor/I2P support.