diff --git a/RELEASE_v9.26.0-rc20.md b/RELEASE_v9.26.0-rc20.md new file mode 100644 index 0000000000..856ce968d1 --- /dev/null +++ b/RELEASE_v9.26.0-rc20.md @@ -0,0 +1,503 @@ +# 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:** + +```bash +digibyte-cli -testnet loadwallet "oracle" +digibyte-cli -testnet -rpcwallet=oracle startoracle +``` + +Qt users: **File โ†’ Open Wallet โ†’ oracle**, then **Help โ†’ Debug Window โ†’ Console** โ†’ `startoracle ` + +> **โš ๏ธ 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 `createoraclekey` again. + +--- + +## 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:** `ORACLECONSENSUS` and `ORACLEATTESTATION` +- **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 + +1. **Open the DigiDollar Tab** โ€” Click "DigiDollar" in the top navigation bar (will show activation status until BIP9 activates) +2. **Mint DigiDollars** โ€” Lock DGB as collateral to create DUSD. Enter the amount and confirm. +3. **Send DigiDollars** โ€” Use the DigiDollar tab's send function or "Send DGB" with a DD address +4. **Receive DigiDollars** โ€” Click "Receive DGB" to get your DD-capable address +5. **View History** โ€” DD Transactions tab shows complete transaction history (auto-refreshes) +6. **Redeem DigiDollars** โ€” Burn DUSD to unlock your DGB collateral after the lock period expires +7. **Coin Control** โ€” Use manual DD input selection for advanced redemptions +8. **Address Book** โ€” Save frequently used DD addresses for quick sending +9. **Export History** โ€” Export DD transactions to CSV for record keeping +10. **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) + +```bash +# 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 + +# Step 4: Start the oracle +digibyte-cli -testnet -rpcwallet=oracle startoracle +``` + +### Existing Oracle โ€” Upgrading from RC19 + +**No chain reset.** Just update the binary and restart: + +```bash +# 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 +``` + +### Existing Oracle โ€” Upgrading from RC18 or Earlier + +**Your oracle keys are safe.** Copy your oracle wallet from the old testnet directory to `testnet19`: + +1. **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 +2. **Install RC20** and start the node (it uses the `testnet19` directory) +3. **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/` +4. **Load and start your oracle:** + ```bash + digibyte-cli -testnet loadwallet "oracle" + digibyte-cli -testnet -rpcwallet=oracle startoracle + ``` + +### Qt Wallet Users + +1. Start DigiByte Qt with `-testnet` +2. Go to **File โ†’ Open Wallet โ†’ oracle** to load your wallet +3. Go to **Help โ†’ Debug Window โ†’ Console** +4. Type: `startoracle ` + +### 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 ` | Generate a new oracle Schnorr keypair (one-time) | +| `getoraclepubkey ` | Show the oracle public key stored in your wallet | +| `startoracle ` | Start running as an oracle operator | +| `stoporacle ` | 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: + +1. **Stop your node:** `digibyte-cli -testnet stop` +2. **Replace the binary** with the RC20 download +3. **Start your node:** `digibyted -testnet -daemon` (or launch Qt) +4. **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: + +1. **Save your oracle wallet** (if you run an oracle โ€” see Oracle migration section above) +2. **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/` +3. **Download and install RC20** +4. **Update your `digibyte.conf`** โ€” the `addnode` addresses remain the same: + ```ini + testnet=1 + + [test] + digidollar=1 + addnode=oracle1.digibyte.io + ``` +5. **Launch with `-testnet`** โ€” a new `testnet19` directory will be created automatically +6. **Restore your oracle wallet** if applicable (see migration steps above) + +--- + +## Configuration + +### Minimum digibyte.conf for DigiDollar Testing: +```ini +testnet=1 + +[test] +digidollar=1 +addnode=oracle1.digibyte.io +``` + +### Optional Settings: +```ini +[test] +txindex=1 +digidollarstatsindex=1 +algo=sha256d +``` + +--- + +## Known Issues + +- `startoracle` must 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? + +1. Download the binary for your platform (see Downloads above) +2. Create your config file (see Configuration section) +3. Launch with `-testnet` flag: `./digibyte-qt -testnet` +4. Wait for the blockchain to sync +5. Monitor BIP9 activation: `digibyte-cli -testnet getdigidollardeploymentinfo` +6. Once activated, the DigiDollar tab becomes fully functional +7. 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.io` is 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=sha256d` in 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