2014-08-27 17:22:33 +02:00
// Copyright (c) 2009-2010 Satoshi Nakamoto
2022-12-24 23:49:50 +00:00
// Copyright (c) 2009-2022 The Bitcoin Core developers
2014-09-09 10:00:42 +02:00
// Distributed under the MIT software license, see the accompanying
2014-08-27 17:22:33 +02:00
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
2014-11-03 16:16:40 +01:00
# ifndef BITCOIN_SCRIPT_SIGN_H
# define BITCOIN_SCRIPT_SIGN_H
2014-08-27 17:22:33 +02:00
2020-07-01 19:31:53 +02:00
# include <attributes.h>
2020-02-10 19:19:59 -05:00
# include <coins.h>
2018-06-27 16:53:48 -07:00
# include <hash.h>
# include <pubkey.h>
2017-11-10 13:57:53 +13:00
# include <script/interpreter.h>
2019-06-17 15:47:12 -04:00
# include <script/keyorigin.h>
2021-02-27 20:33:22 -08:00
# include <script/standard.h>
2019-01-28 11:57:50 -08:00
# include <uint256.h>
2014-08-27 17:22:33 +02:00
2018-03-17 19:19:09 -07:00
class CKey ;
2014-11-04 10:06:20 -08:00
class CKeyID ;
2014-08-27 17:22:33 +02:00
class CScript ;
class CTransaction ;
2019-06-06 22:52:24 +02:00
class SigningProvider ;
2014-09-09 10:00:42 +02:00
2021-06-23 17:28:54 -04:00
struct bilingual_str ;
2014-08-27 17:22:33 +02:00
struct CMutableTransaction ;
2018-03-27 13:15:10 -07:00
/** Interface for signature creators. */
2014-11-04 10:06:20 -08:00
class BaseSignatureCreator {
public :
virtual ~ BaseSignatureCreator ( ) { }
virtual const BaseSignatureChecker & Checker ( ) const = 0 ;
/** Create a singular (non-script) signature. */
2018-03-27 13:15:10 -07:00
virtual bool CreateSig ( const SigningProvider & provider , std : : vector < unsigned char > & vchSig , const CKeyID & keyid , const CScript & scriptCode , SigVersion sigversion ) const = 0 ;
2021-02-27 20:33:22 -08:00
virtual bool CreateSchnorrSig ( const SigningProvider & provider , std : : vector < unsigned char > & sig , const XOnlyPubKey & pubkey , const uint256 * leaf_hash , const uint256 * merkle_root , SigVersion sigversion ) const = 0 ;
2014-11-04 10:06:20 -08:00
} ;
/** A signature creator for transactions. */
2020-07-01 19:31:53 +02:00
class MutableTransactionSignatureCreator : public BaseSignatureCreator
{
const CMutableTransaction & m_txto ;
2014-11-04 10:06:20 -08:00
unsigned int nIn ;
int nHashType ;
2015-12-27 19:49:08 +01:00
CAmount amount ;
2018-05-20 22:47:14 +02:00
const MutableTransactionSignatureChecker checker ;
2021-02-17 18:57:19 -08:00
const PrecomputedTransactionData * m_txdata ;
2014-11-04 10:06:20 -08:00
public :
2020-07-01 19:31:53 +02:00
MutableTransactionSignatureCreator ( const CMutableTransaction & tx LIFETIMEBOUND , unsigned int input_idx , const CAmount & amount , int hash_type ) ;
MutableTransactionSignatureCreator ( const CMutableTransaction & tx LIFETIMEBOUND , unsigned int input_idx , const CAmount & amount , const PrecomputedTransactionData * txdata , int hash_type ) ;
2017-06-20 21:58:56 +02:00
const BaseSignatureChecker & Checker ( ) const override { return checker ; }
2018-03-27 13:15:10 -07:00
bool CreateSig ( const SigningProvider & provider , std : : vector < unsigned char > & vchSig , const CKeyID & keyid , const CScript & scriptCode , SigVersion sigversion ) const override ;
2021-02-27 20:33:22 -08:00
bool CreateSchnorrSig ( const SigningProvider & provider , std : : vector < unsigned char > & sig , const XOnlyPubKey & pubkey , const uint256 * leaf_hash , const uint256 * merkle_root , SigVersion sigversion ) const override ;
2016-03-31 14:54:58 +02:00
} ;
2022-08-12 16:30:09 -04:00
/** A signature checker that accepts all signatures */
extern const BaseSignatureChecker & DUMMY_CHECKER ;
2018-08-07 16:59:53 -07:00
/** A signature creator that just produces 71-byte empty signatures. */
2018-03-27 13:34:39 -07:00
extern const BaseSignatureCreator & DUMMY_SIGNATURE_CREATOR ;
2018-08-07 16:59:53 -07:00
/** A signature creator that just produces 72-byte empty signatures. */
extern const BaseSignatureCreator & DUMMY_MAXIMUM_SIGNATURE_CREATOR ;
2016-03-31 14:54:58 +02:00
2018-07-03 17:18:52 -07:00
typedef std : : pair < CPubKey , std : : vector < unsigned char > > SigPair ;
// This struct contains information from a transaction input and also contains signatures for that input.
// The information contained here can be used to create a signature and is also filled by ProduceSignature
// in order to construct final scriptSigs and scriptWitnesses.
2016-03-31 14:54:58 +02:00
struct SignatureData {
2018-07-03 17:18:52 -07:00
bool complete = false ; ///< Stores whether the scriptSig and scriptWitness are complete
2018-06-27 16:56:30 -07:00
bool witness = false ; ///< Stores whether the input this SigData corresponds to is a witness input
2018-07-03 17:18:52 -07:00
CScript scriptSig ; ///< The scriptSig of an input. Contains complete signatures or the traditional partial signatures format
CScript redeem_script ; ///< The redeemScript (if any) for the input
CScript witness_script ; ///< The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.
CScriptWitness scriptWitness ; ///< The scriptWitness of an input. Contains complete signatures or the traditional partial signatures format. scriptWitness is part of a transaction input per BIP 144.
2021-02-27 20:33:22 -08:00
TaprootSpendData tr_spenddata ; ///< Taproot spending data.
2021-07-19 16:02:36 -04:00
std : : optional < TaprootBuilder > tr_builder ; ///< Taproot tree used to build tr_spenddata.
2018-07-03 17:18:52 -07:00
std : : map < CKeyID , SigPair > signatures ; ///< BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a final scriptSig or scriptWitness.
2018-07-19 18:47:24 -07:00
std : : map < CKeyID , std : : pair < CPubKey , KeyOriginInfo > > misc_pubkeys ;
2021-02-27 20:33:22 -08:00
std : : vector < unsigned char > taproot_key_path_sig ; /// Schnorr signature for key path spending
std : : map < std : : pair < XOnlyPubKey , uint256 > , std : : vector < unsigned char > > taproot_script_sigs ; ///< (Partial) schnorr signatures, indexed by XOnlyPubKey and leaf_hash.
2021-07-19 15:29:29 -04:00
std : : map < XOnlyPubKey , std : : pair < std : : set < uint256 > , KeyOriginInfo > > taproot_misc_pubkeys ; ///< Miscellaneous Taproot pubkeys involved in this input along with their leaf script hashes and key origin data. Also includes the Taproot internal key (may have no leaf script hashes).
2018-07-31 17:57:15 -07:00
std : : vector < CKeyID > missing_pubkeys ; ///< KeyIDs of pubkeys which could not be found
std : : vector < CKeyID > missing_sigs ; ///< KeyIDs of pubkeys for signatures which could not be found
uint160 missing_redeem_script ; ///< ScriptID of the missing redeemScript (if any)
uint256 missing_witness_script ; ///< SHA256 of the missing witnessScript (if any)
2021-12-04 14:39:24 +01:00
std : : map < std : : vector < uint8_t > , std : : vector < uint8_t > > sha256_preimages ; ///< Mapping from a SHA256 hash to its preimage provided to solve a Script
std : : map < std : : vector < uint8_t > , std : : vector < uint8_t > > hash256_preimages ; ///< Mapping from a HASH256 hash to its preimage provided to solve a Script
std : : map < std : : vector < uint8_t > , std : : vector < uint8_t > > ripemd160_preimages ; ///< Mapping from a RIPEMD160 hash to its preimage provided to solve a Script
std : : map < std : : vector < uint8_t > , std : : vector < uint8_t > > hash160_preimages ; ///< Mapping from a HASH160 hash to its preimage provided to solve a Script
2016-03-31 14:54:58 +02:00
SignatureData ( ) { }
explicit SignatureData ( const CScript & script ) : scriptSig ( script ) { }
2018-06-07 21:12:25 -07:00
void MergeSignatureData ( SignatureData sigdata ) ;
2015-05-01 15:21:06 +02:00
} ;
2014-11-04 10:06:20 -08:00
/** Produce a script signature using a generic signature creator. */
2018-03-27 13:15:10 -07:00
bool ProduceSignature ( const SigningProvider & provider , const BaseSignatureCreator & creator , const CScript & scriptPubKey , SignatureData & sigdata ) ;
2014-11-04 10:06:20 -08:00
2021-12-04 14:39:24 +01:00
/**
* Produce a satisfying script ( scriptSig or witness ) .
*
* @ param provider Utility containing the information necessary to solve a script .
* @ param fromPubKey The script to produce a satisfaction for .
* @ param txTo The spending transaction .
* @ param nIn The index of the input in ` txTo ` refering the output being spent .
* @ param amount The value of the output being spent .
* @ param nHashType Signature hash type .
* @ param sig_data Additional data provided to solve a script . Filled with the resulting satisfying
* script and whether the satisfaction is complete .
*
* @ return True if the produced script is entirely satisfying ` fromPubKey ` .
* */
bool SignSignature ( const SigningProvider & provider , const CScript & fromPubKey , CMutableTransaction & txTo ,
unsigned int nIn , const CAmount & amount , int nHashType , SignatureData & sig_data ) ;
bool SignSignature ( const SigningProvider & provider , const CTransaction & txFrom , CMutableTransaction & txTo ,
unsigned int nIn , int nHashType , SignatureData & sig_data ) ;
2014-08-27 17:22:33 +02:00
2018-07-03 17:18:52 -07:00
/** Extract signature data from a transaction input, and insert it. */
SignatureData DataFromTransaction ( const CMutableTransaction & tx , unsigned int nIn , const CTxOut & txout ) ;
2018-03-05 16:37:24 -05:00
void UpdateInput ( CTxIn & input , const SignatureData & data ) ;
2014-08-27 17:22:33 +02:00
2019-02-16 14:18:54 -08:00
/** Check whether a scriptPubKey is known to be segwit. */
bool IsSegWitOutput ( const SigningProvider & provider , const CScript & script ) ;
2020-02-10 19:19:59 -05:00
/** Sign the CMutableTransaction */
2021-06-23 17:28:54 -04:00
bool SignTransaction ( CMutableTransaction & mtx , const SigningProvider * provider , const std : : map < COutPoint , Coin > & coins , int sighash , std : : map < int , bilingual_str > & input_errors ) ;
2020-02-10 19:19:59 -05:00
2014-11-03 16:16:40 +01:00
# endif // BITCOIN_SCRIPT_SIGN_H