1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or https://www.opensource.org/licenses/mit-license.php .
6 #ifndef BITCOIN_SCRIPT_SIGN_H
7 #define BITCOIN_SCRIPT_SIGN_H
9 #include "script/interpreter.h"
17 struct CMutableTransaction;
19 /** Virtual base class for signature creators. */
20 class BaseSignatureCreator {
22 const CKeyStore* keystore;
25 BaseSignatureCreator(const CKeyStore* keystoreIn) : keystore(keystoreIn) {}
26 const bool IsKeystoreValid() const { return keystore != NULL; }
27 const CKeyStore& KeyStore() const { return *keystore; }
28 virtual ~BaseSignatureCreator() {}
29 virtual const BaseSignatureChecker& Checker() const =0;
31 /** Create a singular (non-script) signature. */
32 virtual bool CreateSig(std::vector<unsigned char>& vchSig,
34 const CScript& scriptCode,
35 uint32_t consensusBranchId,
37 void *extraData = NULL) const = 0;
40 /** A signature creator for transactions. */
41 class TransactionSignatureCreator : public BaseSignatureCreator {
42 const CTransaction* txTo;
46 const TransactionSignatureChecker checker;
49 TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn=SIGHASH_ALL);
50 TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, const CScript &scriptPubKey, uint32_t spendHeight=INT32_MAX, int nHashTypeIn=SIGHASH_ALL);
51 const BaseSignatureChecker& Checker() const { return checker; }
52 bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, uint32_t consensusBranchId, CKey *key = NULL, void *extraData = NULL) const;
55 class MutableTransactionSignatureCreator : public TransactionSignatureCreator {
59 MutableTransactionSignatureCreator(const CKeyStore* keystoreIn, const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amount, const CScript &scriptPubKey, uint32_t spendHeight=INT32_MAX, int nHashTypeIn=SIGHASH_ALL)
60 : TransactionSignatureCreator(keystoreIn, &tx, nInIn, amount, scriptPubKey, spendHeight, nHashTypeIn), tx(*txToIn) {}
63 /** A signature creator that just produces 72-byte empty signatures. */
64 class DummySignatureCreator : public BaseSignatureCreator {
66 DummySignatureCreator(const CKeyStore* keystoreIn) : BaseSignatureCreator(keystoreIn) {}
67 const BaseSignatureChecker& Checker() const;
68 bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, uint32_t consensusBranchId, CKey *key = NULL, void *extraData = NULL) const;
71 struct SignatureData {
75 explicit SignatureData(const CScript& script) : scriptSig(script) {}
78 /** Produce a script signature using a generic signature creator. */
79 bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata, uint32_t consensusBranchId);
81 /** Produce a script signature for a transaction. */
83 const CKeyStore &keystore,
84 const CScript& fromPubKey,
85 CMutableTransaction& txTo,
87 const CAmount& amount,
89 uint32_t consensusBranchId);
91 const CKeyStore& keystore,
92 const CTransaction& txFrom,
93 CMutableTransaction& txTo,
96 uint32_t consensusBranchId);
98 /** Combine two script signatures using a generic signature checker, intelligently, possibly with OP_0 placeholders. */
99 SignatureData CombineSignatures(
100 const CScript& scriptPubKey,
101 const BaseSignatureChecker& checker,
102 const SignatureData& scriptSig1,
103 const SignatureData& scriptSig2,
104 uint32_t consensusBranchId);
106 /** Extract signature data from a transaction, and insert it. */
107 SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn);
108 void UpdateTransaction(CMutableTransaction& tx, unsigned int nIn, const SignatureData& data);
110 #endif // BITCOIN_SCRIPT_SIGN_H