mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-27 15:28:49 +02:00
b224a47a1Add address_types test (Pieter Wuille)7ee54fd7cSupport downgrading after recovered keypool witness keys (Pieter Wuille)940a21932SegWit wallet support (Pieter Wuille)f37c64e47Implicitly know about P2WPKH redeemscripts (Pieter Wuille)57273f2b3[test] Serialize CTransaction with witness by default (Pieter Wuille)cf2c0b6f5Support P2WPKH and P2SH-P2WPKH in dumpprivkey (Pieter Wuille)37c03d3e0Support P2WPKH addresses in create/addmultisig (Pieter Wuille)3eaa003c8Extend validateaddress information for P2SH-embedded witness (Pieter Wuille)30a27dc5bExpose method to find key for a single-key destination (Pieter Wuille)985c79552Improve witness destination types and use them more (Pieter Wuille)cbe197470[refactor] GetAccount{PubKey,Address} -> GetAccountDestination (Pieter Wuille)0c8ea6380Abstract out IsSolvable from Witnessifier (Pieter Wuille) Pull request description: This implements a minimum viable implementation of SegWit wallet support, based on top of #11389, and includes part of the functionality from #11089. Two new configuration options are added: * `-addresstype`, with options `legacy`, `p2sh`, and `bech32`. It controls what kind of addresses are produced by `getnewaddress`, `getaccountaddress`, and `createmultisigaddress`. * `-changetype`, with the same options, and by default equal to `-addresstype`, that controls what kind of change is used. All wallet private and public keys can be used for any type of address. Support for address types dependent on different derivation paths will need a major overhaul of how our internal detection of outputs work. I expect that that will happen for a next major version. The above also applies to imported keys, as having a distinction there but not for normal operations is a disaster for testing, and probably for comprehension of users. This has some ugly effects, like needing to associate the provided label to `importprivkey` with each style address for the corresponding key. To deal with witness outputs requiring a corresponding redeemscript in wallet, three approaches are used: * All SegWit addresses created through `getnewaddress` or multisig RPCs explicitly get their redeemscripts added to the wallet file. This means that downgrading after creating a witness address will work, as long as the wallet file is up to date. * All SegWit keys in the wallet get an _implicit_ redeemscript added, without it being written to the file. This means recovery of an old backup will work, as long as you use new software. * All keypool keys that are seen used in transactions explicitly get their redeemscripts added to the wallet files. This means that downgrading after recovering from a backup that includes a witness address will work. These approaches correspond to solutions 3a, 1a, and 5a respectively from https://gist.github.com/sipa/125cfa1615946d0c3f3eec2ad7f250a2. As argued there, there is no full solution for dealing with the case where you both downgrade and restore a backup, so that's also not implemented. `dumpwallet`, `importwallet`, `importmulti`, `signmessage` and `verifymessage` don't work with SegWit addresses yet. They're remaining TODOs, for this PR or a follow-up. Because of that, several tests unexpectedly run with `-addresstype=legacy` for now. Tree-SHA512: d425dbe517c0422061ab8dacdc3a6ae47da071450932ed992c79559d922dff7b2574a31a8c94feccd3761c1dffb6422c50055e6dca8e3cf94a169bc95e39e959
107 lines
6.0 KiB
C++
107 lines
6.0 KiB
C++
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
|
// Copyright (c) 2009-2017 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#ifndef BITCOIN_POLICY_POLICY_H
|
|
#define BITCOIN_POLICY_POLICY_H
|
|
|
|
#include <consensus/consensus.h>
|
|
#include <policy/feerate.h>
|
|
#include <script/interpreter.h>
|
|
#include <script/standard.h>
|
|
|
|
#include <string>
|
|
|
|
class CCoinsViewCache;
|
|
class CTxOut;
|
|
|
|
/** Default for -blockmaxweight, which controls the range of block weights the mining code will create **/
|
|
static const unsigned int DEFAULT_BLOCK_MAX_WEIGHT = MAX_BLOCK_WEIGHT - 4000;
|
|
/** Default for -blockmintxfee, which sets the minimum feerate for a transaction in blocks created by mining code **/
|
|
static const unsigned int DEFAULT_BLOCK_MIN_TX_FEE = 1000;
|
|
/** The maximum weight for transactions we're willing to relay/mine */
|
|
static const unsigned int MAX_STANDARD_TX_WEIGHT = 400000;
|
|
/** Maximum number of signature check operations in an IsStandard() P2SH script */
|
|
static const unsigned int MAX_P2SH_SIGOPS = 15;
|
|
/** The maximum number of sigops we're willing to relay/mine in a single tx */
|
|
static const unsigned int MAX_STANDARD_TX_SIGOPS_COST = MAX_BLOCK_SIGOPS_COST/5;
|
|
/** Default for -maxmempool, maximum megabytes of mempool memory usage */
|
|
static const unsigned int DEFAULT_MAX_MEMPOOL_SIZE = 300;
|
|
/** Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or BIP 125 replacement **/
|
|
static const unsigned int DEFAULT_INCREMENTAL_RELAY_FEE = 1000;
|
|
/** Default for -bytespersigop */
|
|
static const unsigned int DEFAULT_BYTES_PER_SIGOP = 20;
|
|
/** The maximum number of witness stack items in a standard P2WSH script */
|
|
static const unsigned int MAX_STANDARD_P2WSH_STACK_ITEMS = 100;
|
|
/** The maximum size of each witness stack item in a standard P2WSH script */
|
|
static const unsigned int MAX_STANDARD_P2WSH_STACK_ITEM_SIZE = 80;
|
|
/** The maximum size of a standard witnessScript */
|
|
static const unsigned int MAX_STANDARD_P2WSH_SCRIPT_SIZE = 3600;
|
|
/** Min feerate for defining dust. Historically this has been based on the
|
|
* minRelayTxFee, however changing the dust limit changes which transactions are
|
|
* standard and should be done with care and ideally rarely. It makes sense to
|
|
* only increase the dust limit after prior releases were already not creating
|
|
* outputs below the new threshold */
|
|
static const unsigned int DUST_RELAY_TX_FEE = 3000;
|
|
/**
|
|
* Standard script verification flags that standard transactions will comply
|
|
* with. However scripts violating these flags may still be present in valid
|
|
* blocks and we must accept those blocks.
|
|
*/
|
|
static constexpr unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY_FLAGS |
|
|
SCRIPT_VERIFY_DERSIG |
|
|
SCRIPT_VERIFY_STRICTENC |
|
|
SCRIPT_VERIFY_MINIMALDATA |
|
|
SCRIPT_VERIFY_NULLDUMMY |
|
|
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS |
|
|
SCRIPT_VERIFY_CLEANSTACK |
|
|
SCRIPT_VERIFY_MINIMALIF |
|
|
SCRIPT_VERIFY_NULLFAIL |
|
|
SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY |
|
|
SCRIPT_VERIFY_CHECKSEQUENCEVERIFY |
|
|
SCRIPT_VERIFY_LOW_S |
|
|
SCRIPT_VERIFY_WITNESS |
|
|
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM |
|
|
SCRIPT_VERIFY_WITNESS_PUBKEYTYPE;
|
|
|
|
/** For convenience, standard but not mandatory verify flags. */
|
|
static constexpr unsigned int STANDARD_NOT_MANDATORY_VERIFY_FLAGS = STANDARD_SCRIPT_VERIFY_FLAGS & ~MANDATORY_SCRIPT_VERIFY_FLAGS;
|
|
|
|
/** Used as the flags parameter to sequence and nLocktime checks in non-consensus code. */
|
|
static constexpr unsigned int STANDARD_LOCKTIME_VERIFY_FLAGS = LOCKTIME_VERIFY_SEQUENCE |
|
|
LOCKTIME_MEDIAN_TIME_PAST;
|
|
|
|
CAmount GetDustThreshold(const CTxOut& txout, const CFeeRate& dustRelayFee);
|
|
|
|
bool IsDust(const CTxOut& txout, const CFeeRate& dustRelayFee);
|
|
|
|
bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType, const bool witnessEnabled = false);
|
|
/**
|
|
* Check for standard transaction types
|
|
* @return True if all outputs (scriptPubKeys) use only standard transaction forms
|
|
*/
|
|
bool IsStandardTx(const CTransaction& tx, std::string& reason, const bool witnessEnabled = false);
|
|
/**
|
|
* Check for standard transaction types
|
|
* @param[in] mapInputs Map of previous transactions that have outputs we're spending
|
|
* @return True if all inputs (scriptSigs) use only standard transaction forms
|
|
*/
|
|
bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs);
|
|
/**
|
|
* Check if the transaction is over standard P2WSH resources limit:
|
|
* 3600bytes witnessScript size, 80bytes per witness stack element, 100 witness stack elements
|
|
* These limits are adequate for multi-signature up to n-of-100 using OP_CHECKSIG, OP_ADD, and OP_EQUAL,
|
|
*/
|
|
bool IsWitnessStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs);
|
|
|
|
extern CFeeRate incrementalRelayFee;
|
|
extern CFeeRate dustRelayFee;
|
|
extern unsigned int nBytesPerSigOp;
|
|
|
|
/** Compute the virtual transaction size (weight reinterpreted as bytes). */
|
|
int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost);
|
|
int64_t GetVirtualTransactionSize(const CTransaction& tx, int64_t nSigOpCost = 0);
|
|
|
|
#endif // BITCOIN_POLICY_POLICY_H
|