2014-08-27 17:22:33 +02:00
// Copyright (c) 2009-2010 Satoshi Nakamoto
2018-01-03 02:12:05 +09:00
// Copyright (c) 2009-2017 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
2017-11-10 13:57:53 +13:00
# include <script/interpreter.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 ;
2018-03-17 19:19:09 -07:00
class CScriptID ;
2014-08-27 17:22:33 +02:00
class CTransaction ;
2014-09-09 10:00:42 +02:00
2014-08-27 17:22:33 +02:00
struct CMutableTransaction ;
2018-03-17 19:19:09 -07:00
/** An interface to be implemented by keystores that support signing. */
class SigningProvider
{
public :
virtual ~ SigningProvider ( ) { }
2018-06-07 21:12:25 -07:00
virtual bool GetCScript ( const CScriptID & scriptid , CScript & script ) const { return false ; }
virtual bool GetPubKey ( const CKeyID & address , CPubKey & pubkey ) const { return false ; }
virtual bool GetKey ( const CKeyID & address , CKey & key ) const { return false ; }
2018-03-17 19:19:09 -07:00
} ;
2018-06-07 21:12:25 -07:00
extern const SigningProvider & DUMMY_SIGNING_PROVIDER ;
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 ;
2014-11-04 10:06:20 -08:00
} ;
/** A signature creator for transactions. */
2018-05-20 22:47:14 +02:00
class MutableTransactionSignatureCreator : public BaseSignatureCreator {
const CMutableTransaction * 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 ;
2014-11-04 10:06:20 -08:00
public :
2018-05-20 22:47:14 +02:00
MutableTransactionSignatureCreator ( const CMutableTransaction * txToIn , unsigned int nInIn , const CAmount & amountIn , int nHashTypeIn = SIGHASH_ALL ) ;
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 ;
2016-03-31 14:54:58 +02:00
} ;
2016-06-29 11:48:51 +02:00
/** A signature creator that just produces 72-byte empty signatures. */
2018-03-27 13:34:39 -07:00
extern const BaseSignatureCreator & DUMMY_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
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.
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.
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
/** Produce a script signature for a transaction. */
2018-03-17 19:19:09 -07:00
bool SignSignature ( const SigningProvider & provider , const CScript & fromPubKey , CMutableTransaction & txTo , unsigned int nIn , const CAmount & amount , int nHashType ) ;
bool SignSignature ( const SigningProvider & provider , const CTransaction & txFrom , CMutableTransaction & txTo , unsigned int nIn , int nHashType ) ;
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
2017-11-30 16:48:31 -08:00
/* Check whether we know how to sign for an output like this, assuming we
* have all private keys . While this function does not need private keys , the passed
2018-03-17 19:19:09 -07:00
* provider is used to look up public keys and redeemscripts by hash .
2017-11-30 16:48:31 -08:00
* Solvability is unrelated to whether we consider this output to be ours . */
2018-03-17 19:19:09 -07:00
bool IsSolvable ( const SigningProvider & provider , const CScript & script ) ;
2017-11-30 16:48:31 -08:00
2014-11-03 16:16:40 +01:00
# endif // BITCOIN_SCRIPT_SIGN_H