The docs/packaging were largely un-rebranded Hush3 content, with several docs stating facts that are wrong for DragonX. This rewrites them against the verified DragonX source state. Corrections (not just branding): - PoW: RandomX (CPU), not Equihash/ASIC — README, overview.md, randomx.md - Privacy: private from genesis (ac_private=1, Sapling@height1), not "as of block 340000" — overview.md, payment-api.md - Removed the false "coinbase must be shielded" consensus claim (shield-coinbase.md, payment-api.md); coinbase is directly spendable - Fixed default fee 0.0001 (was 0.0010000, 10x); stratum port 22769 (was 19031) - datadir ~/.hush/DRAGONX, DRAGONX.conf, dragonxd/dragonx-cli/dragonx-tx, git.dragonx.is throughout; branch model dev->dragonx - Softened the inherited dPoW reorg claim (no live DragonX notary infra) Packaging: fix build-debian-package.sh + gen-manpages.sh to use the dragonx binaries/manpages; rename bash-completions to dragonx*; drop hush-arrakis-chain from the package. Keep /usr/share/hush (hardcoded in the binary for params). Also: README links/logo, ObsidianDragon + SilentDragonXAndroid wallets, networking/init/dev-process/contrib/util rebrand, and leftover helper scripts. Delete legacy duplicates (hushd.* init/service, HUSH3.conf examples, OLD_WALLETS.md, hsc.md) and rename hush-uri.bat -> dragonx-uri.bat. Out of scope (noted, not changed): historical changelog/copyright, the Hush mainnet airdrop snapshot, seed data files, depends/ source mirrors, and the in-code strCurrencyUnits="HUSH". Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8.8 KiB
DragonX Release Process
High-Level Philosophy
Beware of making high-risk changes (such as consensus changes, p2p layer changes and wallet/transaction changes) too close to a new release, because they will not get as much testing as they should. Don't merge large branches which haven't undergone lots of testing just before a release.
It is best to keep doc/relnotes/README.md up to date as changes and bug fixes are made. It's more work to summarize all changes and bugfixes just before the release.
Branch model
Development happens on the dev branch. Releases are cut on the default branch, dragonx. There is no master branch. Code changes should land on dev first and undergo testing before being merged into dragonx.
Check for changes on dragonx that should be on dev
Occasionally trivial changes are made directly on the dragonx branch, such as documentation changes. In theory, no code changes should happen on dragonx without being on dev first, but it's better to be safe than sorry. We want the dev branch which undergoes testing to be as close as possible to what the dragonx branch will become, so we don't want to merge dev into dragonx and just assume everything works. So it's best to merge the dragonx branch into dev just before merging the dev branch into dragonx.
To check if the dragonx branch has any changes that the dev branch does not:
# this assumes you are working with https://git.dragonx.is/DragonX/dragonx as your remote
git checkout dev
git pull # make sure dev is up to date
git checkout dragonx
git pull # make sure dragonx is up to date
git diff dev...dragonx # look at the set of changes which exist in dragonx but not dev
If the last command has no output, congrats, there is nothing to do. If the last command has output, then you should merge dragonx into dev:
git checkout dev
git merge dragonx
git push origin dev
Use the --no-ff flag when merging dev into dragonx for a release (see below). The --no-ff flag makes sure to make a merge commit, no matter what, even if a "fast forward" could be done. For those in the future looking back, it's much better to see evidence of when branches were merged.
Git Issues
Look for Git issues that should be fixed in the next release. Especially low-risk and simple things, like documentation changes, improvements to error messages and RPC help output.
Pre-release checklist:
- Is this release changing consensus rules? Definitely update protocol version.
Protocol Safety Checks:
- Does
PROTOCOL_VERSIONin src/version.h need to be increased?- All releases with a consensus change should increase the value by 1
- All releases with a large change to the networking (P2P) layer should increase the value by 1
- This identifies a nodes protocol version to all other peers it connects to.
- Does
MIN_PEER_PROTO_VERSIONin src/version.h need to change?- If it does, new nodes will not be able to talk to nodes with a version less than
MIN_PROTO_VERSION
- If it does, new nodes will not be able to talk to nodes with a version less than
- The main use of these is for newer nodes that know they do not want to talk to older nodes to prevent connecting to older nodes efficiently
- For instance, when a new release has different consensus rules than older nodes,
MIN_PROTO_VERSIONprevents wasting lots of network bandwidth talking to incompatible nodes which will eventually be banned for disagreeing on consensus rules
Release dependencies
Install deps on Linux:
apt-get install help2man devscripts
Release process
- If new seeds are being added or seeds are changing:
- Edit contrib/seeds/nodes_main.txt
- Run "make seeds"
- Commit the result
- Update version in configure.ac and src/clientversion.h to update the dragonxd version
- In src/clientversion.h you update
CLIENT_VERSION_*variables. Usually you will just updateCLIENT_VERSION_REVISION - If there is a consensus change, it may be a good idea to update
CLIENT_VERSION_MINORorCLIENT_VERSION_MAJOR - To make a pre-release "beta" you can modify
CLIENT_VERSION_BUILDbut that is rarely done. - A
CLIENT_VERSION_BUILDof 50 means "actual non-beta release" - Make sure to keep the values in configure.ac and src/clientversion.h the same. The variables are prefixed wth an underscore in configure.ac
- In src/clientversion.h you update
- Run
./util/gen-manpages.sh, commit + push results- There is a hack in the script where you can hardcode a version number if dragonxd isn't compiled on this machine
- Comment out the version line and uncomment the line above it with a hardcoded version number
- PROTIP: Man page creation must be done after updating the version number and recompiling and before Debian package creation
- TODO: How to regenerate html man pages?
- Update checkpoints in src/chainparams.cpp via util/checkpoints.pl
- Run "./util/checkpoints.pl help" to get example usage
- dragonxd must be running to run this script, since it uses dragonx-cli to get the data
- Look for the line which marks the end of the mainnet checkpoint data in chainparams.cpp, that is where checkpoint data ends
- Find the highest block height of checkpoint data, let's call it HEIGHT
- Run
./util/checkpoints.pl 1000 HEIGHT &> checkpoints.txtto generate the latest checkpoint data - To copy the new data from checkpoints.txt into the file, one way in Vim is to type ":r checkpoints.txt" which will read in a file and paste it as the current cursor
- You will see 3 lines of "stats" at the end of the output, you just pasted in the newest stats. Delete the old stats that should be the 3 lines under the current stats
- Make sure the new code compiles, commit and push
- Run
./util/checkpoints.pl helpto see some basic help- By default it will generate checkpoints for every 1000 blocks, the "stride"
- You can get a different "stride" by passing it in as the first arg to the script
- To get checkpoint data for every 5000 blocks:
./util/checkpoints.pl 5000 &> checkpoints.txt
- checkpoints.pl will just generate the data you need, it must be manually copied into the correct place
- Checkpoints are a list of block heights and block hashes that tell a full node the correct block history of the blockchain
- Checkpoints make block verification a bit faster, because nodes can say "is this block a descendant of a checkpoint block?" instead of doing full consensus checks, which take more time
- Checkpoints also provide a bit of security against some attacks that would create malicious chainforks
- They only provide limited security, because they talk about the past, not future block heights.
- Try to generate checkpoints as close to the release as possible, so you can have a recent block height be protected.
- For instance, don't update checkpoints and then do a release a month later. You can always update checkpoint data again or multiple times
- Update doc/relnotes/README.md
- To get the stats of file changes:
git diff --stat dragonx...dev
- To get the stats of file changes:
- Do a fresh clone and fresh sync with new checkpoints
- Stop node, wait 20 minutes, and then do a partial sync with new checkpoints
- Merge dev into dragonx:
git checkout dev && git pull && git checkout dragonx && git pull && git merge --no-ff dev && git push- The above command makes sure that your local dev branch is up to date before doing anything
- The above command will not merge if "git pull" creates a merge conflict
- The above command will not push if there is a problem with merging dev
- Make Gitea release with git tag from the dragonx branch (make sure to merge dev in first)
- Make sure git tag starts with a
vsuch asv1.0.3
- Make sure git tag starts with a
- Use util/gen-linux-binary-release.sh to make a Linux release binary
- Upload Linux binary to Gitea release and add SHA256 sum
- Create an x86 Debian package for the release:
- Edit contrib/debian/changelog to add information about the new release
- Use
util/build-debian-package.shto make an x86 Debian package for the release - Debian packages should be done after you make manpages, because those are included in Debian packages
lintianis an optional dependency, it's not needed to build the .deb- Upload .deb to Gitea release
- Add SHA256 checksum of .deb to release
- Use util/build-debian-package-ARM.sh (does this still work?) to make an ARM Debian package for the release
- Upload the debian packages to the Gitea release page, with SHA256 sums
Platform-specific notes
- Use
./util/build-mac.shto compile on Apple/Mac systems - Use
./util/build-win.shto build on Windows
Optional things
Updating RandomX
If you need to update the source code of our in tree copy of RandomX, open an issue in the DragonX Git repository to track the details. Currently we use RandomX v1.2.1 from the official repo at https://github.com/tevador/RandomX/releases/tag/v1.2.1