]>
Commit | Line | Data |
---|---|---|
e088d65a | 1 | // Copyright (c) 2009-2010 Satoshi Nakamoto |
f914f1a7 | 2 | // Copyright (c) 2009-2014 The Bitcoin Core developers |
2d79bba3 | 3 | // Distributed under the MIT software license, see the accompanying |
bc909a7a | 4 | // file COPYING or https://www.opensource.org/licenses/mit-license.php . |
e088d65a | 5 | |
84738627 PJ |
6 | #ifndef BITCOIN_SCRIPT_SIGN_H |
7 | #define BITCOIN_SCRIPT_SIGN_H | |
e088d65a | 8 | |
9 | #include "script/interpreter.h" | |
10 | ||
8a727a26 | 11 | class CKey; |
18051c7f | 12 | class CKeyID; |
e088d65a | 13 | class CKeyStore; |
14 | class CScript; | |
15 | class CTransaction; | |
2d79bba3 | 16 | |
e088d65a | 17 | struct CMutableTransaction; |
18 | ||
18051c7f PW |
19 | /** Virtual base class for signature creators. */ |
20 | class BaseSignatureCreator { | |
21 | protected: | |
22 | const CKeyStore* keystore; | |
23 | ||
24 | public: | |
25 | BaseSignatureCreator(const CKeyStore* keystoreIn) : keystore(keystoreIn) {} | |
11f4f605 | 26 | const bool IsKeystoreValid() const { return keystore != NULL; } |
27 | const CKeyStore& KeyStore() const { return *keystore; } | |
18051c7f PW |
28 | virtual ~BaseSignatureCreator() {} |
29 | virtual const BaseSignatureChecker& Checker() const =0; | |
30 | ||
31 | /** Create a singular (non-script) signature. */ | |
8a727a26 | 32 | virtual bool CreateSig(std::vector<unsigned char>& vchSig, |
33 | const CKeyID& keyid, | |
34 | const CScript& scriptCode, | |
35 | uint32_t consensusBranchId, | |
36 | CKey *key = NULL, | |
37 | void *extraData = NULL) const = 0; | |
18051c7f PW |
38 | }; |
39 | ||
40 | /** A signature creator for transactions. */ | |
41 | class TransactionSignatureCreator : public BaseSignatureCreator { | |
42 | const CTransaction* txTo; | |
43 | unsigned int nIn; | |
44 | int nHashType; | |
c86a1cb8 | 45 | CAmount amount; |
18051c7f PW |
46 | const TransactionSignatureChecker checker; |
47 | ||
48 | public: | |
c86a1cb8 | 49 | TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn=SIGHASH_ALL); |
a4f9bc97 | 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); |
18051c7f | 51 | const BaseSignatureChecker& Checker() const { return checker; } |
8a727a26 | 52 | bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, uint32_t consensusBranchId, CKey *key = NULL, void *extraData = NULL) const; |
157a5d0d PW |
53 | }; |
54 | ||
55 | class MutableTransactionSignatureCreator : public TransactionSignatureCreator { | |
56 | CTransaction tx; | |
57 | ||
58 | public: | |
a4f9bc97 | 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) {} | |
18051c7f PW |
61 | }; |
62 | ||
c938fb1f | 63 | /** A signature creator that just produces 72-byte empty signatures. */ |
18e804a9 PW |
64 | class DummySignatureCreator : public BaseSignatureCreator { |
65 | public: | |
66 | DummySignatureCreator(const CKeyStore* keystoreIn) : BaseSignatureCreator(keystoreIn) {} | |
67 | const BaseSignatureChecker& Checker() const; | |
8a727a26 | 68 | bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, uint32_t consensusBranchId, CKey *key = NULL, void *extraData = NULL) const; |
157a5d0d PW |
69 | }; |
70 | ||
71 | struct SignatureData { | |
72 | CScript scriptSig; | |
157a5d0d PW |
73 | |
74 | SignatureData() {} | |
75 | explicit SignatureData(const CScript& script) : scriptSig(script) {} | |
18e804a9 PW |
76 | }; |
77 | ||
18051c7f | 78 | /** Produce a script signature using a generic signature creator. */ |
be126699 | 79 | bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata, uint32_t consensusBranchId); |
18051c7f PW |
80 | |
81 | /** Produce a script signature for a transaction. */ | |
d55e5e77 JG |
82 | bool SignSignature( |
83 | const CKeyStore &keystore, | |
84 | const CScript& fromPubKey, | |
85 | CMutableTransaction& txTo, | |
86 | unsigned int nIn, | |
87 | const CAmount& amount, | |
88 | int nHashType, | |
89 | uint32_t consensusBranchId); | |
90 | bool SignSignature( | |
91 | const CKeyStore& keystore, | |
92 | const CTransaction& txFrom, | |
93 | CMutableTransaction& txTo, | |
94 | unsigned int nIn, | |
95 | int nHashType, | |
96 | uint32_t consensusBranchId); | |
e088d65a | 97 | |
18051c7f | 98 | /** Combine two script signatures using a generic signature checker, intelligently, possibly with OP_0 placeholders. */ |
d55e5e77 JG |
99 | SignatureData CombineSignatures( |
100 | const CScript& scriptPubKey, | |
101 | const BaseSignatureChecker& checker, | |
102 | const SignatureData& scriptSig1, | |
103 | const SignatureData& scriptSig2, | |
104 | uint32_t consensusBranchId); | |
18051c7f | 105 | |
157a5d0d PW |
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); | |
e088d65a | 109 | |
84738627 | 110 | #endif // BITCOIN_SCRIPT_SIGN_H |