Line data Source code
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 http://www.opensource.org/licenses/mit-license.php.
5 :
6 : #ifndef BITCOIN_SCRIPT_SIGN_H
7 : #define BITCOIN_SCRIPT_SIGN_H
8 :
9 : #include "script/interpreter.h"
10 :
11 : class CKeyID;
12 : class CKeyStore;
13 : class CScript;
14 : class CTransaction;
15 :
16 : struct CMutableTransaction;
17 :
18 : /** Virtual base class for signature creators. */
19 : class BaseSignatureCreator {
20 : protected:
21 : const CKeyStore* keystore;
22 :
23 : public:
24 923 : BaseSignatureCreator(const CKeyStore* keystoreIn) : keystore(keystoreIn) {}
25 0 : const CKeyStore& KeyStore() const { return *keystore; };
26 923 : virtual ~BaseSignatureCreator() {}
27 : virtual const BaseSignatureChecker& Checker() const =0;
28 :
29 : /** Create a singular (non-script) signature. */
30 : virtual bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode) const =0;
31 : };
32 :
33 : /** A signature creator for transactions. */
34 2205 : class TransactionSignatureCreator : public BaseSignatureCreator {
35 : const CTransaction* txTo;
36 : unsigned int nIn;
37 : int nHashType;
38 : const TransactionSignatureChecker checker;
39 :
40 : public:
41 : TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, int nHashTypeIn=SIGHASH_ALL);
42 730 : const BaseSignatureChecker& Checker() const { return checker; }
43 : bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode) const;
44 : };
45 :
46 : /** A signature creator that just produces 72-byte empty signatyres. */
47 376 : class DummySignatureCreator : public BaseSignatureCreator {
48 : public:
49 376 : DummySignatureCreator(const CKeyStore* keystoreIn) : BaseSignatureCreator(keystoreIn) {}
50 : const BaseSignatureChecker& Checker() const;
51 : bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode) const;
52 : };
53 :
54 : /** Produce a script signature using a generic signature creator. */
55 : bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, CScript& scriptSig);
56 :
57 : /** Produce a script signature for a transaction. */
58 : bool SignSignature(const CKeyStore& keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL);
59 : bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType=SIGHASH_ALL);
60 :
61 : /** Combine two script signatures using a generic signature checker, intelligently, possibly with OP_0 placeholders. */
62 : CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const CScript& scriptSig1, const CScript& scriptSig2);
63 :
64 : /** Combine two script signatures on transactions. */
65 : CScript CombineSignatures(const CScript& scriptPubKey, const CTransaction& txTo, unsigned int nIn, const CScript& scriptSig1, const CScript& scriptSig2);
66 :
67 : #endif // BITCOIN_SCRIPT_SIGN_H
|