DigiByte v9.26.0-rc20 Release Notes
WARNING: This is a TESTNET-ONLY release. DO NOT use on mainnet.
Development Branch: https://github.com/DigiByte-Core/digibyte/tree/feature/digidollar-v1
Join the Developer Chat: https://app.gitter.im/#/room/#digidollar:gitter.im
⚠️ SAME TESTNET — NO RESET
RC20 uses the same testnet19 chain as RC19. No data migration needed.
- No chain reset — your blockchain data, wallets, and oracle keys all carry over
- Same ports: P2P 12033, RPC 14025
- Same oracle consensus: 5-of-9 Schnorr threshold
- Just update the binary and restart your node
🔑 Oracle Operators — IMPORTANT
After upgrading to RC20, you must reload your oracle wallet and restart your oracle:
digibyte-cli -testnet loadwallet "oracle"
digibyte-cli -testnet -rpcwallet=oracle startoracle <your_oracle_id>Qt users: File → Open Wallet → oracle, then Help → Debug Window → Console → startoracle <your_oracle_id>
⚠️ After every node restart, you must re-load your wallet and re-start the oracle. Your key persists in the wallet — you never need to run
createoraclekeyagain.
What's New in RC20
RC20 is a stability and CI/CD hardening release with 22 commits since RC19. It fixes two critical bugs reported by community testers (fresh node sync failure and stale wallet validation), adds the Round 2 oracle consensus attestation P2P protocol, and resolves 12 CI/CD pipeline issues.
🐛 Critical Bug Fixes
IBD Sync Stuck at Block 7586 (Fresh Node Sync Failure)
Reported by: Community testers on Gitter
The problem: Fresh nodes syncing the testnet chain would get permanently stuck at block 7586 (the first DigiDollar transaction) with bad-oracle-price. The node would refuse to sync further.
Root cause: IsInitialBlockDownload() uses a latch mechanism with max_tip_age=1h. On testnet (~9,900 blocks), a fresh node catches up to within 1 hour of the tip very quickly. Once that happens, the IBD flag latches false permanently — even though the node is still connecting historical blocks. When it hits block 7586, there's no oracle price available (no oracle bundle in the coinbase, no P2P oracle data yet), so validation rejects it with bad-oracle-price.
The fix: ConnectBlock now detects when a node is catching up (pindex->nHeight < m_best_header->nHeight) and skips oracle validation when no deterministic block oracle price exists. This is safe because those blocks are already part of the best chain accepted by peers. Once the node reaches the tip, full P2P oracle price validation kicks in for live blocks.
Impact: Fresh nodes now sync the entire chain without getting stuck. Reindex also works correctly.
Mint Tab Validation Stale After Balance Change
Reported by: Community testers on Gitter
The problem: If you had the "Mint DD" tab open and received DGB, the yellow "Insufficient DGB collateral" warning stayed even though you now had enough DGB to mint. You had to navigate away and back for it to notice the balance change.
The fix: updateBalance() now calls updateAmountValidation() and updateMintButton() so the validation state refreshes immediately when your balance changes.
Stale Oracle Data in getoracles RPC
The problem: The getoracles RPC was showing stale status for offline oracles instead of reflecting current state.
The fix: Oracle status now reflects live state, correctly showing which oracles are online and reporting.
🔐 NEW: Round 2 Oracle Consensus Attestation P2P Protocol
RC20 adds the P2P message handlers for the Phase 2 multi-oracle consensus attestation protocol:
- New P2P message types:
ORACLECONSENSUSandORACLEATTESTATION - BroadcastConsensusProposal: Oracles propose consensus prices to peers
- Attestation tracking: Nodes track which oracles have attested to each consensus round
- JohnnyLawDGB added to oracle display names at index 8
- 12 new test cases covering Round 2 consensus attestation
These handlers prepare the network for fully decentralized oracle consensus, where oracle nodes coordinate price agreement through P2P messaging rather than independent computation.
🔧 CI/CD Pipeline Fixes (PR #380)
12 commits fixing CI/CD reliability issues:
| Fix | Description |
|---|---|
| OpenSSL build failure | Moved -D_GNU_SOURCE from config_opts to CFLAGS/CPPFLAGS where OpenSSL expects them
|
| libcurl depends failure | Fixed build flags routing through make variables |
| FD overflow crashes | Resolved file descriptor overflow causing test failures on CI runners |
| Missing log categories | Fixed test failures from unregistered DigiDollar debug log categories |
| P2P test flakes on macOS | Excluded flaky P2P tests on macOS CI runners |
| Functional test timeouts | Added timeout-factor for CI runner resource constraints
|
| Parallel test flakes | Reverted to --jobs=1 to prevent P2P port conflicts in CI
|
| Branch triggers | Fixed push triggers for feature/fix branches and added workflow_dispatch
|
| Static cast cleanup | Replaced C-style casts with static_cast in RaiseFileDescriptorLimit
|
| DD transfer test | Fixed functional test that relied on sender node mining the transfer block |
📊 All Changes: RC19 → RC20 (One-Line Summary)
| Category | Count | Summary |
|---|---|---|
| 🐛 Bug fixes | 3 | IBD sync stuck at block 7586, stale mint validation, stale oracle RPC |
| 🔐 Protocol | 4 | Round 2 P2P message types, consensus proposal broadcast, attestation tracking |
| 🔧 CI/CD | 12 | OpenSSL/libcurl build fixes, FD overflow, P2P test flakes, macOS runners |
| 📚 Documentation | 2 | ARCHITECTURE.md + REPO_MAP updates |
| 🧪 Tests | 1 | Round 2 consensus attestation protocol tests |
Total: 22 commits (excluding merges)
🧪 Testing
Test Results
- 1,948+ C++ unit tests — all passing
- 311 functional tests — all passing
- 21 Qt widget tests — all passing (1 new: mint validation on balance change)
- 13 DigiDollar consensus tests — all passing (1 new: IBD oracle skip)
- 12 Round 2 attestation tests — all passing
Technical Changes
| File | Change |
|---|---|
src/validation.cpp
| IBD catch-up heuristic — skip oracle validation during sync |
src/qt/digidollarmintwidget.cpp
| Refresh validation state on balance change |
src/net_processing.cpp
| ORACLECONSENSUS and ORACLEATTESTATION P2P handlers |
src/oracle/bundle_manager.cpp
| BroadcastConsensusProposal + attestation tracking |
src/protocol.cpp/h
| New P2P message type constants |
src/rpc/oracle.cpp
| JohnnyLawDGB oracle name, stale data fix |
src/test/digidollar_consensus_tests.cpp
| IBD oracle skip test |
src/qt/test/digidollarwidgettests.cpp
| Mint validation balance change test |
contrib/guix/*, ci/*
| CI/CD pipeline fixes |
Commits Since RC19
Bug Fixes
a4b3bd5890 fix: IBD catch-up sync stuck at block 7586 with bad-oracle-price
cd4dc4f3f9 fix: mint validation updates on balance change
63620442e0 fix: getoracles RPC showing stale data for offline oracles
a8f57877aa fix: mine DD transfer on sender node to ensure block inclusion
Oracle Protocol (Round 2)
3cc9255765 net_processing: Add ORACLECONSENSUS and ORACLEATTESTATION P2P handlers
19e213e9f5 oracle: Add BroadcastConsensusProposal and attestation tracking
d29af474d3 protocol: Add ORACLECONSENSUS and ORACLEATTESTATION P2P message types
1995821c27 rpc: Add JohnnyLawDGB to oracle_names at index 8
Tests
1017ff01a9 test: Add Round 2 consensus attestation protocol tests
CI/CD Pipeline (PR #380)
5bb31114ce ci: exclude flaky P2P tests on macOS CI runners
f0e53b4d9b ci: add timeout-factor for functional tests on CI runners
8f106f6cdb ci: revert functional tests to --jobs=1 to avoid P2P flakes
5d9f5d7ff7 ci: run functional tests with --jobs=2 for faster CI
9aa2f6fc8b fix: move OpenSSL compiler flags from config_opts to CFLAGS/CPPFLAGS
cfa54b5a9b fix: resolve CI depends build failures for OpenSSL and libcurl
c5b9060bb7 style: use static_cast instead of C-style casts in RaiseFileDescriptorLimit
8df2da6ee2 ci: remove push triggers for feature/fix branches
fff5f47c0c ci: add push triggers for feature/fix branches and workflow_dispatch
13dc517aaf fix: resolve CI test failures from FD overflow and missing log categories
Documentation
81a6edbe02 docs: update ARCHITECTURE.md + REPO_MAP.md with DigiDollar Phase 2 + RED HORNET audit (2026-02-14)
50d5f2884a docs: Update REPO_MAP_DIGIDOLLAR with Round 2 protocol additions
Version
951f4af72f Bump version to v9.26.0-rc20, update wallet image
What is DigiDollar?
DigiDollar is a USD-pegged stablecoin built natively into DigiByte. It uses an over-collateralized model where users lock DGB to mint DUSD at the current oracle price of DGB.
The world's first truly decentralized stablecoin native on a UTXO blockchain, enabling stable value transactions without centralized control.
DGB becomes the strategic reserve asset (21B max, only ~1.94 DGB per person on Earth). Everything happens inside DigiByte Core wallet. You never give up control of your private keys. No centralized company, fund or pool. Pure decentralization.
Learn more: https://digibyte.io/digidollar
Wallet GUI Guide
How to Use DigiDollar in the Wallet
- Open the DigiDollar Tab — Click "DigiDollar" in the top navigation bar (will show activation status until BIP9 activates)
- Mint DigiDollars — Lock DGB as collateral to create DUSD. Enter the amount and confirm.
- Send DigiDollars — Use the DigiDollar tab's send function or "Send DGB" with a DD address
- Receive DigiDollars — Click "Receive DGB" to get your DD-capable address
- View History — DD Transactions tab shows complete transaction history (auto-refreshes)
- Redeem DigiDollars — Burn DUSD to unlock your DGB collateral after the lock period expires
- Coin Control — Use manual DD input selection for advanced redemptions
- Address Book — Save frequently used DD addresses for quick sending
- Export History — Export DD transactions to CSV for record keeping
- Mask Values — Enable "Mask Values" to hide all balances and amounts across DGB and DigiDollar tabs for privacy
Oracle Operator Setup
Prerequisites
- DigiByte Core RC20 built from source with curl support (or download the binary)
- An assigned oracle ID (0–8 for testnet, contact the maintainer)
New Oracle Setup (First Time)
# Step 1: Start your node
digibyted -testnet -daemon
# Step 2: Create a wallet
digibyte-cli -testnet createwallet "oracle"
# Step 3: Generate your oracle key (one-time)
digibyte-cli -testnet -rpcwallet=oracle createoraclekey <your_oracle_id>
# Step 4: Start the oracle
digibyte-cli -testnet -rpcwallet=oracle startoracle <your_oracle_id>Existing Oracle — Upgrading from RC19
No chain reset. Just update the binary and restart:
# Step 1: Stop your node
digibyte-cli -testnet stop
# Step 2: Replace the binary with RC20
# Step 3: Start your node
digibyted -testnet -daemon
# Step 4: Load your wallet and start oracle
digibyte-cli -testnet loadwallet "oracle"
digibyte-cli -testnet -rpcwallet=oracle startoracle <your_oracle_id>Existing Oracle — Upgrading from RC18 or Earlier
Your oracle keys are safe. Copy your oracle wallet from the old testnet directory to testnet19:
- Before deleting old data, copy your oracle wallet:
- Linux: Copy
~/.digibyte/testnet18/wallets/oracle/to a safe location - Windows: Copy
%APPDATA%\DigiByte\testnet18\wallets\oracle\to a safe location - macOS: Copy
~/Library/Application Support/DigiByte/testnet18/wallets/oracle/to a safe location
- Linux: Copy
- Install RC20 and start the node (it uses the
testnet19directory) - Copy your saved oracle wallet into testnet19:
- Linux:
~/.digibyte/testnet19/wallets/oracle/ - Windows:
%APPDATA%\DigiByte\testnet19\wallets\oracle\ - macOS:
~/Library/Application Support/DigiByte/testnet19/wallets/oracle/
- Linux:
- Load and start your oracle:
digibyte-cli -testnet loadwallet "oracle" digibyte-cli -testnet -rpcwallet=oracle startoracle <your_oracle_id>
Qt Wallet Users
- Start DigiByte Qt with
-testnet - Go to File → Open Wallet → oracle to load your wallet
- Go to Help → Debug Window → Console
- Type:
startoracle <your_oracle_id>
Current Oracle Operators (Testnet)
| ID | Operator | Status |
|---|---|---|
| 0 | Jared | ✅ Active |
| 1 | Green Candle | ✅ Active |
| 2 | Bastian | ✅ Active |
| 3 | DanGB | ✅ Active |
| 4 | Shenger | ✅ Active |
| 5 | Ycagel | ✅ Active |
| 6 | Aussie Epic | ✅ Active |
| 7 | LookIntoMyEyes | ✅ Active |
| 8 | JohnnyLawDGB | ✅ Active |
For the complete guide, see DIGIDOLLAR_ORACLE_SETUP.md.
Complete RPC Command Reference
DigiDollar Commands (Wallet)
| Command | Description |
|---|---|
mintdigidollar
| Mint DigiDollars by locking DGB as collateral |
senddigidollar
| Send DigiDollars to another address |
redeemdigidollar
| Redeem DigiDollars to unlock DGB collateral |
getdigidollarbalance
| Show your DigiDollar balance |
listdigidollarpositions
| List your active collateral positions |
listdigidollartxs
| List your DigiDollar transaction history |
getdigidollaraddress
| Get or create a DigiDollar receive address |
validateddaddress
| Validate a DigiDollar address |
listdigidollaraddresses
| List all DigiDollar addresses in your wallet |
importdigidollaraddress
| Import a DigiDollar address for watch-only |
getdigidollarstats
| Get network-wide DigiDollar statistics |
getdigidollardeploymentinfo
| Get DigiDollar activation/deployment status |
calculatecollateralrequirement
| Calculate DGB collateral needed for a DD mint |
estimatecollateral
| Estimate collateral requirement by tier |
getdcamultiplier
| Get the current DCA multiplier for collateral |
getredemptioninfo
| Get info about redeeming a specific position |
getprotectionstatus
| Check if liquidation protection is active |
Oracle Commands
| Command | Description |
|---|---|
createoraclekey <id>
| Generate a new oracle Schnorr keypair (one-time) |
getoraclepubkey <id>
| Show the oracle public key stored in your wallet |
startoracle <id>
| Start running as an oracle operator |
stoporacle <id>
| Stop your oracle |
getoracleprice
| Get the consensus price |
getalloracleprices
| Per-oracle breakdown |
getoracles
| Network-wide oracle status |
listoracle
| Show your local oracle status |
sendoracleprice
| Manually submit a price (testing) |
Upgrade Notes
Upgrading from RC19
No chain reset. Simply replace the binary and restart:
- Stop your node:
digibyte-cli -testnet stop - Replace the binary with the RC20 download
- Start your node:
digibyted -testnet -daemon(or launch Qt) - Reload your oracle (if applicable — see Oracle section above)
Your blockchain data, wallets, oracle keys, and all configuration carry over unchanged.
Upgrading from RC18 or Earlier
RC19 reset the testnet chain. If you're coming from RC18 or earlier, follow the RC19 migration steps:
- Save your oracle wallet (if you run an oracle — see Oracle migration section above)
- Delete old testnet data:
- Linux: Delete
~/.digibyte/testnet18/(and any older testnet directories) - Windows: Delete
%APPDATA%\DigiByte\testnet18\ - macOS: Delete
~/Library/Application Support/DigiByte/testnet18/
- Linux: Delete
- Download and install RC20
- Update your
digibyte.conf— theaddnodeaddresses remain the same:testnet=1 [test] digidollar=1 addnode=oracle1.digibyte.io
- Launch with
-testnet— a newtestnet19directory will be created automatically - Restore your oracle wallet if applicable (see migration steps above)
Configuration
Minimum digibyte.conf for DigiDollar Testing:
testnet=1
[test]
digidollar=1
addnode=oracle1.digibyte.ioOptional Settings:
[test]
txindex=1
digidollarstatsindex=1
algo=sha256dKnown Issues
startoraclemust be re-run after every node restart- DigiDollar features are disabled until BIP9 activation completes (~block 600 with continuous mining)
- Oracle prices show as 0 or "Not Reporting" until enough oracle operators restart their oracles on RC20
Network Information
| Setting | Value |
|---|---|
| Network | Testnet (testnet19) |
| Default P2P Port | 12033 |
| Default RPC Port | 14025 |
| Oracle Node | oracle1.digibyte.io |
| Address Prefix | dgbt1... (bech32) |
| Multi-Algo Activation | Block 100 |
| BIP9 Signaling Start | Block 200 |
| BIP9 Threshold | 70% (140 of 200 blocks) |
| DD Activation (earliest) | Block 600 |
| Oracle Consensus | 5-of-9 Schnorr threshold |
| Exchange Sources | 6 (Binance, CoinGecko, KuCoin, Gate.io, HTX, Crypto.com) |
Downloads
| Platform | File |
|---|---|
| Windows 64-bit (Installer) | digibyte-9.26.0-rc20-win64-setup.exe
|
| Windows 64-bit (Portable) | digibyte-9.26.0-rc20-win64.zip
|
| macOS Apple Silicon (M1/M2/M3/M4) | digibyte-9.26.0-rc20-arm64-apple-darwin.dmg
|
| macOS Intel | digibyte-9.26.0-rc20-x86_64-apple-darwin.dmg
|
| Linux x86_64 | digibyte-9.26.0-rc20-x86_64-linux-gnu.tar.gz
|
| Linux ARM64 (Raspberry Pi) | digibyte-9.26.0-rc20-aarch64-linux-gnu.tar.gz
|
Quick Start
New to DigiDollar?
- Download the binary for your platform (see Downloads above)
- Create your config file (see Configuration section)
- Launch with
-testnetflag:./digibyte-qt -testnet - Wait for the blockchain to sync
- Monitor BIP9 activation:
digibyte-cli -testnet getdigidollardeploymentinfo - Once activated, the DigiDollar tab becomes fully functional
- You need DGB to mint — ask in Gitter and someone can send you testnet DGB
Want to Run an Oracle?
See the Oracle Operator Setup section above, or read DIGIDOLLAR_ORACLE_SETUP.md for the complete guide.
Troubleshooting
"DigiDollar tab says Not Activated"
- This is expected if BIP9 hasn't activated yet. DigiDollar features unlock after miners signal support and the activation threshold is reached.
- Monitor progress:
digibyte-cli -testnet getdigidollardeploymentinfo
"Sync stuck at block 7586" (RC19 bug — FIXED in RC20)
- This was the IBD latch bug. Upgrade to RC20 and resync — it will sync the full chain without issues.
- If you copied blocks/chainstate from another node as a workaround, that still works too.
"Can't connect to network"
- RC19/RC20 uses port 12033 (not 12032 or earlier). Check your firewall.
- Make sure
addnode=oracle1.digibyte.iois under[test]in your config
"Old testnet data"
- If coming from RC18 or earlier, delete ALL old testnet directories (testnet10 through testnet18) — RC19/RC20 uses testnet19
"No wallet is loaded" when running oracle commands
- Load your wallet first:
digibyte-cli -testnet loadwallet "oracle" - For Qt: File → Open Wallet → oracle
"Mining not working"
- Blocks 0-99 are scrypt-only. After block 100, multi-algo activates.
- Set
algo=sha256din config for fastest CPU mining after block 100
"Oracle price shows 0 or N/A"
- Oracle prices require BIP9 activation first
- Wait for activation and sufficient oracle operators to come online after upgrading to RC20
"Node stuck 7 hours behind after reindex"
- Same IBD latch bug as block 7586 — fixed in RC20. Upgrade and resync.
Feedback & Community
Please report issues and feedback to help us prepare for mainnet launch.
When reporting bugs, start your message with BUG: and include: what happened, steps to reproduce, platform (Windows/Linux/Mac), and any error messages from your debug.log file.
- Developer Chat (Gitter): https://app.gitter.im/#/room/#digidollar:gitter.im
- GitHub Issues: https://github.com/DigiByte-Core/digibyte/issues