]> Git Repo - VerusCoin.git/blob - src/script/sign.h
Enable identity to modify itself, except lock time, when locked
[VerusCoin.git] / src / script / sign.h
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 .
5
6 #ifndef BITCOIN_SCRIPT_SIGN_H
7 #define BITCOIN_SCRIPT_SIGN_H
8
9 #include "script/interpreter.h"
10
11 class CKey;
12 class CKeyID;
13 class CKeyStore;
14 class CScript;
15 class CTransaction;
16
17 struct CMutableTransaction;
18
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) {}
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;
30
31     /** Create a singular (non-script) signature. */
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;
38 };
39
40 /** A signature creator for transactions. */
41 class TransactionSignatureCreator : public BaseSignatureCreator {
42     const CTransaction* txTo;
43     unsigned int nIn;
44     int nHashType;
45     CAmount amount;
46     const TransactionSignatureChecker checker;
47
48 public:
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;
53 };
54
55 class MutableTransactionSignatureCreator : public TransactionSignatureCreator {
56     CTransaction tx;
57
58 public:
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) {}
61 };
62
63 /** A signature creator that just produces 72-byte empty signatures. */
64 class DummySignatureCreator : public BaseSignatureCreator {
65 public:
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;
69 };
70
71 struct SignatureData {
72     CScript scriptSig;
73
74     SignatureData() {}
75     explicit SignatureData(const CScript& script) : scriptSig(script) {}
76 };
77
78 /** Produce a script signature using a generic signature creator. */
79 bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata, uint32_t consensusBranchId);
80
81 /** Produce a script signature for a transaction. */
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);
97
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);
105
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);
109
110 #endif // BITCOIN_SCRIPT_SIGN_H
This page took 0.029134 seconds and 4 git commands to generate.