2014-08-27 17:22:33 +02:00
// Copyright (c) 2009-2010 Satoshi Nakamoto
2015-12-13 14:51:43 +01:00
// Copyright (c) 2009-2015 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-03-19 23:46:56 +01:00
# include <script/interpreter.h>
2014-08-27 17:22:33 +02:00
2018-03-27 20:16:45 +02:00
class CKey ;
2014-11-04 19:06:20 +01:00
class CKeyID ;
2014-08-27 17:22:33 +02:00
class CScript ;
2018-03-27 20:16:45 +02: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-27 20:16:45 +02:00
/** An interface to be implemented by keystores that support signing. */
class SigningProvider
{
public :
virtual ~ SigningProvider ( ) { }
2018-07-05 16:22:31 +02: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-27 20:16:45 +02:00
} ;
2018-07-05 16:22:31 +02:00
extern const SigningProvider & DUMMY_SIGNING_PROVIDER ;
2018-04-12 22:30:41 +02:00
/** Interface for signature creators. */
2014-11-04 19:06:20 +01:00
class BaseSignatureCreator {
public :
virtual ~ BaseSignatureCreator ( ) { }
virtual const BaseSignatureChecker & Checker ( ) const = 0 ;
/** Create a singular (non-script) signature. */
2018-04-12 22:30:41 +02: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 19:06:20 +01:00
} ;
/** A signature creator for transactions. */
2018-05-31 10:39:09 +02:00
class MutableTransactionSignatureCreator : public BaseSignatureCreator {
const CMutableTransaction * txTo ;
2014-11-04 19:06:20 +01:00
unsigned int nIn ;
int nHashType ;
2015-12-27 19:49:08 +01:00
CAmount amount ;
2018-05-31 10:39:09 +02:00
const MutableTransactionSignatureChecker checker ;
2014-11-04 19:06:20 +01:00
public :
2018-05-31 10:39:09 +02:00
MutableTransactionSignatureCreator ( const CMutableTransaction * txToIn , unsigned int nInIn , const CAmount & amountIn , int nHashTypeIn = SIGHASH_ALL ) ;
2018-02-15 08:29:15 +01:00
const BaseSignatureChecker & Checker ( ) const override { return checker ; }
2018-04-12 22:30:41 +02: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
} ;
2018-08-13 11:54:07 +02:00
/** A signature creator that just produces 71-byte empty signatures. */
2018-04-12 22:30:41 +02:00
extern const BaseSignatureCreator & DUMMY_SIGNATURE_CREATOR ;
2018-08-13 11:54:07 +02: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-05 16:22:31 +02: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-05 16:22:31 +02:00
bool complete = false ; ///< Stores whether the scriptSig is 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
std : : map < CKeyID , SigPair > signatures ; ///< BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a final scriptSig.
2016-03-31 14:54:58 +02:00
SignatureData ( ) { }
explicit SignatureData ( const CScript & script ) : scriptSig ( script ) { }
2018-07-05 16:22:31 +02:00
void MergeSignatureData ( SignatureData sigdata ) ;
2015-05-01 15:21:06 +02:00
} ;
2014-11-04 19:06:20 +01:00
/** Produce a script signature using a generic signature creator. */
2018-04-12 22:30:41 +02:00
bool ProduceSignature ( const SigningProvider & provider , const BaseSignatureCreator & creator , const CScript & scriptPubKey , SignatureData & sigdata ) ;
2014-11-04 19:06:20 +01:00
/** Produce a script signature for a transaction. */
2018-03-27 20:16:45 +02: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-05 16:22:31 +02:00
/** Extract signature data from a transaction input, and insert it. */
SignatureData DataFromTransaction ( const CMutableTransaction & tx , unsigned int nIn , const CTxOut & txout ) ;
Backport bitcoin#10637 (partial) (#3878)
* Calculate and store the number of bytes required to spend an input
* Store effective value, fee, and long term fee in CInputCoin
Have CInputCOin store effective value information. This includes the effective
value itself, the fee, and the long term fee for the input
* Implement Branch and Bound coin selection in a new file
Create a new file for coin selection logic and implement the BnB algorithm in it.
* Move output eligibility to a separate function
* Use a struct for output eligibility
Instead of specifying 3 parameters, use a struct for those parameters
in order to reduce the number of arguments to SelectCoinsMinConf.
* Remove coinselection.h -> wallet.h circular dependency
Changes CInputCoin to coinselection and to use CTransactionRef in
order to avoid a circular dependency. Also moves other coin selection
specific variables out of wallet.h to coinselectoin.h
* Add tests for the Branch and Bound algorithm
* Move current coin selection algorithm to coinselection.{cpp,h}
Moves the current coin selection algorithm out of SelectCoinsMinConf
and puts it in coinselection.{cpp,h}. The new function, KnapsackSolver,
instead of taking a vector of COutputs, will take a vector of CInputCoins
that is prepared by SelectCoinsMinConf.
* Move original knapsack solver tests to coinselector_tests.cpp
* Add a GetMinimumFeeRate function which is wrapped by GetMinimumFee
* Have SelectCoinsMinConf and SelectCoins use BnB or Knapsack and use it (partial)
Allows SelectCoinsMinConf and SelectCoins be able to switch between
using BnB or Knapsack for choosing coins.
Has SelectCoinsMinConf do the preprocessing necessary to support either
BnB or Knapsack. This includes calculating the filtering the effective
values for each input.
Uses BnB in CreateTransaction to find an exact match for the output.
If BnB fails, it will fallback to the Knapsack solver.
Dash specific note: just always use Knapsack in CreateTransaction.
* Benchmark BnB in the worst case where it exhausts
* Add a test to make sure that negative effective values are filtered
* More of 12747: Fix typos
Co-authored-by: Andrew Chow <achow101-github@achow101.com>
2020-12-18 18:43:48 +01:00
void UpdateInput ( CTxIn & input , const SignatureData & data ) ;
2014-08-27 17:22:33 +02:00
2017-12-01 01:48:31 +01: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
2021-06-18 12:55:36 +02:00
* provider is used to look up public keys and redeemscripts by hash .
2017-12-01 01:48:31 +01:00
* Solvability is unrelated to whether we consider this output to be ours . */
2021-06-18 12:55:36 +02:00
bool IsSolvable ( const SigningProvider & provider , const CScript & script ) ;
2017-12-01 01:48:31 +01:00
2014-11-03 16:16:40 +01:00
# endif // BITCOIN_SCRIPT_SIGN_H