mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
Merge pull request #5712 from PastaPastaPasta/20.0.1-backports
backport: v20.0.1 backports and release
This commit is contained in:
commit
702bc49ac2
@ -1,7 +1,7 @@
|
|||||||
AC_PREREQ([2.69])
|
AC_PREREQ([2.69])
|
||||||
define(_CLIENT_VERSION_MAJOR, 20)
|
define(_CLIENT_VERSION_MAJOR, 20)
|
||||||
define(_CLIENT_VERSION_MINOR, 0)
|
define(_CLIENT_VERSION_MINOR, 0)
|
||||||
define(_CLIENT_VERSION_BUILD, 0)
|
define(_CLIENT_VERSION_BUILD, 1)
|
||||||
define(_CLIENT_VERSION_RC, 0)
|
define(_CLIENT_VERSION_RC, 0)
|
||||||
define(_CLIENT_VERSION_IS_RELEASE, true)
|
define(_CLIENT_VERSION_IS_RELEASE, true)
|
||||||
define(_COPYRIGHT_YEAR, 2023)
|
define(_COPYRIGHT_YEAR, 2023)
|
||||||
|
@ -447,6 +447,7 @@ EOF
|
|||||||
${SUBSTITUTE_URLS:+--substitute-urls="$SUBSTITUTE_URLS"} \
|
${SUBSTITUTE_URLS:+--substitute-urls="$SUBSTITUTE_URLS"} \
|
||||||
${ADDITIONAL_GUIX_COMMON_FLAGS} ${ADDITIONAL_GUIX_ENVIRONMENT_FLAGS} \
|
${ADDITIONAL_GUIX_COMMON_FLAGS} ${ADDITIONAL_GUIX_ENVIRONMENT_FLAGS} \
|
||||||
-- env HOST="$host" \
|
-- env HOST="$host" \
|
||||||
|
CONFIGFLAGS="$CONFIGFLAGS" \
|
||||||
DISTNAME="$DISTNAME" \
|
DISTNAME="$DISTNAME" \
|
||||||
JOBS="$JOBS" \
|
JOBS="$JOBS" \
|
||||||
SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:?unable to determine value}" \
|
SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:?unable to determine value}" \
|
||||||
|
@ -27,6 +27,7 @@ Required environment variables as seen inside the container:
|
|||||||
DIST_ARCHIVE_BASE: ${DIST_ARCHIVE_BASE:?not set}
|
DIST_ARCHIVE_BASE: ${DIST_ARCHIVE_BASE:?not set}
|
||||||
DISTNAME: ${DISTNAME:?not set}
|
DISTNAME: ${DISTNAME:?not set}
|
||||||
HOST: ${HOST:?not set}
|
HOST: ${HOST:?not set}
|
||||||
|
CONFIGFLAGS: ${CONFIGFLAGS:?not set}
|
||||||
SOURCE_DATE_EPOCH: ${SOURCE_DATE_EPOCH:?not set}
|
SOURCE_DATE_EPOCH: ${SOURCE_DATE_EPOCH:?not set}
|
||||||
JOBS: ${JOBS:?not set}
|
JOBS: ${JOBS:?not set}
|
||||||
DISTSRC: ${DISTSRC:?not set}
|
DISTSRC: ${DISTSRC:?not set}
|
||||||
@ -229,7 +230,7 @@ mkdir -p "$OUTDIR"
|
|||||||
###########################
|
###########################
|
||||||
|
|
||||||
# CONFIGFLAGS
|
# CONFIGFLAGS
|
||||||
CONFIGFLAGS="--enable-reduce-exports --disable-bench --disable-gui-tests --disable-fuzz-binary"
|
CONFIGFLAGS+=" --enable-reduce-exports --disable-bench --disable-gui-tests --disable-fuzz-binary"
|
||||||
case "$HOST" in
|
case "$HOST" in
|
||||||
*linux*) CONFIGFLAGS+=" --disable-threadlocal" ;;
|
*linux*) CONFIGFLAGS+=" --disable-threadlocal" ;;
|
||||||
esac
|
esac
|
||||||
@ -285,6 +286,13 @@ mkdir -p "$DISTSRC"
|
|||||||
# Build Dash Core
|
# Build Dash Core
|
||||||
make --jobs="$JOBS" ${V:+V=1}
|
make --jobs="$JOBS" ${V:+V=1}
|
||||||
|
|
||||||
|
# Make macos-specific debug symbols
|
||||||
|
case "$HOST" in
|
||||||
|
*darwin*)
|
||||||
|
make -C src/ osx_debug
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
# Check that symbol/security checks tools are sane.
|
# Check that symbol/security checks tools are sane.
|
||||||
make test-security-check ${V:+V=1}
|
make test-security-check ${V:+V=1}
|
||||||
# Perform basic security checks on a series of executables.
|
# Perform basic security checks on a series of executables.
|
||||||
@ -307,14 +315,7 @@ mkdir -p "$DISTSRC"
|
|||||||
INSTALLPATH="${PWD}/installed/${DISTNAME}"
|
INSTALLPATH="${PWD}/installed/${DISTNAME}"
|
||||||
mkdir -p "${INSTALLPATH}"
|
mkdir -p "${INSTALLPATH}"
|
||||||
# Install built Dash Core to $INSTALLPATH
|
# Install built Dash Core to $INSTALLPATH
|
||||||
case "$HOST" in
|
make install DESTDIR="${INSTALLPATH}" ${V:+V=1}
|
||||||
*darwin*)
|
|
||||||
make install-strip DESTDIR="${INSTALLPATH}" ${V:+V=1}
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
make install DESTDIR="${INSTALLPATH}" ${V:+V=1}
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case "$HOST" in
|
case "$HOST" in
|
||||||
*darwin*)
|
*darwin*)
|
||||||
@ -354,7 +355,10 @@ mkdir -p "$DISTSRC"
|
|||||||
rm -rf "${DISTNAME}/lib/pkgconfig"
|
rm -rf "${DISTNAME}/lib/pkgconfig"
|
||||||
|
|
||||||
case "$HOST" in
|
case "$HOST" in
|
||||||
*darwin*) ;;
|
*darwin*)
|
||||||
|
# Copy dSYM-s
|
||||||
|
find ../src -name "*.dSYM" -exec cp -ra {} "${DISTNAME}/bin" \;
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
# Split binaries and libraries from their debug symbols
|
# Split binaries and libraries from their debug symbols
|
||||||
{
|
{
|
||||||
@ -403,11 +407,16 @@ mkdir -p "$DISTSRC"
|
|||||||
|| ( rm -f "${OUTDIR}/${DISTNAME}-${HOST}-debug.tar.gz" && exit 1 )
|
|| ( rm -f "${OUTDIR}/${DISTNAME}-${HOST}-debug.tar.gz" && exit 1 )
|
||||||
;;
|
;;
|
||||||
*darwin*)
|
*darwin*)
|
||||||
find "${DISTNAME}" -print0 \
|
find "${DISTNAME}" -not -path "*.dSYM*" -print0 \
|
||||||
| sort --zero-terminated \
|
| sort --zero-terminated \
|
||||||
| tar --create --no-recursion --mode='u+rw,go+r-w,a+X' --null --files-from=- \
|
| tar --create --no-recursion --mode='u+rw,go+r-w,a+X' --null --files-from=- \
|
||||||
| gzip -9n > "${OUTDIR}/${DISTNAME}-${HOST}.tar.gz" \
|
| gzip -9n > "${OUTDIR}/${DISTNAME}-${HOST}.tar.gz" \
|
||||||
|| ( rm -f "${OUTDIR}/${DISTNAME}-${HOST}.tar.gz" && exit 1 )
|
|| ( rm -f "${OUTDIR}/${DISTNAME}-${HOST}.tar.gz" && exit 1 )
|
||||||
|
find "${DISTNAME}" -path "*.dSYM*" -print0 \
|
||||||
|
| sort --zero-terminated \
|
||||||
|
| tar --create --no-recursion --mode='u+rw,go+r-w,a+X' --null --files-from=- \
|
||||||
|
| gzip -9n > "${OUTDIR}/${DISTNAME}-${HOST}-debug.tar.gz" \
|
||||||
|
|| ( rm -f "${OUTDIR}/${DISTNAME}-${HOST}-debug.tar.gz" && exit 1 )
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
) # $DISTSRC/installed
|
) # $DISTSRC/installed
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
# Dash Core version v20.0.0
|
# Dash Core version v20.0.1
|
||||||
|
|
||||||
Release is now available from:
|
Release is now available from:
|
||||||
|
|
||||||
<https://www.dash.org/downloads/#wallets>
|
<https://www.dash.org/downloads/#wallets>
|
||||||
|
|
||||||
This is a new major version release, bringing new features, various bugfixes
|
This is a new patch version release, bringing small bug fixes and build system enhancements.
|
||||||
and other improvements.
|
|
||||||
|
|
||||||
This release is mandatory for all nodes.
|
This release is optional for all nodes.
|
||||||
|
|
||||||
Please report bugs using the issue tracker at GitHub:
|
Please report bugs using the issue tracker at GitHub:
|
||||||
|
|
||||||
@ -36,409 +35,17 @@ reindex or re-sync the whole chain.
|
|||||||
|
|
||||||
# Notable changes
|
# Notable changes
|
||||||
|
|
||||||
## ChainLock-based random beacon
|
## Qt Testnet Crash
|
||||||
|
|
||||||
To improve long-living masternode quorum (LLMQ) selection, the `v20` hard fork
|
A crash has been fixed which has only been seen on testnet and only affects QT clients.
|
||||||
will enable a new random beacon using ChainLock signatures as described in
|
|
||||||
[DIP-0029][DIP-0029]. ChainLock signatures will be stored in the Coinbase
|
|
||||||
transaction to be used as a source of randomness during quorum member
|
|
||||||
calculations. This change increases the decentralization in the source of
|
|
||||||
randomness and prevents masternodes or miners from being able to manipulate the
|
|
||||||
LLMQ process.
|
|
||||||
|
|
||||||
## Treasury expansion
|
## Guix Build System Enhancements
|
||||||
|
The Guix build system has been enhanced to enable building with custom options when needed.
|
||||||
|
This will be used to support custom builds such as for nightly builds with extra debug options.
|
||||||
|
|
||||||
Currently, 10% of block rewards are set aside for the Dash DAO treasury which
|
Additionally, the Guix system will now produce debug symbols for MacOS.
|
||||||
funds development and other network efforts. Once the `v20` hard fork goes into
|
|
||||||
effect on mainnet, the treasury system allotment will increase to 20% of block
|
|
||||||
rewards to align with the proposal approved in September. Miner and masternode
|
|
||||||
rewards will change to 20% and 60% respectively upon activation of the change,
|
|
||||||
previous reallocation periods are ignored.
|
|
||||||
|
|
||||||
## Asset lock and unlock transactions
|
# v20.0.1 Change log
|
||||||
|
|
||||||
The asset lock process provides a mechanism for locking and unlocking Dash in a
|
|
||||||
credit pool. This credit pool mirrors the available credit supply in Dash
|
|
||||||
Platform. When a certain amount of Dash is locked, a proportional number of
|
|
||||||
credits are issued to the identity specified by the transaction issuer. The
|
|
||||||
identity then uses the credits to pay fees for operations done on Dash
|
|
||||||
Platform. Masternode identities receive the fees and can convert them back to
|
|
||||||
Dash by withdrawing them from Dash Platform.
|
|
||||||
|
|
||||||
Note: The asset lock feature is activated by the `v20` hard fork while the asset
|
|
||||||
unlock feature will be activated later by another hard fork.
|
|
||||||
|
|
||||||
## Coinbase Transaction Changes
|
|
||||||
|
|
||||||
Once v20 activates, Coinbase transactions in all mined blocks must be of
|
|
||||||
version 3.
|
|
||||||
|
|
||||||
Version 3 of the Coinbase transaction will include the following new fields:
|
|
||||||
- `bestCLSignature` (`BLSSignature`) will hold the best Chainlock signature
|
|
||||||
known at the moment
|
|
||||||
- `bestCLHeightDiff` (`uint32`) is equal to the diff in heights from the mined
|
|
||||||
block height
|
|
||||||
- `creditPoolBalance` (`int64`) is equal to all the duffs locked in all previous
|
|
||||||
blocks minus all the duffs unlocked in all previous blocks plus all the block
|
|
||||||
subsidy paid to evonodes on Platform.
|
|
||||||
|
|
||||||
Although miners are forced to include a version 3 Coinbase transaction, the
|
|
||||||
actual real-time best Chainlock signature isn't required as long as blocks
|
|
||||||
contain a `bestCLSignature` equal to (or newer than) the previous block.
|
|
||||||
|
|
||||||
Note: Until the first `bestCLSignature` is included in a Coinbase transaction
|
|
||||||
once v20 activates, null `bestCLSignature` and `bestCLHeightDiff` values are
|
|
||||||
perfectly valid.
|
|
||||||
|
|
||||||
## Testnet Breaking Changes
|
|
||||||
|
|
||||||
### Enhanced hard fork
|
|
||||||
|
|
||||||
Full implementation of the [DIP-0023][DIP-0023] enhanced hard fork mechanism has
|
|
||||||
been completed. This improved activation mechanism includes signaling from both
|
|
||||||
masternodes and miners while also ensuring sufficient upgrade time is available
|
|
||||||
to partners. This new system is enabled on testnet and devnets by the `v20`
|
|
||||||
activation and a newly introduced `SPORK_24_TEST_EHF` spork.
|
|
||||||
|
|
||||||
### Fixed subsidy base after `v20`
|
|
||||||
|
|
||||||
Starting from `v20` activation, the base block subsidy on testnet and devnets
|
|
||||||
will no longer be calculated based on previous block difficulty. This change
|
|
||||||
mimics mainnet behaviour. It also simplifies calculations for Platform which
|
|
||||||
would not need to constantly get block's difficulty in order to calculate
|
|
||||||
platform reward.
|
|
||||||
|
|
||||||
## Sentinel deprecation
|
|
||||||
|
|
||||||
Sentinel functionality has been integrated directly into v20.0.0, so it will no
|
|
||||||
longer be necessary for masternodes to run the standalone Sentinel application.
|
|
||||||
During the superblock maturity window (1662 blocks), payee masternodes will try
|
|
||||||
to create, sign and submit a superblock candidate. Several RPC commands have
|
|
||||||
been updated to prevent conflicts between v20.0.0 and existing Sentinel
|
|
||||||
installs. It is recommended to remove or disable Sentinel after updating
|
|
||||||
masternodes to v20.0.0.
|
|
||||||
|
|
||||||
## P2P and network changes
|
|
||||||
|
|
||||||
### Removal of reject network messages from Dash Core (BIP61)
|
|
||||||
|
|
||||||
This feature has been disabled by default since Dash Core version 19.0.0.
|
|
||||||
Nodes on the network can not generally be trusted to send valid ("reject")
|
|
||||||
messages, so this should only ever be used when connected to a trusted node.
|
|
||||||
|
|
||||||
Since Dash Core version 20.0.0 there are extra changes:
|
|
||||||
|
|
||||||
The removal of BIP61 `REJECT` message support also has the following minor RPC
|
|
||||||
and logging implications:
|
|
||||||
|
|
||||||
- `testmempoolaccept` and `sendrawtransaction` no longer return the P2P `REJECT`
|
|
||||||
code when a transaction is not accepted to the mempool. They still return the
|
|
||||||
verbal reject reason.
|
|
||||||
|
|
||||||
- Log messages that previously reported the `REJECT` code when a transaction was
|
|
||||||
not accepted to the mempool now no longer report the `REJECT` code. The reason
|
|
||||||
for rejection is still reported.
|
|
||||||
|
|
||||||
### Transaction rebroadcast
|
|
||||||
|
|
||||||
The mempool now tracks whether transactions submitted via the wallet or RPCs
|
|
||||||
have been successfully broadcast. Every 10-15 minutes, the node will try to
|
|
||||||
announce unbroadcast transactions until a peer requests it via a `getdata`
|
|
||||||
message or the transaction is removed from the mempool for other reasons.
|
|
||||||
The node will not track the broadcast status of transactions submitted to the
|
|
||||||
node using P2P relay. This version reduces the initial broadcast guarantees
|
|
||||||
for wallet transactions submitted via P2P to a node running the wallet.
|
|
||||||
|
|
||||||
To improve wallet privacy, the frequency of wallet rebroadcast attempts is
|
|
||||||
reduced from approximately once every 15 minutes to once every 1-3 hours.
|
|
||||||
To maintain a similar level of guarantee for initial broadcast of wallet
|
|
||||||
transactions, the mempool tracks these transactions as a part of the newly
|
|
||||||
introduced unbroadcast set.
|
|
||||||
|
|
||||||
### `MNLISTDIFF` P2P message
|
|
||||||
|
|
||||||
Starting with protocol version `70230`, the following fields are added to the
|
|
||||||
`MNLISTDIFF` message after `newQuorums`.
|
|
||||||
|
|
||||||
| Field | Type | Size | Description |
|
|
||||||
|-|-|-|-|
|
|
||||||
| quorumsCLSigsCount | compactSize uint | 1-9 | Number of quorumsCLSigs elements |
|
|
||||||
| quorumsCLSigs | quorumsCLSigsObject[] | variable | ChainLock signature used to calculate members per quorum indexes (in newQuorums) |
|
|
||||||
|
|
||||||
The content of `quorumsCLSigsObject`:
|
|
||||||
|
|
||||||
| Field | Type | Size | Description |
|
|
||||||
|-|-|-|-|
|
|
||||||
| signature | BLSSig | 96 | ChainLock signature |
|
|
||||||
| indexSetCount | compactSize uint | 1-9 | Number of quorum indexes using the same `signature` for their member calculation |
|
|
||||||
| indexSet | uint16_t[] | variable | Quorum indexes corresponding in `newQuorums` using `signature` for their member calculation |
|
|
||||||
|
|
||||||
Note: The `quorumsCLSigs` field in both RPC and P2P will only be populated after
|
|
||||||
the v20 activation.
|
|
||||||
|
|
||||||
### Other
|
|
||||||
|
|
||||||
- It is possible to run Dash Core as an I2P service and connect to such
|
|
||||||
services. Please read [docs][i2p] for more information.
|
|
||||||
- Removed support for Tor v2, `LEGACYTXLOCKREQUEST` (`"ix"`) message and
|
|
||||||
`NODE_GETUTXO` (bit 1) node service bit.
|
|
||||||
|
|
||||||
## GUI
|
|
||||||
|
|
||||||
Add more granular CoinJoin options to let users control the number of CoinJoin
|
|
||||||
sessions and also the min/max number of denominations for wallets to create
|
|
||||||
while mixing.
|
|
||||||
|
|
||||||
## Remote Procedure Call (RPC) Changes
|
|
||||||
|
|
||||||
### The new RPCs are:
|
|
||||||
|
|
||||||
- `addpeeraddress` Add the address of a potential peer to the address manager.
|
|
||||||
This RPC is for testing only.
|
|
||||||
|
|
||||||
- The `getindexinfo` RPC returns the actively running indices of the node,
|
|
||||||
including their current sync status and height. It also accepts an
|
|
||||||
`index_name` to specify returning only the status of that index.
|
|
||||||
|
|
||||||
- `protx listdiff` RPC returns a full deterministic masternode list diff
|
|
||||||
between two heights.
|
|
||||||
|
|
||||||
### The removed RPCs are:
|
|
||||||
|
|
||||||
- `gobject vote-conf` is no longer available.
|
|
||||||
|
|
||||||
### Changes in existing RPCs introduced through bitcoin backports:
|
|
||||||
|
|
||||||
- The `fundrawtransaction`, `sendmany`, `sendtoaddress`, and
|
|
||||||
`walletcreatefundedpsbt` RPC commands have been updated to include two new
|
|
||||||
fee estimation methods, `DASH/kB` and `duff/B`. The target is the fee
|
|
||||||
expressed explicitly in the given form. In addition, the `estimate_mode`
|
|
||||||
parameter is now case insensitive for all of the above RPC commands.
|
|
||||||
|
|
||||||
- Soft fork reporting in the `getblockchaininfo` return object has been
|
|
||||||
updated. For full details, see the RPC help text. In summary:
|
|
||||||
- The `bip9_softforks` sub-object is no longer returned
|
|
||||||
- The `softforks` sub-object now returns an object keyed by soft fork name,
|
|
||||||
rather than an array
|
|
||||||
- Each softfork object in the `softforks` object contains a `type` value
|
|
||||||
which is either `buried` (for soft fork deployments where the activation
|
|
||||||
height is hard-coded into the client implementation), or `bip9`(for soft
|
|
||||||
fork deployments where activation is controlled by BIP 9 signaling).
|
|
||||||
|
|
||||||
- `getblocktemplate` no longer returns a `rules` array containing `CSV`
|
|
||||||
(the BIP 9 deployments that are currently in active state).
|
|
||||||
|
|
||||||
- The `gettransaction` RPC now accepts a third (boolean) argument, `verbose`.
|
|
||||||
If set to `true`, a new `decoded` field will be added to the response
|
|
||||||
containing the decoded transaction. This field is equivalent to RPC
|
|
||||||
`decoderawtransaction`, or RPC `getrawtransaction` when `verbose` is passed.
|
|
||||||
|
|
||||||
- `testmempoolaccept` and `sendrawtransaction` no longer return the P2P
|
|
||||||
`REJECT` code when a transaction is not accepted to the mempool. See the
|
|
||||||
Section [_Removal of reject network messages from Dash Core (BIP61)_](#removal-of-reject-network-messages-from-dash-core-bip61) above for
|
|
||||||
details on the removal of BIP61 `REJECT` message support.
|
|
||||||
|
|
||||||
- A new descriptor type, `sortedmulti(...)`, has been added to support multisig
|
|
||||||
scripts where the public keys are sorted lexicographically in the resulting
|
|
||||||
script.
|
|
||||||
|
|
||||||
- The RPC `gettransaction`, `listtransactions` and `listsinceblock` responses
|
|
||||||
now also includes the height of the block that contains the wallet
|
|
||||||
transaction, if any.
|
|
||||||
|
|
||||||
- RPC `getaddressinfo` changes:
|
|
||||||
- the `label` field has been deprecated in favor of the `labels` field and
|
|
||||||
will be removed in 0.21. It can be re-enabled in the interim by launching
|
|
||||||
with `-deprecatedrpc=label`.
|
|
||||||
- the `labels` behavior of returning an array of JSON objects containing name
|
|
||||||
and purpose key/value pairs has been deprecated in favor of an array of
|
|
||||||
label names and will be removed in 0.21. The previous behavior can be
|
|
||||||
re-enabled in the interim by launching with `-deprecatedrpc=labelspurpose`.
|
|
||||||
|
|
||||||
- Error codes have been updated to be more accurate for the following error
|
|
||||||
cases:
|
|
||||||
- `signmessage` now returns `RPC_INVALID_ADDRESS_OR_KEY (-5)` if the
|
|
||||||
passed address is invalid. Previously returned `RPC_TYPE_ERROR (-3)`.
|
|
||||||
- `verifymessage` now returns `RPC_INVALID_ADDRESS_OR_KEY (-5)` if the
|
|
||||||
passed address is invalid. Previously returned `RPC_TYPE_ERROR (-3)`.
|
|
||||||
- `verifymessage` now returns `RPC_TYPE_ERROR (-3)` if the passed signature
|
|
||||||
is malformed. Previously returned `RPC_INVALID_ADDRESS_OR_KEY (-5)`.
|
|
||||||
|
|
||||||
- The `settxfee` RPC will fail if the fee is set higher than the `-maxtxfee`
|
|
||||||
command line setting. The wallet will already fail to create transactions
|
|
||||||
with fees higher than `-maxtxfee`.
|
|
||||||
|
|
||||||
- `getmempoolinfo` now returns an additional `unbroadcastcount` field. The
|
|
||||||
mempool tracks locally submitted transactions until their initial broadcast
|
|
||||||
is acknowledged by a peer. This field returns the count of transactions
|
|
||||||
waiting for acknowledgement.
|
|
||||||
|
|
||||||
- Mempool RPCs such as `getmempoolentry` and `getrawmempool` with
|
|
||||||
`verbose=true` now return an additional `unbroadcast` field. This indicates
|
|
||||||
whether initial broadcast of the transaction has been acknowledged by a
|
|
||||||
peer. `getmempoolancestors` and `getmempooldescendants` are also updated.
|
|
||||||
|
|
||||||
- `logging` and `debug` rpc support new logging categories `validations` and
|
|
||||||
`i2p`
|
|
||||||
|
|
||||||
- `gettxoutsetinfo` RPC has 2 new parameters and lots of new fields in
|
|
||||||
results. Please check `help gettxoutsetinfo` for more information.
|
|
||||||
|
|
||||||
- `gettxchainlocks` Returns the block height each transaction was mined at and
|
|
||||||
whether it is chainlocked or not.
|
|
||||||
|
|
||||||
### Dash-specific changes in existing RPCs:
|
|
||||||
|
|
||||||
- `getblockchaininfo` RPC returns the field `activation_height` for each
|
|
||||||
softfork in `locked_in` status indicating the expected activation height.
|
|
||||||
|
|
||||||
- `getblockchaininfo` RPC returns the field `ehf` and `ehf_height` for each
|
|
||||||
softfork. `ehf_height` indicates the minimum height when miner's signals can
|
|
||||||
be accepted for the deployment with `ehf` set to `true`.
|
|
||||||
|
|
||||||
- `getgovernanceinfo` RPC returns two new fields:
|
|
||||||
- `governancebudget` (the governance budget for the next superblock)
|
|
||||||
- `fundingthreshold` (the number of absolute yes votes required for a proposal
|
|
||||||
to be passing)
|
|
||||||
|
|
||||||
- `gobject submit` will no longer accept submission of triggers.
|
|
||||||
|
|
||||||
- `protx diff` RPC returns a new field `quorumsCLSigs`. This field is a list
|
|
||||||
containing: a ChainLock signature and the list of corresponding quorum
|
|
||||||
indexes in `newQuorums`.
|
|
||||||
|
|
||||||
- `protx list`: New type `evo` filters only HPMNs.
|
|
||||||
|
|
||||||
- `*_hpmn` RPCs were renamed:
|
|
||||||
- `protx register_hpmn` to `protx register_evo`
|
|
||||||
- `protx register_fund_hpmn` to `protx register_fund_evo`
|
|
||||||
- `protx register_prepare_hpmn` to `protx register_prepare_evo`
|
|
||||||
- `protx update_service_hpmn` to `protx update_service_evo`
|
|
||||||
|
|
||||||
Please note that `*_hpmn` RPCs are not fully removed; instead they are
|
|
||||||
deprecated so you can still enable them by using the `-deprecatedrpc=hpmn`
|
|
||||||
option.
|
|
||||||
|
|
||||||
- `masternode count` returns the total number of evonodes under field `evo`
|
|
||||||
instead of `hpmn`.
|
|
||||||
|
|
||||||
- `masternodelist`: New mode `evo` filters only HPMNs.
|
|
||||||
|
|
||||||
- Description type string `HighPerformance` is renamed to `Evo`: affects most
|
|
||||||
RPCs return MNs details.
|
|
||||||
|
|
||||||
Please check `help <command>` for more detailed information on specific RPCs.
|
|
||||||
|
|
||||||
## Command-line options
|
|
||||||
|
|
||||||
### New cmd-line options:
|
|
||||||
|
|
||||||
- `-generate` Generate blocks immediately, equivalent to RPC generatenewaddress
|
|
||||||
followed by RPC generatetoaddress. Optional positional integer arguments are
|
|
||||||
number of blocks to generate (default: 1) and maximum iterations to try
|
|
||||||
(default: 1000000), equivalent to RPC generatetoaddress nblocks and maxtries
|
|
||||||
arguments.
|
|
||||||
|
|
||||||
- `-netinfo` Get network peer connection information from the remote server.
|
|
||||||
An optional integer argument from 0 to 4 can be passed for different peers
|
|
||||||
listings (default: 0). Pass `help` for detailed help documentation.
|
|
||||||
|
|
||||||
- `-coinstatsindex` Maintain coinstats index used by the gettxoutset RPC
|
|
||||||
(default: false)
|
|
||||||
|
|
||||||
- `-fastprune` Use smaller block files and lower minimum prune height for
|
|
||||||
testing purposes
|
|
||||||
|
|
||||||
- `-i2psam`=<ip:port> I2P SAM proxy to reach I2P peers and accept I2P
|
|
||||||
connections (default: none)
|
|
||||||
|
|
||||||
- `-i2pacceptincoming` If set and `-i2psam` is also set then incoming I2P
|
|
||||||
connections are accepted via the SAM proxy. If this is not set but `-i2psam`
|
|
||||||
is set then only outgoing connections will be made to the I2P network. Ignored
|
|
||||||
if `-i2psam` is not set. Listening for incoming I2P connections is done
|
|
||||||
through the SAM proxy, not by binding to a local address and port (default: 1)
|
|
||||||
|
|
||||||
- `-llmqmnhf` Override the default LLMQ type used for EHF. (default:
|
|
||||||
llmq_devnet, devnet-only)
|
|
||||||
|
|
||||||
- `-llmqtestinstantsend` Override the default LLMQ type used for InstantSend.
|
|
||||||
Used mainly to test Platform. (default: llmq_test_instantsend, regtest-only)
|
|
||||||
|
|
||||||
- `-llmqtestinstantsenddip0024` Override the default LLMQ type used for
|
|
||||||
InstantSendDIP0024. Used mainly to test Platform. (default:
|
|
||||||
llmq_test_dip0024, regtest-only)
|
|
||||||
|
|
||||||
- `-mnemonicbits` User defined mnemonic security for HD wallet in bits (BIP39).
|
|
||||||
Only has effect during wallet creation/first start (allowed values: 128, 160,
|
|
||||||
192, 224, 256; default: 128)
|
|
||||||
|
|
||||||
- `-chainlocknotify=<cmd>` Execute command when the best chainlock changes
|
|
||||||
`%s` in cmd is replaced by chainlocked block hash.
|
|
||||||
|
|
||||||
### Removed cmd-line options:
|
|
||||||
|
|
||||||
- `-dropmessagestest`
|
|
||||||
|
|
||||||
- `-upgradewallet` replaced by `upgradewallet` rpc
|
|
||||||
|
|
||||||
### Changes in existing cmd-line options:
|
|
||||||
|
|
||||||
- `-fallbackfee` was 0 (disabled) by default for the main chain, but 1000 by
|
|
||||||
default for the test chains. Now it is 0 by default for all chains. Testnet
|
|
||||||
and regtest users will have to add fallbackfee=1000 to their configuration if
|
|
||||||
they weren't setting it and they want it to keep working like before.
|
|
||||||
|
|
||||||
- The `dash-cli -getinfo` command now displays the wallet name and balance for
|
|
||||||
each of the loaded wallets when more than one is loaded (e.g. in multiwallet
|
|
||||||
mode) and a wallet is not specified with `-rpcwallet`.
|
|
||||||
|
|
||||||
- A `download` permission has been extracted from the `noban` permission. For
|
|
||||||
compatibility, `noban` implies the `download` permission, but this may change
|
|
||||||
in future releases. Refer to the help of the affected settings `-whitebind`
|
|
||||||
and `-whitelist` for more details.
|
|
||||||
|
|
||||||
- `-vbparams` accepts `useehf`.
|
|
||||||
|
|
||||||
- `-instantsendnotify=<cmd>` `%w` is replaced by wallet name.
|
|
||||||
|
|
||||||
Please check `Help -> Command-line options` in Qt wallet or `dashd --help` for
|
|
||||||
more information.
|
|
||||||
|
|
||||||
## JSON-RPC
|
|
||||||
|
|
||||||
All JSON-RPC methods accept a new [named parameter][json-rpc] called `args` that can
|
|
||||||
contain positional parameter values. This is a convenience to allow some
|
|
||||||
parameter values to be passed by name without having to name every value. The
|
|
||||||
python test framework and `dash-cli` tool both take advantage of this, so
|
|
||||||
for example:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
dash-cli -named createwallet wallet_name=mywallet load_on_startup=1
|
|
||||||
```
|
|
||||||
|
|
||||||
Can now be shortened to:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
dash-cli -named createwallet mywallet load_on_startup=1
|
|
||||||
```
|
|
||||||
|
|
||||||
## Switch from Gitian to Guix
|
|
||||||
|
|
||||||
Starting from v20.0.0 deterministic builds are going to be produced using the
|
|
||||||
Guix build system. See [contrib/guix/README.md][guix-readme]. The previously
|
|
||||||
used
|
|
||||||
Gitian build system is no longer supported and is not guaranteed to produce any
|
|
||||||
meaningful results.
|
|
||||||
|
|
||||||
## Backports from Bitcoin Core
|
|
||||||
|
|
||||||
This release introduces many updates from Bitcoin v0.20-v22.0 as well as
|
|
||||||
numerous updates from Bitcoin v23.0 and v25.0. Bitcoin changes that do not align
|
|
||||||
with Dash’s product needs, such as SegWit and RBF, are excluded from our
|
|
||||||
backporting. For additional detail on what’s included in Bitcoin, please refer
|
|
||||||
to their release notes.
|
|
||||||
|
|
||||||
# v20.0.0 Change log
|
|
||||||
|
|
||||||
See detailed [set of changes][set-of-changes].
|
See detailed [set of changes][set-of-changes].
|
||||||
|
|
||||||
@ -446,17 +53,9 @@ See detailed [set of changes][set-of-changes].
|
|||||||
|
|
||||||
Thanks to everyone who directly contributed to this release:
|
Thanks to everyone who directly contributed to this release:
|
||||||
|
|
||||||
- Ivan Shumkov (shumkov)
|
|
||||||
- Kittywhiskers Van Gogh (kittywhiskers)
|
|
||||||
- Konstantin Akimov (knst)
|
- Konstantin Akimov (knst)
|
||||||
- Munkybooty
|
|
||||||
- Odysseas Gabrielides (ogabrielides)
|
|
||||||
- PanderMusubi (Pander)
|
|
||||||
- PastaPastaPasta
|
- PastaPastaPasta
|
||||||
- strophy
|
|
||||||
- thephez
|
|
||||||
- UdjinM6
|
- UdjinM6
|
||||||
- Vijay Das Manikpuri (vijaydasmp)
|
|
||||||
|
|
||||||
As well as everyone that submitted issues, reviewed pull requests and helped
|
As well as everyone that submitted issues, reviewed pull requests and helped
|
||||||
debug the release candidates.
|
debug the release candidates.
|
||||||
@ -483,6 +82,7 @@ Dash Core tree 0.12.1.x was a fork of Bitcoin Core tree 0.12.
|
|||||||
|
|
||||||
These release are considered obsolete. Old release notes can be found here:
|
These release are considered obsolete. Old release notes can be found here:
|
||||||
|
|
||||||
|
- [v20.0.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-20.0.0.md) released November/15/2023
|
||||||
- [v19.3.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.3.0.md) released July/31/2023
|
- [v19.3.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.3.0.md) released July/31/2023
|
||||||
- [v19.2.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.2.0.md) released June/19/2023
|
- [v19.2.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.2.0.md) released June/19/2023
|
||||||
- [v19.1.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.1.0.md) released May/22/2023
|
- [v19.1.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.1.0.md) released May/22/2023
|
||||||
@ -525,10 +125,4 @@ These release are considered obsolete. Old release notes can be found here:
|
|||||||
- [v0.10.x](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.10.0.md) released Sep/25/2014
|
- [v0.10.x](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.10.0.md) released Sep/25/2014
|
||||||
- [v0.9.x](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.9.0.md) released Mar/13/2014
|
- [v0.9.x](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.9.0.md) released Mar/13/2014
|
||||||
|
|
||||||
[DIP-0023]: https://github.com/dashpay/dips/blob/master/dip-0023.md
|
[set-of-changes]: https://github.com/dashpay/dash/compare/v20.0.0...dashpay:v20.0.1
|
||||||
[DIP-0029]: https://github.com/dashpay/dips/blob/master/dip-0029.md
|
|
||||||
|
|
||||||
[i2p]: https://github.com/dashpay/dash/blob/v20.x/doc/i2p.md
|
|
||||||
[guix-readme]: https://github.com/dashpay/dash/blob/v20.x/contrib/guix/README.md
|
|
||||||
[json-rpc]: https://github.com/dashpay/dash/blob/v20.x/doc/JSON-RPC-interface.md#parameter-passing
|
|
||||||
[set-of-changes]: https://github.com/dashpay/dash/compare/v19.3.0...dashpay:v20.0.0
|
|
||||||
|
@ -148,7 +148,7 @@ Dash Core tree 0.12.1.x was a fork of Bitcoin Core tree 0.12.
|
|||||||
|
|
||||||
These release are considered obsolete. Old release notes can be found here:
|
These release are considered obsolete. Old release notes can be found here:
|
||||||
|
|
||||||
- [v19.1.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.0.0.md) released May/22/2023
|
- [v19.1.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.1.0.md) released May/22/2023
|
||||||
- [v19.0.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.0.0.md) released Apr/14/2023
|
- [v19.0.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.0.0.md) released Apr/14/2023
|
||||||
- [v18.2.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-18.2.2.md) released Mar/21/2023
|
- [v18.2.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-18.2.2.md) released Mar/21/2023
|
||||||
- [v18.2.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-18.2.1.md) released Jan/17/2023
|
- [v18.2.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-18.2.1.md) released Jan/17/2023
|
||||||
|
534
doc/release-notes/dash/release-notes-20.0.0.md
Normal file
534
doc/release-notes/dash/release-notes-20.0.0.md
Normal file
@ -0,0 +1,534 @@
|
|||||||
|
# Dash Core version v20.0.0
|
||||||
|
|
||||||
|
Release is now available from:
|
||||||
|
|
||||||
|
<https://www.dash.org/downloads/#wallets>
|
||||||
|
|
||||||
|
This is a new major version release, bringing new features, various bugfixes
|
||||||
|
and other improvements.
|
||||||
|
|
||||||
|
This release is mandatory for all nodes.
|
||||||
|
|
||||||
|
Please report bugs using the issue tracker at GitHub:
|
||||||
|
|
||||||
|
<https://github.com/dashpay/dash/issues>
|
||||||
|
|
||||||
|
|
||||||
|
# Upgrading and downgrading
|
||||||
|
|
||||||
|
## How to Upgrade
|
||||||
|
|
||||||
|
If you are running an older version, shut it down. Wait until it has completely
|
||||||
|
shut down (which might take a few minutes for older versions), then run the
|
||||||
|
installer (on Windows) or just copy over /Applications/Dash-Qt (on Mac) or
|
||||||
|
dashd/dash-qt (on Linux). If you upgrade after DIP0003 activation and you were
|
||||||
|
using version < 0.13 you will have to reindex (start with -reindex-chainstate
|
||||||
|
or -reindex) to make sure your wallet has all the new data synced. Upgrading
|
||||||
|
from version 0.13 should not require any additional actions.
|
||||||
|
|
||||||
|
## Downgrade warning
|
||||||
|
|
||||||
|
### Downgrade to a version < v19.2.0
|
||||||
|
|
||||||
|
Downgrading to a version older than v19.2.0 is not supported due to changes
|
||||||
|
in the evodb database. If you need to use an older version, you must either
|
||||||
|
reindex or re-sync the whole chain.
|
||||||
|
|
||||||
|
# Notable changes
|
||||||
|
|
||||||
|
## ChainLock-based random beacon
|
||||||
|
|
||||||
|
To improve long-living masternode quorum (LLMQ) selection, the `v20` hard fork
|
||||||
|
will enable a new random beacon using ChainLock signatures as described in
|
||||||
|
[DIP-0029][DIP-0029]. ChainLock signatures will be stored in the Coinbase
|
||||||
|
transaction to be used as a source of randomness during quorum member
|
||||||
|
calculations. This change increases the decentralization in the source of
|
||||||
|
randomness and prevents masternodes or miners from being able to manipulate the
|
||||||
|
LLMQ process.
|
||||||
|
|
||||||
|
## Treasury expansion
|
||||||
|
|
||||||
|
Currently, 10% of block rewards are set aside for the Dash DAO treasury which
|
||||||
|
funds development and other network efforts. Once the `v20` hard fork goes into
|
||||||
|
effect on mainnet, the treasury system allotment will increase to 20% of block
|
||||||
|
rewards to align with the proposal approved in September. Miner and masternode
|
||||||
|
rewards will change to 20% and 60% respectively upon activation of the change,
|
||||||
|
previous reallocation periods are ignored.
|
||||||
|
|
||||||
|
## Asset lock and unlock transactions
|
||||||
|
|
||||||
|
The asset lock process provides a mechanism for locking and unlocking Dash in a
|
||||||
|
credit pool. This credit pool mirrors the available credit supply in Dash
|
||||||
|
Platform. When a certain amount of Dash is locked, a proportional number of
|
||||||
|
credits are issued to the identity specified by the transaction issuer. The
|
||||||
|
identity then uses the credits to pay fees for operations done on Dash
|
||||||
|
Platform. Masternode identities receive the fees and can convert them back to
|
||||||
|
Dash by withdrawing them from Dash Platform.
|
||||||
|
|
||||||
|
Note: The asset lock feature is activated by the `v20` hard fork while the asset
|
||||||
|
unlock feature will be activated later by another hard fork.
|
||||||
|
|
||||||
|
## Coinbase Transaction Changes
|
||||||
|
|
||||||
|
Once v20 activates, Coinbase transactions in all mined blocks must be of
|
||||||
|
version 3.
|
||||||
|
|
||||||
|
Version 3 of the Coinbase transaction will include the following new fields:
|
||||||
|
- `bestCLSignature` (`BLSSignature`) will hold the best Chainlock signature
|
||||||
|
known at the moment
|
||||||
|
- `bestCLHeightDiff` (`uint32`) is equal to the diff in heights from the mined
|
||||||
|
block height
|
||||||
|
- `creditPoolBalance` (`int64`) is equal to all the duffs locked in all previous
|
||||||
|
blocks minus all the duffs unlocked in all previous blocks plus all the block
|
||||||
|
subsidy paid to evonodes on Platform.
|
||||||
|
|
||||||
|
Although miners are forced to include a version 3 Coinbase transaction, the
|
||||||
|
actual real-time best Chainlock signature isn't required as long as blocks
|
||||||
|
contain a `bestCLSignature` equal to (or newer than) the previous block.
|
||||||
|
|
||||||
|
Note: Until the first `bestCLSignature` is included in a Coinbase transaction
|
||||||
|
once v20 activates, null `bestCLSignature` and `bestCLHeightDiff` values are
|
||||||
|
perfectly valid.
|
||||||
|
|
||||||
|
## Testnet Breaking Changes
|
||||||
|
|
||||||
|
### Enhanced hard fork
|
||||||
|
|
||||||
|
Full implementation of the [DIP-0023][DIP-0023] enhanced hard fork mechanism has
|
||||||
|
been completed. This improved activation mechanism includes signaling from both
|
||||||
|
masternodes and miners while also ensuring sufficient upgrade time is available
|
||||||
|
to partners. This new system is enabled on testnet and devnets by the `v20`
|
||||||
|
activation and a newly introduced `SPORK_24_TEST_EHF` spork.
|
||||||
|
|
||||||
|
### Fixed subsidy base after `v20`
|
||||||
|
|
||||||
|
Starting from `v20` activation, the base block subsidy on testnet and devnets
|
||||||
|
will no longer be calculated based on previous block difficulty. This change
|
||||||
|
mimics mainnet behaviour. It also simplifies calculations for Platform which
|
||||||
|
would not need to constantly get block's difficulty in order to calculate
|
||||||
|
platform reward.
|
||||||
|
|
||||||
|
## Sentinel deprecation
|
||||||
|
|
||||||
|
Sentinel functionality has been integrated directly into v20.0.0, so it will no
|
||||||
|
longer be necessary for masternodes to run the standalone Sentinel application.
|
||||||
|
During the superblock maturity window (1662 blocks), payee masternodes will try
|
||||||
|
to create, sign and submit a superblock candidate. Several RPC commands have
|
||||||
|
been updated to prevent conflicts between v20.0.0 and existing Sentinel
|
||||||
|
installs. It is recommended to remove or disable Sentinel after updating
|
||||||
|
masternodes to v20.0.0.
|
||||||
|
|
||||||
|
## P2P and network changes
|
||||||
|
|
||||||
|
### Removal of reject network messages from Dash Core (BIP61)
|
||||||
|
|
||||||
|
This feature has been disabled by default since Dash Core version 19.0.0.
|
||||||
|
Nodes on the network can not generally be trusted to send valid ("reject")
|
||||||
|
messages, so this should only ever be used when connected to a trusted node.
|
||||||
|
|
||||||
|
Since Dash Core version 20.0.0 there are extra changes:
|
||||||
|
|
||||||
|
The removal of BIP61 `REJECT` message support also has the following minor RPC
|
||||||
|
and logging implications:
|
||||||
|
|
||||||
|
- `testmempoolaccept` and `sendrawtransaction` no longer return the P2P `REJECT`
|
||||||
|
code when a transaction is not accepted to the mempool. They still return the
|
||||||
|
verbal reject reason.
|
||||||
|
|
||||||
|
- Log messages that previously reported the `REJECT` code when a transaction was
|
||||||
|
not accepted to the mempool now no longer report the `REJECT` code. The reason
|
||||||
|
for rejection is still reported.
|
||||||
|
|
||||||
|
### Transaction rebroadcast
|
||||||
|
|
||||||
|
The mempool now tracks whether transactions submitted via the wallet or RPCs
|
||||||
|
have been successfully broadcast. Every 10-15 minutes, the node will try to
|
||||||
|
announce unbroadcast transactions until a peer requests it via a `getdata`
|
||||||
|
message or the transaction is removed from the mempool for other reasons.
|
||||||
|
The node will not track the broadcast status of transactions submitted to the
|
||||||
|
node using P2P relay. This version reduces the initial broadcast guarantees
|
||||||
|
for wallet transactions submitted via P2P to a node running the wallet.
|
||||||
|
|
||||||
|
To improve wallet privacy, the frequency of wallet rebroadcast attempts is
|
||||||
|
reduced from approximately once every 15 minutes to once every 1-3 hours.
|
||||||
|
To maintain a similar level of guarantee for initial broadcast of wallet
|
||||||
|
transactions, the mempool tracks these transactions as a part of the newly
|
||||||
|
introduced unbroadcast set.
|
||||||
|
|
||||||
|
### `MNLISTDIFF` P2P message
|
||||||
|
|
||||||
|
Starting with protocol version `70230`, the following fields are added to the
|
||||||
|
`MNLISTDIFF` message after `newQuorums`.
|
||||||
|
|
||||||
|
| Field | Type | Size | Description |
|
||||||
|
|-|-|-|-|
|
||||||
|
| quorumsCLSigsCount | compactSize uint | 1-9 | Number of quorumsCLSigs elements |
|
||||||
|
| quorumsCLSigs | quorumsCLSigsObject[] | variable | ChainLock signature used to calculate members per quorum indexes (in newQuorums) |
|
||||||
|
|
||||||
|
The content of `quorumsCLSigsObject`:
|
||||||
|
|
||||||
|
| Field | Type | Size | Description |
|
||||||
|
|-|-|-|-|
|
||||||
|
| signature | BLSSig | 96 | ChainLock signature |
|
||||||
|
| indexSetCount | compactSize uint | 1-9 | Number of quorum indexes using the same `signature` for their member calculation |
|
||||||
|
| indexSet | uint16_t[] | variable | Quorum indexes corresponding in `newQuorums` using `signature` for their member calculation |
|
||||||
|
|
||||||
|
Note: The `quorumsCLSigs` field in both RPC and P2P will only be populated after
|
||||||
|
the v20 activation.
|
||||||
|
|
||||||
|
### Other
|
||||||
|
|
||||||
|
- It is possible to run Dash Core as an I2P service and connect to such
|
||||||
|
services. Please read [docs][i2p] for more information.
|
||||||
|
- Removed support for Tor v2, `LEGACYTXLOCKREQUEST` (`"ix"`) message and
|
||||||
|
`NODE_GETUTXO` (bit 1) node service bit.
|
||||||
|
|
||||||
|
## GUI
|
||||||
|
|
||||||
|
Add more granular CoinJoin options to let users control the number of CoinJoin
|
||||||
|
sessions and also the min/max number of denominations for wallets to create
|
||||||
|
while mixing.
|
||||||
|
|
||||||
|
## Remote Procedure Call (RPC) Changes
|
||||||
|
|
||||||
|
### The new RPCs are:
|
||||||
|
|
||||||
|
- `addpeeraddress` Add the address of a potential peer to the address manager.
|
||||||
|
This RPC is for testing only.
|
||||||
|
|
||||||
|
- The `getindexinfo` RPC returns the actively running indices of the node,
|
||||||
|
including their current sync status and height. It also accepts an
|
||||||
|
`index_name` to specify returning only the status of that index.
|
||||||
|
|
||||||
|
- `protx listdiff` RPC returns a full deterministic masternode list diff
|
||||||
|
between two heights.
|
||||||
|
|
||||||
|
### The removed RPCs are:
|
||||||
|
|
||||||
|
- `gobject vote-conf` is no longer available.
|
||||||
|
|
||||||
|
### Changes in existing RPCs introduced through bitcoin backports:
|
||||||
|
|
||||||
|
- The `fundrawtransaction`, `sendmany`, `sendtoaddress`, and
|
||||||
|
`walletcreatefundedpsbt` RPC commands have been updated to include two new
|
||||||
|
fee estimation methods, `DASH/kB` and `duff/B`. The target is the fee
|
||||||
|
expressed explicitly in the given form. In addition, the `estimate_mode`
|
||||||
|
parameter is now case insensitive for all of the above RPC commands.
|
||||||
|
|
||||||
|
- Soft fork reporting in the `getblockchaininfo` return object has been
|
||||||
|
updated. For full details, see the RPC help text. In summary:
|
||||||
|
- The `bip9_softforks` sub-object is no longer returned
|
||||||
|
- The `softforks` sub-object now returns an object keyed by soft fork name,
|
||||||
|
rather than an array
|
||||||
|
- Each softfork object in the `softforks` object contains a `type` value
|
||||||
|
which is either `buried` (for soft fork deployments where the activation
|
||||||
|
height is hard-coded into the client implementation), or `bip9`(for soft
|
||||||
|
fork deployments where activation is controlled by BIP 9 signaling).
|
||||||
|
|
||||||
|
- `getblocktemplate` no longer returns a `rules` array containing `CSV`
|
||||||
|
(the BIP 9 deployments that are currently in active state).
|
||||||
|
|
||||||
|
- The `gettransaction` RPC now accepts a third (boolean) argument, `verbose`.
|
||||||
|
If set to `true`, a new `decoded` field will be added to the response
|
||||||
|
containing the decoded transaction. This field is equivalent to RPC
|
||||||
|
`decoderawtransaction`, or RPC `getrawtransaction` when `verbose` is passed.
|
||||||
|
|
||||||
|
- `testmempoolaccept` and `sendrawtransaction` no longer return the P2P
|
||||||
|
`REJECT` code when a transaction is not accepted to the mempool. See the
|
||||||
|
Section [_Removal of reject network messages from Dash Core (BIP61)_](#removal-of-reject-network-messages-from-dash-core-bip61) above for
|
||||||
|
details on the removal of BIP61 `REJECT` message support.
|
||||||
|
|
||||||
|
- A new descriptor type, `sortedmulti(...)`, has been added to support multisig
|
||||||
|
scripts where the public keys are sorted lexicographically in the resulting
|
||||||
|
script.
|
||||||
|
|
||||||
|
- The RPC `gettransaction`, `listtransactions` and `listsinceblock` responses
|
||||||
|
now also includes the height of the block that contains the wallet
|
||||||
|
transaction, if any.
|
||||||
|
|
||||||
|
- RPC `getaddressinfo` changes:
|
||||||
|
- the `label` field has been deprecated in favor of the `labels` field and
|
||||||
|
will be removed in 0.21. It can be re-enabled in the interim by launching
|
||||||
|
with `-deprecatedrpc=label`.
|
||||||
|
- the `labels` behavior of returning an array of JSON objects containing name
|
||||||
|
and purpose key/value pairs has been deprecated in favor of an array of
|
||||||
|
label names and will be removed in 0.21. The previous behavior can be
|
||||||
|
re-enabled in the interim by launching with `-deprecatedrpc=labelspurpose`.
|
||||||
|
|
||||||
|
- Error codes have been updated to be more accurate for the following error
|
||||||
|
cases:
|
||||||
|
- `signmessage` now returns `RPC_INVALID_ADDRESS_OR_KEY (-5)` if the
|
||||||
|
passed address is invalid. Previously returned `RPC_TYPE_ERROR (-3)`.
|
||||||
|
- `verifymessage` now returns `RPC_INVALID_ADDRESS_OR_KEY (-5)` if the
|
||||||
|
passed address is invalid. Previously returned `RPC_TYPE_ERROR (-3)`.
|
||||||
|
- `verifymessage` now returns `RPC_TYPE_ERROR (-3)` if the passed signature
|
||||||
|
is malformed. Previously returned `RPC_INVALID_ADDRESS_OR_KEY (-5)`.
|
||||||
|
|
||||||
|
- The `settxfee` RPC will fail if the fee is set higher than the `-maxtxfee`
|
||||||
|
command line setting. The wallet will already fail to create transactions
|
||||||
|
with fees higher than `-maxtxfee`.
|
||||||
|
|
||||||
|
- `getmempoolinfo` now returns an additional `unbroadcastcount` field. The
|
||||||
|
mempool tracks locally submitted transactions until their initial broadcast
|
||||||
|
is acknowledged by a peer. This field returns the count of transactions
|
||||||
|
waiting for acknowledgement.
|
||||||
|
|
||||||
|
- Mempool RPCs such as `getmempoolentry` and `getrawmempool` with
|
||||||
|
`verbose=true` now return an additional `unbroadcast` field. This indicates
|
||||||
|
whether initial broadcast of the transaction has been acknowledged by a
|
||||||
|
peer. `getmempoolancestors` and `getmempooldescendants` are also updated.
|
||||||
|
|
||||||
|
- `logging` and `debug` rpc support new logging categories `validations` and
|
||||||
|
`i2p`
|
||||||
|
|
||||||
|
- `gettxoutsetinfo` RPC has 2 new parameters and lots of new fields in
|
||||||
|
results. Please check `help gettxoutsetinfo` for more information.
|
||||||
|
|
||||||
|
- `gettxchainlocks` Returns the block height each transaction was mined at and
|
||||||
|
whether it is chainlocked or not.
|
||||||
|
|
||||||
|
### Dash-specific changes in existing RPCs:
|
||||||
|
|
||||||
|
- `getblockchaininfo` RPC returns the field `activation_height` for each
|
||||||
|
softfork in `locked_in` status indicating the expected activation height.
|
||||||
|
|
||||||
|
- `getblockchaininfo` RPC returns the field `ehf` and `ehf_height` for each
|
||||||
|
softfork. `ehf_height` indicates the minimum height when miner's signals can
|
||||||
|
be accepted for the deployment with `ehf` set to `true`.
|
||||||
|
|
||||||
|
- `getgovernanceinfo` RPC returns two new fields:
|
||||||
|
- `governancebudget` (the governance budget for the next superblock)
|
||||||
|
- `fundingthreshold` (the number of absolute yes votes required for a proposal
|
||||||
|
to be passing)
|
||||||
|
|
||||||
|
- `gobject submit` will no longer accept submission of triggers.
|
||||||
|
|
||||||
|
- `protx diff` RPC returns a new field `quorumsCLSigs`. This field is a list
|
||||||
|
containing: a ChainLock signature and the list of corresponding quorum
|
||||||
|
indexes in `newQuorums`.
|
||||||
|
|
||||||
|
- `protx list`: New type `evo` filters only HPMNs.
|
||||||
|
|
||||||
|
- `*_hpmn` RPCs were renamed:
|
||||||
|
- `protx register_hpmn` to `protx register_evo`
|
||||||
|
- `protx register_fund_hpmn` to `protx register_fund_evo`
|
||||||
|
- `protx register_prepare_hpmn` to `protx register_prepare_evo`
|
||||||
|
- `protx update_service_hpmn` to `protx update_service_evo`
|
||||||
|
|
||||||
|
Please note that `*_hpmn` RPCs are not fully removed; instead they are
|
||||||
|
deprecated so you can still enable them by using the `-deprecatedrpc=hpmn`
|
||||||
|
option.
|
||||||
|
|
||||||
|
- `masternode count` returns the total number of evonodes under field `evo`
|
||||||
|
instead of `hpmn`.
|
||||||
|
|
||||||
|
- `masternodelist`: New mode `evo` filters only HPMNs.
|
||||||
|
|
||||||
|
- Description type string `HighPerformance` is renamed to `Evo`: affects most
|
||||||
|
RPCs return MNs details.
|
||||||
|
|
||||||
|
Please check `help <command>` for more detailed information on specific RPCs.
|
||||||
|
|
||||||
|
## Command-line options
|
||||||
|
|
||||||
|
### New cmd-line options:
|
||||||
|
|
||||||
|
- `-generate` Generate blocks immediately, equivalent to RPC generatenewaddress
|
||||||
|
followed by RPC generatetoaddress. Optional positional integer arguments are
|
||||||
|
number of blocks to generate (default: 1) and maximum iterations to try
|
||||||
|
(default: 1000000), equivalent to RPC generatetoaddress nblocks and maxtries
|
||||||
|
arguments.
|
||||||
|
|
||||||
|
- `-netinfo` Get network peer connection information from the remote server.
|
||||||
|
An optional integer argument from 0 to 4 can be passed for different peers
|
||||||
|
listings (default: 0). Pass `help` for detailed help documentation.
|
||||||
|
|
||||||
|
- `-coinstatsindex` Maintain coinstats index used by the gettxoutset RPC
|
||||||
|
(default: false)
|
||||||
|
|
||||||
|
- `-fastprune` Use smaller block files and lower minimum prune height for
|
||||||
|
testing purposes
|
||||||
|
|
||||||
|
- `-i2psam`=<ip:port> I2P SAM proxy to reach I2P peers and accept I2P
|
||||||
|
connections (default: none)
|
||||||
|
|
||||||
|
- `-i2pacceptincoming` If set and `-i2psam` is also set then incoming I2P
|
||||||
|
connections are accepted via the SAM proxy. If this is not set but `-i2psam`
|
||||||
|
is set then only outgoing connections will be made to the I2P network. Ignored
|
||||||
|
if `-i2psam` is not set. Listening for incoming I2P connections is done
|
||||||
|
through the SAM proxy, not by binding to a local address and port (default: 1)
|
||||||
|
|
||||||
|
- `-llmqmnhf` Override the default LLMQ type used for EHF. (default:
|
||||||
|
llmq_devnet, devnet-only)
|
||||||
|
|
||||||
|
- `-llmqtestinstantsend` Override the default LLMQ type used for InstantSend.
|
||||||
|
Used mainly to test Platform. (default: llmq_test_instantsend, regtest-only)
|
||||||
|
|
||||||
|
- `-llmqtestinstantsenddip0024` Override the default LLMQ type used for
|
||||||
|
InstantSendDIP0024. Used mainly to test Platform. (default:
|
||||||
|
llmq_test_dip0024, regtest-only)
|
||||||
|
|
||||||
|
- `-mnemonicbits` User defined mnemonic security for HD wallet in bits (BIP39).
|
||||||
|
Only has effect during wallet creation/first start (allowed values: 128, 160,
|
||||||
|
192, 224, 256; default: 128)
|
||||||
|
|
||||||
|
- `-chainlocknotify=<cmd>` Execute command when the best chainlock changes
|
||||||
|
`%s` in cmd is replaced by chainlocked block hash.
|
||||||
|
|
||||||
|
### Removed cmd-line options:
|
||||||
|
|
||||||
|
- `-dropmessagestest`
|
||||||
|
|
||||||
|
- `-upgradewallet` replaced by `upgradewallet` rpc
|
||||||
|
|
||||||
|
### Changes in existing cmd-line options:
|
||||||
|
|
||||||
|
- `-fallbackfee` was 0 (disabled) by default for the main chain, but 1000 by
|
||||||
|
default for the test chains. Now it is 0 by default for all chains. Testnet
|
||||||
|
and regtest users will have to add fallbackfee=1000 to their configuration if
|
||||||
|
they weren't setting it and they want it to keep working like before.
|
||||||
|
|
||||||
|
- The `dash-cli -getinfo` command now displays the wallet name and balance for
|
||||||
|
each of the loaded wallets when more than one is loaded (e.g. in multiwallet
|
||||||
|
mode) and a wallet is not specified with `-rpcwallet`.
|
||||||
|
|
||||||
|
- A `download` permission has been extracted from the `noban` permission. For
|
||||||
|
compatibility, `noban` implies the `download` permission, but this may change
|
||||||
|
in future releases. Refer to the help of the affected settings `-whitebind`
|
||||||
|
and `-whitelist` for more details.
|
||||||
|
|
||||||
|
- `-vbparams` accepts `useehf`.
|
||||||
|
|
||||||
|
- `-instantsendnotify=<cmd>` `%w` is replaced by wallet name.
|
||||||
|
|
||||||
|
Please check `Help -> Command-line options` in Qt wallet or `dashd --help` for
|
||||||
|
more information.
|
||||||
|
|
||||||
|
## JSON-RPC
|
||||||
|
|
||||||
|
All JSON-RPC methods accept a new [named parameter][json-rpc] called `args` that can
|
||||||
|
contain positional parameter values. This is a convenience to allow some
|
||||||
|
parameter values to be passed by name without having to name every value. The
|
||||||
|
python test framework and `dash-cli` tool both take advantage of this, so
|
||||||
|
for example:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dash-cli -named createwallet wallet_name=mywallet load_on_startup=1
|
||||||
|
```
|
||||||
|
|
||||||
|
Can now be shortened to:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dash-cli -named createwallet mywallet load_on_startup=1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Switch from Gitian to Guix
|
||||||
|
|
||||||
|
Starting from v20.0.0 deterministic builds are going to be produced using the
|
||||||
|
Guix build system. See [contrib/guix/README.md][guix-readme]. The previously
|
||||||
|
used
|
||||||
|
Gitian build system is no longer supported and is not guaranteed to produce any
|
||||||
|
meaningful results.
|
||||||
|
|
||||||
|
## Backports from Bitcoin Core
|
||||||
|
|
||||||
|
This release introduces many updates from Bitcoin v0.20-v22.0 as well as
|
||||||
|
numerous updates from Bitcoin v23.0-v25.0. Bitcoin changes that do not align
|
||||||
|
with Dash’s product needs, such as SegWit and RBF, are excluded from our
|
||||||
|
backporting. For additional detail on what’s included in Bitcoin, please refer
|
||||||
|
to their release notes.
|
||||||
|
|
||||||
|
# v20.0.0 Change log
|
||||||
|
|
||||||
|
See detailed [set of changes][set-of-changes].
|
||||||
|
|
||||||
|
# Credits
|
||||||
|
|
||||||
|
Thanks to everyone who directly contributed to this release:
|
||||||
|
|
||||||
|
- Ivan Shumkov (shumkov)
|
||||||
|
- Kittywhiskers Van Gogh (kittywhiskers)
|
||||||
|
- Konstantin Akimov (knst)
|
||||||
|
- Munkybooty
|
||||||
|
- Odysseas Gabrielides (ogabrielides)
|
||||||
|
- PanderMusubi (Pander)
|
||||||
|
- PastaPastaPasta
|
||||||
|
- strophy
|
||||||
|
- thephez
|
||||||
|
- UdjinM6
|
||||||
|
- Vijay Das Manikpuri (vijaydasmp)
|
||||||
|
|
||||||
|
As well as everyone that submitted issues, reviewed pull requests and helped
|
||||||
|
debug the release candidates.
|
||||||
|
|
||||||
|
# Older releases
|
||||||
|
|
||||||
|
Dash was previously known as Darkcoin.
|
||||||
|
|
||||||
|
Darkcoin tree 0.8.x was a fork of Litecoin tree 0.8, original name was XCoin
|
||||||
|
which was first released on Jan/18/2014.
|
||||||
|
|
||||||
|
Darkcoin tree 0.9.x was the open source implementation of masternodes based on
|
||||||
|
the 0.8.x tree and was first released on Mar/13/2014.
|
||||||
|
|
||||||
|
Darkcoin tree 0.10.x used to be the closed source implementation of Darksend
|
||||||
|
which was released open source on Sep/25/2014.
|
||||||
|
|
||||||
|
Dash Core tree 0.11.x was a fork of Bitcoin Core tree 0.9,
|
||||||
|
Darkcoin was rebranded to Dash.
|
||||||
|
|
||||||
|
Dash Core tree 0.12.0.x was a fork of Bitcoin Core tree 0.10.
|
||||||
|
|
||||||
|
Dash Core tree 0.12.1.x was a fork of Bitcoin Core tree 0.12.
|
||||||
|
|
||||||
|
These release are considered obsolete. Old release notes can be found here:
|
||||||
|
|
||||||
|
- [v19.3.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.3.0.md) released July/31/2023
|
||||||
|
- [v19.2.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.2.0.md) released June/19/2023
|
||||||
|
- [v19.1.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.1.0.md) released May/22/2023
|
||||||
|
- [v19.0.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-19.0.0.md) released Apr/14/2023
|
||||||
|
- [v18.2.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-18.2.2.md) released Mar/21/2023
|
||||||
|
- [v18.2.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-18.2.1.md) released Jan/17/2023
|
||||||
|
- [v18.2.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-18.2.0.md) released Jan/01/2023
|
||||||
|
- [v18.1.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-18.1.1.md) released January/08/2023
|
||||||
|
- [v18.1.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-18.1.0.md) released October/09/2022
|
||||||
|
- [v18.0.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-18.0.2.md) released October/09/2022
|
||||||
|
- [v18.0.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-18.0.1.md) released August/17/2022
|
||||||
|
- [v0.17.0.3](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.17.0.3.md) released June/07/2021
|
||||||
|
- [v0.17.0.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.17.0.2.md) released May/19/2021
|
||||||
|
- [v0.16.1.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.16.1.1.md) released November/17/2020
|
||||||
|
- [v0.16.1.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.16.1.0.md) released November/14/2020
|
||||||
|
- [v0.16.0.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.16.0.1.md) released September/30/2020
|
||||||
|
- [v0.15.0.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.15.0.0.md) released Febrary/18/2020
|
||||||
|
- [v0.14.0.5](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.14.0.5.md) released December/08/2019
|
||||||
|
- [v0.14.0.4](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.14.0.4.md) released November/22/2019
|
||||||
|
- [v0.14.0.3](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.14.0.3.md) released August/15/2019
|
||||||
|
- [v0.14.0.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.14.0.2.md) released July/4/2019
|
||||||
|
- [v0.14.0.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.14.0.1.md) released May/31/2019
|
||||||
|
- [v0.14.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.14.0.md) released May/22/2019
|
||||||
|
- [v0.13.3](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.13.3.md) released Apr/04/2019
|
||||||
|
- [v0.13.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.13.2.md) released Mar/15/2019
|
||||||
|
- [v0.13.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.13.1.md) released Feb/9/2019
|
||||||
|
- [v0.13.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.13.0.md) released Jan/14/2019
|
||||||
|
- [v0.12.3.4](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.3.4.md) released Dec/14/2018
|
||||||
|
- [v0.12.3.3](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.3.3.md) released Sep/19/2018
|
||||||
|
- [v0.12.3.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.3.2.md) released Jul/09/2018
|
||||||
|
- [v0.12.3.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.3.1.md) released Jul/03/2018
|
||||||
|
- [v0.12.2.3](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.2.3.md) released Jan/12/2018
|
||||||
|
- [v0.12.2.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.2.2.md) released Dec/17/2017
|
||||||
|
- [v0.12.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.2.md) released Nov/08/2017
|
||||||
|
- [v0.12.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.1.md) released Feb/06/2017
|
||||||
|
- [v0.12.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.12.0.md) released Aug/15/2015
|
||||||
|
- [v0.11.2](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.11.2.md) released Mar/04/2015
|
||||||
|
- [v0.11.1](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.11.1.md) released Feb/10/2015
|
||||||
|
- [v0.11.0](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.11.0.md) released Jan/15/2015
|
||||||
|
- [v0.10.x](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.10.0.md) released Sep/25/2014
|
||||||
|
- [v0.9.x](https://github.com/dashpay/dash/blob/master/doc/release-notes/dash/release-notes-0.9.0.md) released Mar/13/2014
|
||||||
|
|
||||||
|
[DIP-0023]: https://github.com/dashpay/dips/blob/master/dip-0023.md
|
||||||
|
[DIP-0029]: https://github.com/dashpay/dips/blob/master/dip-0029.md
|
||||||
|
|
||||||
|
[i2p]: https://github.com/dashpay/dash/blob/v20.x/doc/i2p.md
|
||||||
|
[guix-readme]: https://github.com/dashpay/dash/blob/v20.x/contrib/guix/README.md
|
||||||
|
[json-rpc]: https://github.com/dashpay/dash/blob/v20.x/doc/JSON-RPC-interface.md#parameter-passing
|
||||||
|
[set-of-changes]: https://github.com/dashpay/dash/compare/v19.3.0...dashpay:v20.0.0
|
@ -118,7 +118,7 @@ void CDSNotificationInterface::BlockDisconnected(const std::shared_ptr<const CBl
|
|||||||
CCoinJoin::BlockDisconnected(pblock, pindexDisconnected);
|
CCoinJoin::BlockDisconnected(pblock, pindexDisconnected);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDSNotificationInterface::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff, CConnman& connman)
|
void CDSNotificationInterface::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff)
|
||||||
{
|
{
|
||||||
CMNAuth::NotifyMasternodeListChanged(undo, oldMNList, diff, connman);
|
CMNAuth::NotifyMasternodeListChanged(undo, oldMNList, diff, connman);
|
||||||
govman.UpdateCachesAndClean();
|
govman.UpdateCachesAndClean();
|
||||||
|
@ -36,7 +36,7 @@ protected:
|
|||||||
void TransactionRemovedFromMempool(const CTransactionRef& ptx, MemPoolRemovalReason reason) override;
|
void TransactionRemovedFromMempool(const CTransactionRef& ptx, MemPoolRemovalReason reason) override;
|
||||||
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex) override;
|
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex) override;
|
||||||
void BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexDisconnected) override;
|
void BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexDisconnected) override;
|
||||||
void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff, CConnman& connman) override;
|
void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff) override;
|
||||||
void NotifyChainLock(const CBlockIndex* pindex, const std::shared_ptr<const llmq::CChainLockSig>& clsig) override;
|
void NotifyChainLock(const CBlockIndex* pindex, const std::shared_ptr<const llmq::CChainLockSig>& clsig) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -594,7 +594,7 @@ void CDeterministicMNList::RemoveMN(const uint256& proTxHash)
|
|||||||
mnInternalIdMap = mnInternalIdMap.erase(dmn->GetInternalId());
|
mnInternalIdMap = mnInternalIdMap.erase(dmn->GetInternalId());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, BlockValidationState& state, const CCoinsViewCache& view, bool fJustCheck)
|
bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, BlockValidationState& state, const CCoinsViewCache& view, bool fJustCheck, std::optional<MNListUpdates>& updatesRet)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
|
|
||||||
@ -641,10 +641,8 @@ bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<co
|
|||||||
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "failed-dmn-block");
|
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "failed-dmn-block");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't hold cs while calling signals
|
|
||||||
if (diff.HasChanges()) {
|
if (diff.HasChanges()) {
|
||||||
GetMainSignals().NotifyMasternodeListChanged(false, oldList, diff, connman);
|
updatesRet = {newList, oldList, diff};
|
||||||
uiInterface.NotifyMasternodeListChanged(newList, pindex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nHeight == consensusParams.DIP0003EnforcementHeight) {
|
if (nHeight == consensusParams.DIP0003EnforcementHeight) {
|
||||||
@ -660,7 +658,7 @@ bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<co
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CDeterministicMNManager::UndoBlock(gsl::not_null<const CBlockIndex*> pindex)
|
bool CDeterministicMNManager::UndoBlock(gsl::not_null<const CBlockIndex*> pindex, std::optional<MNListUpdates>& updatesRet)
|
||||||
{
|
{
|
||||||
int nHeight = pindex->nHeight;
|
int nHeight = pindex->nHeight;
|
||||||
uint256 blockHash = pindex->GetBlockHash();
|
uint256 blockHash = pindex->GetBlockHash();
|
||||||
@ -684,8 +682,7 @@ bool CDeterministicMNManager::UndoBlock(gsl::not_null<const CBlockIndex*> pindex
|
|||||||
|
|
||||||
if (diff.HasChanges()) {
|
if (diff.HasChanges()) {
|
||||||
auto inversedDiff = curList.BuildDiff(prevList);
|
auto inversedDiff = curList.BuildDiff(prevList);
|
||||||
GetMainSignals().NotifyMasternodeListChanged(true, curList, inversedDiff, connman);
|
updatesRet = {curList, prevList, inversedDiff};
|
||||||
uiInterface.NotifyMasternodeListChanged(prevList, pindex->pprev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& consensusParams = Params().GetConsensus();
|
const auto& consensusParams = Params().GetConsensus();
|
||||||
|
@ -565,6 +565,13 @@ constexpr int llmq_max_blocks() {
|
|||||||
return max_blocks;
|
return max_blocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct MNListUpdates
|
||||||
|
{
|
||||||
|
CDeterministicMNList old_list;
|
||||||
|
CDeterministicMNList new_list;
|
||||||
|
CDeterministicMNListDiff diff;
|
||||||
|
};
|
||||||
|
|
||||||
class CDeterministicMNManager
|
class CDeterministicMNManager
|
||||||
{
|
{
|
||||||
static constexpr int DISK_SNAPSHOT_PERIOD = 576; // once per day
|
static constexpr int DISK_SNAPSHOT_PERIOD = 576; // once per day
|
||||||
@ -596,8 +603,8 @@ public:
|
|||||||
~CDeterministicMNManager() = default;
|
~CDeterministicMNManager() = default;
|
||||||
|
|
||||||
bool ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, BlockValidationState& state,
|
bool ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, BlockValidationState& state,
|
||||||
const CCoinsViewCache& view, bool fJustCheck) EXCLUSIVE_LOCKS_REQUIRED(cs_main) LOCKS_EXCLUDED(cs);
|
const CCoinsViewCache& view, bool fJustCheck, std::optional<MNListUpdates>& updatesRet) EXCLUSIVE_LOCKS_REQUIRED(cs_main) LOCKS_EXCLUDED(cs);
|
||||||
bool UndoBlock(gsl::not_null<const CBlockIndex*> pindex) LOCKS_EXCLUDED(cs);
|
bool UndoBlock(gsl::not_null<const CBlockIndex*> pindex, std::optional<MNListUpdates>& updatesRet) LOCKS_EXCLUDED(cs);
|
||||||
|
|
||||||
void UpdatedBlockTip(gsl::not_null<const CBlockIndex*> pindex) LOCKS_EXCLUDED(cs);
|
void UpdatedBlockTip(gsl::not_null<const CBlockIndex*> pindex) LOCKS_EXCLUDED(cs);
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ static bool UndoSpecialTx(const CTransaction& tx, const CBlockIndex* pindex)
|
|||||||
bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
||||||
llmq::CQuorumBlockProcessor& quorum_block_processor, const llmq::CChainLocksHandler& chainlock_handler,
|
llmq::CQuorumBlockProcessor& quorum_block_processor, const llmq::CChainLocksHandler& chainlock_handler,
|
||||||
const Consensus::Params& consensusParams, const CCoinsViewCache& view, bool fJustCheck, bool fCheckCbTxMerleRoots,
|
const Consensus::Params& consensusParams, const CCoinsViewCache& view, bool fJustCheck, bool fCheckCbTxMerleRoots,
|
||||||
BlockValidationState& state)
|
BlockValidationState& state, std::optional<MNListUpdates>& updatesRet)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
|
|
||||||
@ -181,7 +181,7 @@ bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CM
|
|||||||
nTimeQuorum += nTime3 - nTime2;
|
nTimeQuorum += nTime3 - nTime2;
|
||||||
LogPrint(BCLog::BENCHMARK, " - quorumBlockProcessor: %.2fms [%.2fs]\n", 0.001 * (nTime3 - nTime2), nTimeQuorum * 0.000001);
|
LogPrint(BCLog::BENCHMARK, " - quorumBlockProcessor: %.2fms [%.2fs]\n", 0.001 * (nTime3 - nTime2), nTimeQuorum * 0.000001);
|
||||||
|
|
||||||
if (!deterministicMNManager->ProcessBlock(block, pindex, state, view, fJustCheck)) {
|
if (!deterministicMNManager->ProcessBlock(block, pindex, state, view, fJustCheck, updatesRet)) {
|
||||||
// pass the state returned by the function above
|
// pass the state returned by the function above
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -231,7 +231,7 @@ bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CM
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager, llmq::CQuorumBlockProcessor& quorum_block_processor)
|
bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager, llmq::CQuorumBlockProcessor& quorum_block_processor, std::optional<MNListUpdates>& updatesRet)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
|
|
||||||
@ -256,7 +256,7 @@ bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHF
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!deterministicMNManager->UndoBlock(pindex)) {
|
if (!deterministicMNManager->UndoBlock(pindex, updatesRet)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,12 +9,15 @@
|
|||||||
#include <sync.h>
|
#include <sync.h>
|
||||||
#include <threadsafety.h>
|
#include <threadsafety.h>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
class BlockValidationState;
|
class BlockValidationState;
|
||||||
class CBlock;
|
class CBlock;
|
||||||
class CBlockIndex;
|
class CBlockIndex;
|
||||||
class CCoinsViewCache;
|
class CCoinsViewCache;
|
||||||
class CMNHFManager;
|
class CMNHFManager;
|
||||||
class TxValidationState;
|
class TxValidationState;
|
||||||
|
struct MNListUpdates;
|
||||||
namespace llmq {
|
namespace llmq {
|
||||||
class CQuorumBlockProcessor;
|
class CQuorumBlockProcessor;
|
||||||
class CChainLocksHandler;
|
class CChainLocksHandler;
|
||||||
@ -30,9 +33,9 @@ bool CheckSpecialTx(const CTransaction& tx, const CBlockIndex* pindexPrev, const
|
|||||||
bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
||||||
llmq::CQuorumBlockProcessor& quorum_block_processor, const llmq::CChainLocksHandler& chainlock_handler,
|
llmq::CQuorumBlockProcessor& quorum_block_processor, const llmq::CChainLocksHandler& chainlock_handler,
|
||||||
const Consensus::Params& consensusParams, const CCoinsViewCache& view, bool fJustCheck, bool fCheckCbTxMerleRoots,
|
const Consensus::Params& consensusParams, const CCoinsViewCache& view, bool fJustCheck, bool fCheckCbTxMerleRoots,
|
||||||
BlockValidationState& state) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
BlockValidationState& state, std::optional<MNListUpdates>& updatesRet) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
||||||
llmq::CQuorumBlockProcessor& quorum_block_processor) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
llmq::CQuorumBlockProcessor& quorum_block_processor, std::optional<MNListUpdates>& updatesRet) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
bool CheckCreditPoolDiffForBlock(const CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams,
|
bool CheckCreditPoolDiffForBlock(const CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams,
|
||||||
const CAmount blockSubsidy, BlockValidationState& state);
|
const CAmount blockSubsidy, BlockValidationState& state);
|
||||||
|
|
||||||
|
@ -178,6 +178,8 @@ const CLogCategoryDesc LogCategories[] =
|
|||||||
{BCLog::COINJOIN, "coinjoin"},
|
{BCLog::COINJOIN, "coinjoin"},
|
||||||
{BCLog::SPORK, "spork"},
|
{BCLog::SPORK, "spork"},
|
||||||
{BCLog::NETCONN, "netconn"},
|
{BCLog::NETCONN, "netconn"},
|
||||||
|
{BCLog::CREDITPOOL, "creditpool"},
|
||||||
|
{BCLog::EHF, "ehf"},
|
||||||
{BCLog::DASH, "dash"},
|
{BCLog::DASH, "dash"},
|
||||||
//End Dash
|
//End Dash
|
||||||
};
|
};
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include <masternode/payments.h>
|
#include <masternode/payments.h>
|
||||||
#include <masternode/sync.h>
|
#include <masternode/sync.h>
|
||||||
|
|
||||||
|
#include <evo/deterministicmns.h>
|
||||||
#include <evo/evodb.h>
|
#include <evo/evodb.h>
|
||||||
#include <evo/mnhftx.h>
|
#include <evo/mnhftx.h>
|
||||||
#include <evo/specialtx.h>
|
#include <evo/specialtx.h>
|
||||||
@ -1731,7 +1732,8 @@ DisconnectResult CChainState::DisconnectBlock(const CBlock& block, const CBlockI
|
|||||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > addressUnspentIndex;
|
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > addressUnspentIndex;
|
||||||
std::vector<std::pair<CSpentIndexKey, CSpentIndexValue> > spentIndex;
|
std::vector<std::pair<CSpentIndexKey, CSpentIndexValue> > spentIndex;
|
||||||
|
|
||||||
if (!UndoSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor)) {
|
std::optional<MNListUpdates> mnlist_updates_opt{std::nullopt};
|
||||||
|
if (!UndoSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor, mnlist_updates_opt)) {
|
||||||
error("DisconnectBlock(): UndoSpecialTxsInBlock failed");
|
error("DisconnectBlock(): UndoSpecialTxsInBlock failed");
|
||||||
return DISCONNECT_FAILED;
|
return DISCONNECT_FAILED;
|
||||||
}
|
}
|
||||||
@ -1847,6 +1849,12 @@ DisconnectResult CChainState::DisconnectBlock(const CBlock& block, const CBlockI
|
|||||||
view.SetBestBlock(pindex->pprev->GetBlockHash());
|
view.SetBestBlock(pindex->pprev->GetBlockHash());
|
||||||
m_evoDb.WriteBestBlock(pindex->pprev->GetBlockHash());
|
m_evoDb.WriteBestBlock(pindex->pprev->GetBlockHash());
|
||||||
|
|
||||||
|
if (mnlist_updates_opt.has_value()) {
|
||||||
|
auto mnlu = mnlist_updates_opt.value();
|
||||||
|
GetMainSignals().NotifyMasternodeListChanged(true, mnlu.old_list, mnlu.diff);
|
||||||
|
uiInterface.NotifyMasternodeListChanged(mnlu.new_list, pindex->pprev);
|
||||||
|
}
|
||||||
|
|
||||||
auto finish = Now<SteadyMilliseconds>();
|
auto finish = Now<SteadyMilliseconds>();
|
||||||
auto diff = finish - start;
|
auto diff = finish - start;
|
||||||
statsClient.timing("DisconnectBlock_ms", count_milliseconds(diff), 1.0f);
|
statsClient.timing("DisconnectBlock_ms", count_milliseconds(diff), 1.0f);
|
||||||
@ -2210,7 +2218,8 @@ bool CChainState::ConnectBlock(const CBlock& block, BlockValidationState& state,
|
|||||||
bool fDIP0001Active_context = pindex->nHeight >= Params().GetConsensus().DIP0001Height;
|
bool fDIP0001Active_context = pindex->nHeight >= Params().GetConsensus().DIP0001Height;
|
||||||
|
|
||||||
// MUST process special txes before updating UTXO to ensure consistency between mempool and block processing
|
// MUST process special txes before updating UTXO to ensure consistency between mempool and block processing
|
||||||
if (!ProcessSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor, *m_clhandler, m_params.GetConsensus(), view, fJustCheck, fScriptChecks, state)) {
|
std::optional<MNListUpdates> mnlist_updates_opt{std::nullopt};
|
||||||
|
if (!ProcessSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor, *m_clhandler, m_params.GetConsensus(), view, fJustCheck, fScriptChecks, state, mnlist_updates_opt)) {
|
||||||
return error("ConnectBlock(DASH): ProcessSpecialTxsInBlock for block %s failed with %s",
|
return error("ConnectBlock(DASH): ProcessSpecialTxsInBlock for block %s failed with %s",
|
||||||
pindex->GetBlockHash().ToString(), state.ToString());
|
pindex->GetBlockHash().ToString(), state.ToString());
|
||||||
}
|
}
|
||||||
@ -2470,6 +2479,12 @@ bool CChainState::ConnectBlock(const CBlock& block, BlockValidationState& state,
|
|||||||
view.SetBestBlock(pindex->GetBlockHash());
|
view.SetBestBlock(pindex->GetBlockHash());
|
||||||
m_evoDb.WriteBestBlock(pindex->GetBlockHash());
|
m_evoDb.WriteBestBlock(pindex->GetBlockHash());
|
||||||
|
|
||||||
|
if (mnlist_updates_opt.has_value()) {
|
||||||
|
auto mnlu = mnlist_updates_opt.value();
|
||||||
|
GetMainSignals().NotifyMasternodeListChanged(false, mnlu.old_list, mnlu.diff);
|
||||||
|
uiInterface.NotifyMasternodeListChanged(mnlu.new_list, pindex);
|
||||||
|
}
|
||||||
|
|
||||||
int64_t nTime8 = GetTimeMicros(); nTimeCallbacks += nTime8 - nTime5;
|
int64_t nTime8 = GetTimeMicros(); nTimeCallbacks += nTime8 - nTime5;
|
||||||
LogPrint(BCLog::BENCHMARK, " - Callbacks: %.2fms [%.2fs (%.2fms/blk)]\n", MILLI * (nTime8 - nTime5), nTimeCallbacks * MICRO, nTimeCallbacks * MILLI / nBlocksTotal);
|
LogPrint(BCLog::BENCHMARK, " - Callbacks: %.2fms [%.2fs (%.2fms/blk)]\n", MILLI * (nTime8 - nTime5), nTimeCallbacks * MICRO, nTimeCallbacks * MILLI / nBlocksTotal);
|
||||||
|
|
||||||
@ -4838,7 +4853,8 @@ bool CChainState::RollforwardBlock(const CBlockIndex* pindex, CCoinsViewCache& i
|
|||||||
|
|
||||||
// MUST process special txes before updating UTXO to ensure consistency between mempool and block processing
|
// MUST process special txes before updating UTXO to ensure consistency between mempool and block processing
|
||||||
BlockValidationState state;
|
BlockValidationState state;
|
||||||
if (!ProcessSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor, *m_clhandler, m_params.GetConsensus(), inputs, false /*fJustCheck*/, false /*fScriptChecks*/, state)) {
|
std::optional<MNListUpdates> mnlist_updates_opt{std::nullopt};
|
||||||
|
if (!ProcessSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor, *m_clhandler, m_params.GetConsensus(), inputs, false /*fJustCheck*/, false /*fScriptChecks*/, state, mnlist_updates_opt)) {
|
||||||
return error("RollforwardBlock(DASH): ProcessSpecialTxsInBlock for block %s failed with %s",
|
return error("RollforwardBlock(DASH): ProcessSpecialTxsInBlock for block %s failed with %s",
|
||||||
pindex->GetBlockHash().ToString(), state.ToString());
|
pindex->GetBlockHash().ToString(), state.ToString());
|
||||||
}
|
}
|
||||||
|
@ -310,7 +310,7 @@ void CMainSignals::NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecover
|
|||||||
sig->GetHash().ToString());
|
sig->GetHash().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMainSignals::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff, CConnman& connman) {
|
void CMainSignals::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff) {
|
||||||
LOG_EVENT("%s: notify mn list changed undo=%d", __func__, undo);
|
LOG_EVENT("%s: notify mn list changed undo=%d", __func__, undo);
|
||||||
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NotifyMasternodeListChanged(undo, oldMNList, diff, connman); });
|
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NotifyMasternodeListChanged(undo, oldMNList, diff); });
|
||||||
}
|
}
|
||||||
|
@ -165,7 +165,7 @@ protected:
|
|||||||
virtual void NotifyGovernanceObject(const std::shared_ptr<const CGovernanceObject>& object) {}
|
virtual void NotifyGovernanceObject(const std::shared_ptr<const CGovernanceObject>& object) {}
|
||||||
virtual void NotifyInstantSendDoubleSpendAttempt(const CTransactionRef& currentTx, const CTransactionRef& previousTx) {}
|
virtual void NotifyInstantSendDoubleSpendAttempt(const CTransactionRef& currentTx, const CTransactionRef& previousTx) {}
|
||||||
virtual void NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecoveredSig>& sig) {}
|
virtual void NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecoveredSig>& sig) {}
|
||||||
virtual void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff, CConnman& connman) {}
|
virtual void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff) {}
|
||||||
/**
|
/**
|
||||||
* Notifies listeners of the new active block chain on-disk.
|
* Notifies listeners of the new active block chain on-disk.
|
||||||
*
|
*
|
||||||
@ -232,7 +232,7 @@ public:
|
|||||||
void NotifyGovernanceObject(const std::shared_ptr<const CGovernanceObject>& object);
|
void NotifyGovernanceObject(const std::shared_ptr<const CGovernanceObject>& object);
|
||||||
void NotifyInstantSendDoubleSpendAttempt(const CTransactionRef ¤tTx, const CTransactionRef &previousTx);
|
void NotifyInstantSendDoubleSpendAttempt(const CTransactionRef ¤tTx, const CTransactionRef &previousTx);
|
||||||
void NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecoveredSig> &sig);
|
void NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecoveredSig> &sig);
|
||||||
void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff, CConnman& connman);
|
void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff);
|
||||||
void ChainStateFlushed(const CBlockLocator &);
|
void ChainStateFlushed(const CBlockLocator &);
|
||||||
void BlockChecked(const CBlock&, const BlockValidationState&);
|
void BlockChecked(const CBlock&, const BlockValidationState&);
|
||||||
void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr<const CBlock>&);
|
void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr<const CBlock>&);
|
||||||
|
@ -105,6 +105,7 @@ EXPECTED_CIRCULAR_DEPENDENCIES=(
|
|||||||
"llmq/debug -> llmq/dkgsessionhandler -> llmq/dkgsession -> llmq/debug"
|
"llmq/debug -> llmq/dkgsessionhandler -> llmq/dkgsession -> llmq/debug"
|
||||||
"llmq/utils -> validation -> llmq/utils"
|
"llmq/utils -> validation -> llmq/utils"
|
||||||
"evo/mnhftx -> validation -> evo/mnhftx"
|
"evo/mnhftx -> validation -> evo/mnhftx"
|
||||||
|
"evo/deterministicmns -> validation -> evo/deterministicmns"
|
||||||
)
|
)
|
||||||
|
|
||||||
EXIT_CODE=0
|
EXIT_CODE=0
|
||||||
|
Loading…
Reference in New Issue
Block a user