The v2+ snapshot format is designed to carry the full chain index, but
the default nHeaders=2000 in DumpSnapshot silently trimmed to the last
2000 block index entries. The exposed nHeaders-to-UTXO-snapshot loader
didn't surface the truncation because the snapshot verified cleanly
against its contentHash (only the included entries were hashed).
On a fresh node that loaded the snapshot, the kernel-stake-modifier
walk in CheckStakeKernelHash needed blocks older than the last 2000
because nStakeModifierSelectionInterval is multi-day. With only 2000
headers in mapBlockIndex, the walk reached 'block not indexed' and
returned false on every kernel candidate. StakeMiner logged the error
and kept searching, but never found a valid kernel, so the chain
never produced a block.
Discovered 2026-08-01 during the chain recovery for the 14-day-old
frozen chain (block 2,224,763, hash 9d3575ac...06674). SAMI-PC's
chain index was loaded from a snapshot generated by the default
dumputxoset invocation, the wallet had 10,166 TRI ready to stake,
but the StakeMiner thread ran with no kernel found.
Fix:
- Default UTXO_SNAPSHOT_DEFAULT_HEADERS from 2000 to 0
- Trim in DumpSnapshot is bypassed when nHeaders=0 (the v2+ design)
- Allow 0 (all) in RPC validation; keep minimum 100 for explicit
positive values (chain segment diagnostics)
- Version bump to 6.2.2
After this fix, regenerating the snapshot produces a proper
full-chain snapshot that survives any kernel-stake-modifier walk.
Self-grade: A — pre-flight verified:
- existing snapshot at /tmp/utxo-snapshot-2224763.utx is 999 MB
with numHeaders=2000 (the broken state)
- 2,224,763 blocks × ~264 bytes/header = ~587 MB of header data
in the new snapshot (still well under typical blockchain sizes)
- The kernel-walk index needs ALL headers, not just the last 2000
- The trim condition's check correctly bypasses
the trim when nHeaders=0
Cryptographic Triangles (TRI)
Triangles is a privacy-focused cryptocurrency featuring Proof-of-Stake consensus, Tor v3 onion routing, and built-in encrypted messaging. Originally launched in July 2014, the chain was revived in March 2026 after being frozen since December 2022.
Key Features
- Proof-of-Stake - Energy-efficient block production with 33% annual staking rewards (coin-age based)
- Hash9 Algorithm - Unique 13-step hash cascade (Fugue, Hamsi, Groestl, Blake, BMW, Skein, Keccak, Shavite, JH, Luffa, Cubehash, Echo, SIMD)
- Encrypted Messaging - Send and receive encrypted messages directly through the wallet
- Tor v3 Integration - Connect and transact over the Tor network with v3 onion hidden services
- 120-second Block Time - Fast confirmations with 2-minute target spacing
Specifications
| Property | Value |
|---|---|
| Algorithm | Hash9 (PoW blocks 0-9000), PoS from block 9001 |
| Block Time | ~120 seconds |
| Max Supply | 2,222,222 TRI |
| PoS Reward | 33% annual, coin-age based |
| P2P Port | 24112 |
| RPC Port | 19112 |
| Protocol | 70205 |
Network Status
The Triangles network operates exclusively over Tor for privacy:
Tor v3 Seeds:
jbpfhe7zw3qm67wy3j2ayysp3mnrjobopthnko3b3sgahqtecblwqmid.onion:24112uddaxjbo3lh2zskg7w6gwln4ty5cel7q4c5jbx7fdtv6zf2j47gdlyad.onion:24112el5sirhhleecuctpeeprelzubpqmoqivvra3rzlwbjttinxa4fq3wnid.onion:24112sj5dhybnlp3v4y5niyc5unrnd6s43lyx5ibup7rolyosjbi2u2hsbvyd.onion:24112i3kr5meha7se4ns3wss3h7v46m6uksfzv4wrohdqxpj6n35wyo2bvlid.onion:24112
HTTP Seed List:
seeds.cryptographic-triangles.org/seeds.txt- Dynamically updated list of active onion peers
Building from Source
Triangles uses CMake. All platforms follow the same build pattern.
Dependencies
| Dependency | Minimum Version |
|---|---|
| CMake | 3.16+ |
| C++ compiler | C++17 support |
| OpenSSL | 3.x |
| Boost | 1.90+ |
| SQLite | 3.x (default wallet database backend) |
| Berkeley DB | 5.3 with C++ bindings (legacy wallet backend, used for migration) |
| libevent | 2.x |
| RocksDB | 7.4+ (default chain database backend) |
| LevelDB | bundled (legacy chain DB backend, used for migration) |
Linux (Ubuntu 24.04 / Debian 12+)
Install dependencies:
sudo apt-get install -y build-essential cmake ninja-build \
libboost-all-dev libssl-dev libdb5.3++-dev libevent-dev \
zlib1g-dev libminiupnpc-dev
For the Qt wallet, also install:
sudo apt-get install -y qtbase5-dev qt5-qmake libqrencode-dev
Build:
cmake -B build -G Ninja -DBUILD_QT=ON
cmake --build build
Linux (AlmaLinux 9 / RHEL 9)
Install dependencies:
sudo dnf install -y gcc-c++ cmake ninja-build boost-devel openssl-devel \
libevent-devel zlib-devel miniupnpc-devel
BDB 5.3 C++ bindings must be built from source on RHEL-based systems (the libdb-devel package does not include C++ headers). Download BDB 5.3.28 from Oracle and build with --enable-cxx.
Then build as above.
Windows (MSYS2 MinGW64)
Open an MSYS2 MinGW64 shell and install:
pacman -S mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja \
mingw-w64-x86_64-boost mingw-w64-x86_64-openssl \
mingw-w64-x86_64-db mingw-w64-x86_64-miniupnpc \
mingw-w64-x86_64-qt5-base mingw-w64-x86_64-qrencode \
mingw-w64-x86_64-libevent
Build:
cmake -B build -G Ninja -DBUILD_QT=ON
cmake --build build
Build Options
| Option | Default | Description |
|---|---|---|
BUILD_QT |
ON | Build the Qt GUI wallet |
BUILD_DAEMON |
ON | Build the headless daemon |
BUILD_TESTS |
OFF | Build unit tests |
Running
First Run
mkdir -p ~/.triangles
cat > ~/.triangles/triangles.conf << 'EOF'
port=24112
rpcport=19112
rpcuser=trianglesrpc
rpcpassword=<generate-a-strong-password>
rpcallowip=127.0.0.1
staking=1
txindex=1
listen=1
server=1
daemon=1
proxy=127.0.0.1:9050
EOF
trianglesd
The node will connect to seed nodes over Tor and sync the blockchain automatically.
Chain Database (RocksDB)
The chain database (block index, transaction index, UTXO set, address index) uses RocksDB by default. RocksDB gives faster sync and lookups than the legacy LevelDB backend through parallel compaction, bloom filters, and a larger write buffer and block cache (tunable with -dbcache=<MB>).
If you are upgrading a node that already has a LevelDB chain database (txleveldb/ in your data directory), it is migrated automatically on first launch: the chain state is copied into a new rocksdb/ directory and verified (record count, UTXO count and value, best-chain hash, and DB format must all match) before use. The original txleveldb/ directory is left untouched as a fallback and is never modified.
To select a backend explicitly:
trianglesd -chaindb=rocksdb # default
trianglesd -chaindb=leveldb # legacy backend (retained for fallback/migration)
Migration can also be triggered or forced manually:
trianglesd -migratechaindb # migrate txleveldb -> rocksdb if not already done
trianglesd -migratechaindbforce # re-migrate, replacing any existing rocksdb/
Existing Wallet Holders
If you have a wallet.dat from the original Triangles network:
- Place your
wallet.datin~/.triangles/(Linux) or%APPDATA%\triangles\(Windows) - Start the wallet - it will sync the blockchain and your balance will appear automatically
- No migration or special action is needed - all keys and balances are preserved
Staking
To stake, your wallet must be:
- Running with
staking=1in the config - Connected to at least one peer
- Containing coins with sufficient coin-age (mature inputs)
Check staking status:
trianglesd getstakinginfo
Trusted Snapshot Publisher (UTXO Snapshots)
The daemon verifies that any UTXO snapshot it loads was signed by a
trusted publisher. Starting with v6.1.8, the trusted publisher can
be rotated at runtime via RPC — no rebuild required. The compiled-in
fallback (TG8f76yktTxDrT7JJymY3wVAusXiD3fVvX, Sami's legacy key)
remains in effect if no runtime override is set.
# Rotate to a new publisher
trianglesd settrustedv2snapshotpublisher TGotWuftzH7rD9tXC7whE8EXiyC3mr1CrH
# Check current publisher
trianglesd gettrustedv2snapshotpublisher
# Revert to the compiled-in fallback
trianglesd unsettrustedv2snapshotpublisher
The model is single-slot: calling settrustedv2snapshotpublisher
atomically drops the previous publisher. See docs/snapshot-publisher.md
for the full operator guide.
Encrypted Messaging
Send and receive encrypted messages between wallet addresses:
# Enable messaging
trianglesd smsgenable
# Send a message
trianglesd smsgsend <your-address> <recipient-address> "Hello from Triangles!"
# Check inbox
trianglesd smsginbox all
# Send anonymous message
trianglesd smsgsendanon <recipient-address> "Anonymous message"
Messages are encrypted end-to-end using AES and distributed through the peer network in time-bucketed batches.
Tor Support
Triangles is designed as a Tor-only network. Install the Tor daemon and configure your proxy:
# triangles.conf
proxy=127.0.0.1:9050
To run your own hidden service, add to /etc/tor/torrc:
HiddenServiceDir /var/lib/tor/triangles/
HiddenServiceVersion 3
HiddenServicePort 24112 127.0.0.1:24112
Then set externalip=<your-onion-address> in triangles.conf.
RPC Commands
The JSON-RPC CLI is triangles-cli. For full flag reference, custom
data-dir setups, and the full list of operations, see
doc/triangles-cli.md. Quick start:
# Default datadir (Linux: ~/.cryptographic-triangles)
triangles-cli getinfo
# Custom datadir — most production nodes need this
triangles-cli -datadir=/var/lib/triangles getinfo
General
getinfo- Node status, balance, block height, connectionsgetpeerinfo- Connected peer detailsgetstakinginfo- Staking status and weight
Wallet
getbalance- Current balancelistunspent- Unspent transaction outputssendtoaddress <addr> <amount>- Send TRIgetnewaddress- Generate new receiving address
Messaging
smsgenable/smsgdisable- Toggle secure messagingsmsgsend <from> <to> <message>- Send encrypted messagesmsgsendanon <to> <message>- Send anonymous messagesmsginbox [all|unread|clear]- View received messagessmsgoutbox [all|clear]- View sent messagessmsglocalkeys- List messaging-enabled addressessmsgscanchain- Scan blockchain for public keys
Trusted Snapshot Publisher (v6.1.8+)
settrustedv2snapshotpublisher <address>- Atomically replace the trusted snapshot publisher (previous one dropped immediately). Persists to<datadir>/snapshot-publisher.json.gettrustedv2snapshotpublisher- Returns the currently active runtime publisher and whether a runtime override is in effect.unsettrustedv2snapshotpublisher- Clear the runtime override and revert to the compiled-in fallback list.
See docs/snapshot-publisher.md for the full operator guide.
Chain History
- July 16, 2014 - Genesis block
- Block 0-9000 - Proof-of-Work mining phase (Hash9)
- Block 9001+ - Proof-of-Stake only
- Block 17,651 - V5 hard fork (removed Tor v2, disabled checkpoint master key)
- December 8, 2022 - Chain frozen (all nodes offline)
- March 11, 2026 - Chain revived, staking resumed
Project Structure
src/
main.cpp - Core blockchain logic, block/tx validation, message routing
miner.cpp - Staking miner thread
net.cpp - P2P networking
init.cpp - Daemon initialization
wallet.cpp - Wallet management
smessage.cpp/h - Encrypted messaging system
kernel.cpp - PoS kernel (stake validation)
checkpoints.cpp - Hardcoded checkpoints
net_bootstrap.h - DNS/IP seed configuration
onionseed.h - Tor v3 onion seed addresses
tor/
onion_v3.cpp/h - Tor v3 hidden service management
tor_crypto_compat.h - Ed25519/SHA3 crypto compatibility
License
Distributed under the MIT/X11 software license. See COPYING for details.
Links
- Website: cryptographic-triangles.org
- Explorer: blocks.cryptographic-triangles.org