PIVX Core  5.6.99
P2P Digital Currency
sign.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2014 The Bitcoin developers
3 // Copyright (c) 2016-2022 The PIVX Core developers
4 // Distributed under the MIT software license, see the accompanying
5 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
6 
7 #ifndef PIVX_SCRIPT_SIGN_H
8 #define PIVX_SCRIPT_SIGN_H
9 
10 #include "script/interpreter.h"
11 
12 class CKey;
13 class CKeyID;
14 class CKeyStore;
15 class CScript;
16 class CScriptID;
17 class CTransaction;
18 
19 struct CMutableTransaction;
20 
23 {
24 public:
25  virtual ~SigningProvider() {}
26  virtual bool GetCScript(const CScriptID &scriptid, CScript& script) const { return false; }
27  virtual bool GetPubKey(const CKeyID &address, CPubKey& pubkey) const { return false; }
28  virtual bool GetKey(const CKeyID &address, CKey& key) const { return false; }
29 };
30 
32 
34 {
35 private:
37 
38 public:
39  explicit PublicOnlySigningProvider(const SigningProvider* provider) : m_provider(provider) {}
40  bool GetCScript(const CScriptID &scriptid, CScript& script) const;
41  bool GetPubKey(const CKeyID &address, CPubKey& pubkey) const;
42 };
43 
44 struct FlatSigningProvider final : public SigningProvider
45 {
46  std::map<CScriptID, CScript> scripts;
47  std::map<CKeyID, CPubKey> pubkeys;
48  std::map<CKeyID, CKey> keys;
49 
50  bool GetCScript(const CScriptID& scriptid, CScript& script) const override;
51  bool GetPubKey(const CKeyID& keyid, CPubKey& pubkey) const override;
52  bool GetKey(const CKeyID& keyid, CKey& key) const override;
53 };
54 
56 
59 protected:
61 
62 public:
63  explicit BaseSignatureCreator(const CKeyStore* keystoreIn) : keystore(keystoreIn) {}
64  const CKeyStore& KeyStore() const { return *keystore; };
65  virtual ~BaseSignatureCreator() {}
66  virtual const BaseSignatureChecker& Checker() const =0;
67 
69  virtual bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const =0;
70 };
71 
75  unsigned int nIn;
76  int nHashType;
79 
80 public:
81  TransactionSignatureCreator(const CKeyStore* keystoreIn, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn=SIGHASH_ALL);
82  const BaseSignatureChecker& Checker() const { return checker; }
83  bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const;
84 };
85 
88 
89 public:
90  MutableTransactionSignatureCreator(const CKeyStore* keystoreIn, const CMutableTransaction* txToIn, unsigned int nInIn, const CAmount& amount, int nHashTypeIn) : TransactionSignatureCreator(keystoreIn, &tx, nInIn, amount, nHashTypeIn), tx(*txToIn) {}
91 };
92 
95 public:
96  explicit DummySignatureCreator(const CKeyStore* keystoreIn) : BaseSignatureCreator(keystoreIn) {}
97  const BaseSignatureChecker& Checker() const;
98  bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const;
99 };
100 
103 
105  explicit SignatureData(const CScript& script) : scriptSig(script) {}
106 };
107 
109 bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata, SigVersion sigversion, bool fColdStake, ScriptError* serror = nullptr);
110 
112 bool SignSignature(const CKeyStore& keystore, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType, bool fColdStake = false);
113 bool SignSignature(const CKeyStore& keystore, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType, bool fColdStake = false);
114 
116 SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecker& checker, const SignatureData& scriptSig1, const SignatureData& scriptSig2);
117 
119 SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn);
120 void UpdateTransaction(CMutableTransaction& tx, unsigned int nIn, const SignatureData& data);
121 
122 /* Check whether we know how to sign for an output like this, assuming we
123  * have all private keys. While this function does not need private keys, the passed
124  * keystore is used to look up public keys and redeemscripts by hash.
125  * Solvability is unrelated to whether we consider this output to be ours. */
126 bool IsSolvable(const CKeyStore& store, const CScript& script, bool fColdStaking);
127 
128 #endif // PIVX_SCRIPT_SIGN_H
int64_t CAmount
Amount in PIV (Can be negative)
Definition: amount.h:13
Virtual base class for signature creators.
Definition: sign.h:58
const CKeyStore & KeyStore() const
Definition: sign.h:64
virtual const BaseSignatureChecker & Checker() const =0
const CKeyStore * keystore
Definition: sign.h:60
virtual ~BaseSignatureCreator()
Definition: sign.h:65
BaseSignatureCreator(const CKeyStore *keystoreIn)
Definition: sign.h:63
virtual bool CreateSig(std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode, SigVersion sigversion) const =0
Create a singular (non-script) signature.
An encapsulated private key.
Definition: key.h:30
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:21
A virtual base class for key stores.
Definition: keystore.h:23
An encapsulated public key.
Definition: pubkey.h:44
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:381
A reference to a CScript: the Hash160 of its serialization (see script.h)
Definition: standard.h:24
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:244
A signature creator that just produces 72-byte empty signatyres.
Definition: sign.h:94
const BaseSignatureChecker & Checker() const
Definition: sign.cpp:362
DummySignatureCreator(const CKeyStore *keystoreIn)
Definition: sign.h:96
bool CreateSig(std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode, SigVersion sigversion) const
Create a singular (non-script) signature.
Definition: sign.cpp:367
MutableTransactionSignatureCreator(const CKeyStore *keystoreIn, const CMutableTransaction *txToIn, unsigned int nInIn, const CAmount &amount, int nHashTypeIn)
Definition: sign.h:90
const CTransaction tx
Definition: sign.h:87
bool GetCScript(const CScriptID &scriptid, CScript &script) const
Definition: sign.cpp:409
bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const
Definition: sign.cpp:414
const SigningProvider * m_provider
Definition: sign.h:36
PublicOnlySigningProvider(const SigningProvider *provider)
Definition: sign.h:39
An interface to be implemented by keystores that support signing.
Definition: sign.h:23
virtual ~SigningProvider()
Definition: sign.h:25
virtual bool GetCScript(const CScriptID &scriptid, CScript &script) const
Definition: sign.h:26
virtual bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const
Definition: sign.h:27
virtual bool GetKey(const CKeyID &address, CKey &key) const
Definition: sign.h:28
A signature creator for transactions.
Definition: sign.h:73
unsigned int nIn
Definition: sign.h:75
const TransactionSignatureChecker checker
Definition: sign.h:78
bool CreateSig(std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode, SigVersion sigversion) const
Create a singular (non-script) signature.
Definition: sign.cpp:21
const CTransaction * txTo
Definition: sign.h:74
TransactionSignatureCreator(const CKeyStore *keystoreIn, const CTransaction *txToIn, unsigned int nInIn, const CAmount &amountIn, int nHashTypeIn=SIGHASH_ALL)
Definition: sign.cpp:19
const BaseSignatureChecker & Checker() const
Definition: sign.h:82
@ SIGHASH_ALL
Definition: interpreter.h:24
enum ScriptError_t ScriptError
void UpdateTransaction(CMutableTransaction &tx, unsigned int nIn, const SignatureData &data)
Definition: sign.cpp:186
const SigningProvider & DUMMY_SIGNING_PROVIDER
FlatSigningProvider Merge(const FlatSigningProvider &a, const FlatSigningProvider &b)
Definition: sign.cpp:423
SignatureData DataFromTransaction(const CMutableTransaction &tx, unsigned int nIn)
Extract signature data from a transaction, and insert it.
Definition: sign.cpp:178
SignatureData CombineSignatures(const CScript &scriptPubKey, const BaseSignatureChecker &checker, const SignatureData &scriptSig1, const SignatureData &scriptSig2)
Combine two script signatures using a generic signature checker, intelligently, possibly with OP_0 pl...
Definition: sign.cpp:337
bool IsSolvable(const CKeyStore &store, const CScript &script, bool fColdStaking)
Definition: sign.cpp:394
bool SignSignature(const CKeyStore &keystore, const CScript &fromPubKey, CMutableTransaction &txTo, unsigned int nIn, const CAmount &amount, int nHashType, bool fColdStake=false)
Produce a script signature for a transaction.
Definition: sign.cpp:192
bool ProduceSignature(const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata, SigVersion sigversion, bool fColdStake, ScriptError *serror=nullptr)
Produce a script signature using a generic signature creator.
Definition: sign.cpp:153
A mutable version of CTransaction.
Definition: transaction.h:409
bool GetPubKey(const CKeyID &keyid, CPubKey &pubkey) const override
Definition: sign.cpp:420
bool GetKey(const CKeyID &keyid, CKey &key) const override
Definition: sign.cpp:421
std::map< CKeyID, CPubKey > pubkeys
Definition: sign.h:47
std::map< CKeyID, CKey > keys
Definition: sign.h:48
std::map< CScriptID, CScript > scripts
Definition: sign.h:46
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
Definition: sign.cpp:419
SignatureData()
Definition: sign.h:104
CScript scriptSig
Definition: sign.h:102
SignatureData(const CScript &script)
Definition: sign.h:105
SigVersion
Definition: transaction.h:26