This release focuses on adding support for the decentralized Decred treasury, improved SPV syncing with version 2 committed filters, and client support for the new privacy-conscious VSP implementation to make mixed VSP ticketbuying viable.
A comprehensive list of improvements and bug fixes follows.
-
The WalletService.PurchaseTickets
gRPC method gained a dont_sign_tx
parameter to support unsigned ticket purchasing and eventual hardware wallet signing.
-
An AccountMixerService
was added to the gRPC server to perform CoinShuffle++ mixing on all funds received by an account.
-
A createsignature
JSON-RPC method was introduced, analogous to the gRPC WalletService.CreateSignature
method.
-
A discoverusage
JSON-RPC method was introduced, which triggers the same address and account discovery as performed on startup when there are new blocks available. However, this method is more general purpose and is useful when correcting issues with prior discoveries, at it allows specifying the exact starting blocks and a BIP0044 gap limit to use.
-
A WalletService.SignHashes
gRPC method was added to sign an arbitrary number of 32-byte hashes. This method was used by the now-defunct TumbleBit implementation.
-
A WalletService.Spender
gRPC method was added to query the transaction and input index which spends a wallet output.
-
Version 2 committed filters are now used, rather than the previous version 1 filters. These filters are consensus validated by proof-of-work miners as part of the commitments in the block header. Version 2 filters are smaller and also do not require knowledge of the exact outputs spent, but rather only the previous output script (or address).
-
The WalletService.TransactionNotifications
gRPC method now provides more details about the block headers which were detached during a reorganize, rather than only their hashes.
-
The fundrawtransaction
JSON-RPC method is now directly implemented by dcrwallet, rather than delegating this method to dcrd through RPC passthrough. This allows the method to be usable under SPV mode.
-
An addtransaction
JSON-RPC method was added, allowing transactions to be manually added to the wallet, mined in a specified block, without discovering the transaction through the network.
-
The stakepooluserinfo
JSON-RPC method has been reintroduced, after being removed from prior releases. This is used by the new vspd server.
-
Vote preferences may now be specified on a per-ticket basis with added optional parameters to the setvotechoice
JSON-RPC method. This feature is used by the new vspd server.
-
A WalletService.GetRawCFilters
gRPC method was added to query the wallet-stored version 2 committed filter for specified blocks.
-
A NetworkService.GetRawBlock
gRPC method was added to fetch raw blocks using the wallet's peer-to-peer implementation.
-
An optional account parameter was added to the listunspent
and listlockunspent
JSON-RPC methods to filter results for a particular account.
-
A ticketinfo
JSON-RPC method was added to provide detailed status information regarding all tickets from the wallet.
-
The WalletService.PurchaseTickets
method gained support for specifying CoinShuffle++ options for mixed ticket buying.
-
Both a getpeerinfo
JSON-RPC method and WalletService.GetPeerInfo
gRPC method were implemented to provide peer info in SPV mode. The JSON-RPC method continues to return results from a connected dcrd when syncing in RPC mode.
-
A walletpassphrasechange
JSON-RPC method was added to modify the wallet's public data encryption passphrase. Changing to the default insecure value "public" effectively removes any prompts for the public passphrase at startup.
-
A client for the new vspd server was added, and dcrwallet supports this client functionality from both the ticket autobuyer and through various gRPC methods.
-
The getcoinjoinsbyacct
JSON-RPC method and WalletService.GetCoinjoinOutputspByAcct
gRPC methods were added to discover probable CoinJoin transactions and report them by account.
-
Unpublished transactions are now supported. When an unpublished transaction is saved to the database, the outputs it spends are tallied in balance results and are not spendable by other transactions. Unpublishd transactions will not be automatically rebroadast to the network when the wallet starts up and begins syncing. Unpublished transactions are used to record transactions paying vspd fees prior to the vspd instance accepting the client's ticket request.
-
A --manualtickets
flag was added to the application config. This setting disables discovering any tickets from the network syncing, instead requiring any tickets to be manually added to the wallet using addtransaction
. This feature is used by the new vspd server to avoid voting on unprocessed tickets which used a vspd voting address. The current state of this setting is reported in the walletinfo
JSON-RPC result.
-
The LOGFLAGS environment variable may now include a UTC flag to cause the wallet to always log with UTC timestamps, regardless of the current system timezone.
-
The listunspent
JSON-RPC method now includes the hex encoding of a redeem script when the output is P2SH and the redeem script is known.
-
Support for the decentralized treasury hard fork is added. Two new JSON-RPC methods sendtotreasury
and spendfromtreasury
are added, to send to and spend from value in the treasury, respectively. The vote version and current agendas have been updated to allow stakeholders to vote on the activation of the decentralized treasury.
-
A sendrawtransaction
implementation has been added to the JSON-RPC server. This allows arbitrary transactions to be published under SPV mode.
-
Accounts are now able to be encrypted using separate, per-account passphrases. Unlocking an account only provides access to that account's private keys, and no others. Account passphrases may be set using the setaccountpassphrase
JSON-RPC method, and locked and unlocked by the unlockaccount
and lockaccount
methods.
-
JSON-RPC clients may now be authenticated using TLS client certificates, and this authentication is now required for the gRPC server. The feature may be enabled for JSON-RPC by using the --jsonrpcauthtype=clientcert
config flag. Client certificates read from a clients.pem
file in the application directory are trusted by default, and this file may be modified by the --clientcafile
config flag. Additionally, an --issueclientcert
flag is provided which causes the wallet to issue and send an ephemeral client certificate and key over the TX pipe to the parent process which forked dcrwallet. Client certificates may be generated by the gencerts
tool, which is now part of the Decred CLI distribution.
-
gRPC methods to lock and unlock the wallet's global keys and individually-encrypted accounts are now added, and the passphrase in all requests which required an unlocked wallet are now optional. As the gRPC server now requires client authentication, there is no a risk of an unauthenticated client from quickly hitting an already-unlocked wallet or account and using private keys it should not otherwise have access to.
-
Peer-to-peer seeding is now performed over an HTTPS API rather than DNS. This improves reliability (HTTPS is authenticated), as well as greater control of filtering results by various URL parameters.
-
Many log messages were added, removed, or rewritten to better reflect the operational state of the application.
-
The scrypt KDF used for wallet encryption keys now defaults to weaker parameters on simnet. This is primarily done for quicker unit tests, but will also affect real dcrwallet simnet instances by requiring less time and memory to derive keys.
-
Imported scripts are now recorded in plain text and the wallet does not need to be unlocked to retrieve the full script for the P2SH address. This change is made under the assumption that imported redeem scripts should not be secrets themselves, but still require a signature check at the very least.
-
Importing an already-existing redeem script from the importscript
JSON-RPC method no longer starts a rescan.
-
Outputs which are being mixed are now locked to prevent accidental spending before the mix completes.
-
Mix denominations above the ticket price are now avoided when mixing large value outputs. This improves pairing with the large volume of mixes occurring from ticket buying, as there are many pairings occurring at the standard denominations below the ticket price to mix CoinJoin change outputs.
-
Mixed ticketbuying using the autobuyer will now default to buy one ticket per client connection if the limit is unset. Setting a larger limit will continue to buy at most limit number of tickets per client connection.
-
Output locking no longer considers differences between the regular and stake transaction trees.
-
Wallet setup may now be performed by providing answers to the prompts from piped output or a redirected file, as long as the passphrase is provided using the --pass
flag.
-
Newly created simnet wallets now always use the SLIP0044 coin type. This ensures that the printed mining address during the creation process will not become invalid after a coin type upgrade from the legacy to the SLIP0044 coin type following address discovery.
-
The latest peer-to-peer protocol version is now supported. The miningstate
and initstate
messages which are expected in this version are replied to with empty responses.
-
Ticket purchasing will now attempt to buy fewer tickets than requested when there is a low balance, either due to a bad estimate of how many tickets could be purchased, or due to outputs being reserved to pay the fees for the new vspd server.