17 typedef std::vector<unsigned char>
valtype;
19 TransactionSignatureCreator::TransactionSignatureCreator(
const CKeyStore* keystoreIn,
const CTransaction* txToIn,
unsigned int nInIn,
const CAmount& amountIn,
int nHashTypeIn) :
BaseSignatureCreator(keystoreIn), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {}
30 }
catch (
const std::logic_error& ex) {
34 if (!key.
Sign(hash, vchSig))
36 vchSig.push_back((
unsigned char)
nHashType);
42 std::vector<unsigned char> vchSig;
43 if (!creator.
CreateSig(vchSig, address, scriptCode, sigversion))
45 ret.emplace_back(vchSig);
52 int nRequired = multisigdata.front()[0];
53 for (
unsigned int i = 1; i < multisigdata.size()-1 && nSigned < nRequired; i++)
55 const valtype& pubkey = multisigdata[i];
57 if (Sign1(keyID, creator, scriptCode, ret, sigversion))
60 return nSigned==nRequired;
76 std::vector<valtype> vSolutions;
77 if (!
Solver(scriptPubKey, whichTypeRet, vSolutions))
88 return Sign1(keyID, creator, scriptPubKey, ret, sigversion);
92 if (!Sign1(keyID, creator, scriptPubKey, ret, sigversion))
103 ret.emplace_back(scriptRet.
begin(), scriptRet.
end());
110 return (SignN(vSolutions, creator, scriptPubKey, ret, sigversion));
120 if (!Sign1(keyID, creator, scriptPubKey, ret, sigversion))
121 return error(
"*** %s: failed to sign with the %s key.",
122 __func__, fColdStake ?
"cold staker" :
"owner");
125 return error(
"%s : Unable to get public key from keyID", __func__);
130 ret.emplace_back(oper);
134 LogPrintf(
"*** solver no case met \n");
138 static CScript PushAll(
const std::vector<valtype>& values)
141 for (
const valtype& v : values) {
144 }
else if (v.size() == 1 && v[0] >= 1 && v[0] <= 16) {
157 std::vector<valtype> result;
159 solved = SignStep(creator, script, result, whichType, sigversion, fColdStake);
167 script = subscript =
CScript(result[0].begin(), result[0].end());
168 solved = solved && SignStep(creator, script, result, whichType, sigversion, fColdStake) && whichType !=
TX_SCRIPTHASH;
169 result.emplace_back(subscript.
begin(), subscript.
end());
181 assert(tx.
vin.size() > nIn);
188 assert(tx.
vin.size() > nIn);
194 assert(nIn < txTo.
vin.size());
207 assert(nIn < txTo.
vin.size());
216 const std::vector<valtype>& vSolutions,
217 const std::vector<valtype>& sigs1,
const std::vector<valtype>& sigs2,
SigVersion sigversion)
220 std::set<valtype> allsigs;
233 assert(vSolutions.size() > 1);
234 unsigned int nSigsRequired = vSolutions.front()[0];
235 unsigned int nPubKeys = vSolutions.size()-2;
236 std::map<valtype, valtype> sigs;
237 for (
const valtype& sig : allsigs)
239 for (
unsigned int i = 0; i < nPubKeys; i++)
241 const valtype& pubkey = vSolutions[i+1];
242 if (sigs.count(pubkey))
245 if (checker.
CheckSig(sig, pubkey, scriptPubKey, sigversion))
253 unsigned int nSigsHave = 0;
255 for (
unsigned int i = 0; i < nPubKeys && nSigsHave < nSigsRequired; i++)
257 if (sigs.count(vSolutions[i+1]))
259 result.push_back(sigs[vSolutions[i+1]]);
264 for (
unsigned int i = nSigsHave; i < nSigsRequired; i++)
274 std::vector<valtype> script;
277 explicit Stacks(
const std::vector<valtype>& scriptSigStack_) : script(scriptSigStack_) {}
291 const txnouttype txType,
const std::vector<valtype>& vSolutions,
292 Stacks sigs1, Stacks sigs2,
SigVersion sigversion)
299 if (sigs1.script.size() >= sigs2.script.size())
307 if (sigs1.script.empty() || sigs1.script[0].empty())
311 if (sigs1.script.empty() || sigs1.script.back().empty())
313 else if (sigs2.script.empty() || sigs2.script.back().empty())
318 valtype spk = sigs1.script.back();
319 CScript pubKey2(spk.begin(), spk.end());
322 std::vector<std::vector<unsigned char> > vSolutions2;
323 Solver(pubKey2, txType2, vSolutions2);
324 sigs1.script.pop_back();
325 sigs2.script.pop_back();
326 Stacks result =
CombineSignatures(pubKey2, checker, txType2, vSolutions2, sigs1, sigs2, sigversion);
327 result.script.push_back(spk);
331 return Stacks(CombineMultisig(scriptPubKey, checker, vSolutions, sigs1.script, sigs2.script, sigversion));
341 std::vector<std::vector<unsigned char> > vSolutions;
342 Solver(scriptPubKey, txType, vSolutions);
352 DummySignatureChecker() {}
354 bool CheckSig(
const std::vector<unsigned char>& scriptSig,
const std::vector<unsigned char>& vchPubKey,
const CScript& scriptCode,
SigVersion sigversion)
const
359 const DummySignatureChecker dummyChecker;
370 vchSig.assign(72,
'\000');
376 vchSig[4 + 33] = 0x02;
378 vchSig[6 + 33] = 0x01;
383 template<
typename M,
typename K,
typename V>
386 auto it = map.find(key);
387 if (it != map.end()) {
int64_t CAmount
Amount in PIV (Can be negative)
virtual bool CheckSig(const std::vector< unsigned char > &scriptSig, const std::vector< unsigned char > &vchPubKey, const CScript &scriptCode, SigVersion sigversion) const
Virtual base class for signature creators.
const CKeyStore & KeyStore() const
virtual const BaseSignatureChecker & Checker() const =0
const CKeyStore * keystore
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.
bool Sign(const uint256 &hash, std::vector< unsigned char > &vchSig, uint32_t test_case=0) const
Create a DER-serialized signature.
A reference to a CKey: the Hash160 of its serialized public key.
A virtual base class for key stores.
virtual bool GetPubKey(const CKeyID &address, CPubKey &vchPubKeyOut) const =0
virtual bool GetKey(const CKeyID &address, CKey &keyOut) const =0
virtual bool GetCScript(const CScriptID &hash, CScript &redeemScriptOut) const =0
An encapsulated public key.
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
Serialized script, used inside transaction inputs and outputs.
static opcodetype EncodeOP_N(int n)
A reference to a CScript: the Hash160 of its serialization (see script.h)
The basic transaction that is broadcasted on the network and contained in blocks.
SigVersion GetRequiredSigVersion() const
std::vector< CTxOut > vout
An input of a transaction.
An output of a transaction.
A signature creator that just produces 72-byte empty signatyres.
const BaseSignatureChecker & Checker() const
bool CreateSig(std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode, SigVersion sigversion) const
Create a singular (non-script) signature.
bool GetCScript(const CScriptID &scriptid, CScript &script) const
bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const
const SigningProvider * m_provider
virtual bool GetCScript(const CScriptID &scriptid, CScript &script) const
virtual bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const
A signature creator for transactions.
bool CreateSig(std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode, SigVersion sigversion) const
Create a singular (non-script) signature.
const CTransaction * txTo
TransactionSignatureCreator(const CKeyStore *keystoreIn, const CTransaction *txToIn, unsigned int nInIn, const CAmount &amountIn, int nHashTypeIn=SIGHASH_ALL)
void emplace_back(Args &&... args)
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, unsigned int flags, const BaseSignatureChecker &checker, SigVersion sigversion, ScriptError *serror)
bool EvalScript(std::vector< std::vector< unsigned char > > &stack, const CScript &script, unsigned int flags, const BaseSignatureChecker &checker, SigVersion sigversion, ScriptError *serror)
uint256 SignatureHash(const CScript &scriptCode, const CTransaction &txTo, unsigned int nIn, int nHashType, const CAmount &amount, SigVersion sigversion, const PrecomputedTransactionData *cache)
std::vector< unsigned char > valtype
@ SCRIPT_VERIFY_STRICTENC
std::vector< unsigned char > ToByteVector(const T &in)
enum ScriptError_t ScriptError
void UpdateTransaction(CMutableTransaction &tx, unsigned int nIn, const SignatureData &data)
FlatSigningProvider Merge(const FlatSigningProvider &a, const FlatSigningProvider &b)
bool LookupHelper(const M &map, const K &key, V &value)
SignatureData DataFromTransaction(const CMutableTransaction &tx, unsigned int nIn)
Extract signature data from a transaction, and insert it.
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...
bool IsSolvable(const CKeyStore &store, const CScript &script, bool fColdStaking)
std::vector< unsigned char > valtype
bool SignSignature(const CKeyStore &keystore, const CScript &fromPubKey, CMutableTransaction &txTo, unsigned int nIn, const CAmount &amount, int nHashType, bool fColdStake)
Produce a script signature for a transaction.
bool ProduceSignature(const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata, SigVersion sigversion, bool fColdStake, ScriptError *serror)
Produce a script signature using a generic signature creator.
bool Solver(const CScript &scriptPubKey, txnouttype &typeRet, std::vector< std::vector< unsigned char > > &vSolutionsRet)
Parse a scriptPubKey and identify script type for standard scripts.
A mutable version of CTransaction.
bool GetPubKey(const CKeyID &keyid, CPubKey &pubkey) const override
bool GetKey(const CKeyID &keyid, CKey &key) const override
std::map< CKeyID, CPubKey > pubkeys
std::map< CKeyID, CKey > keys
std::map< CScriptID, CScript > scripts
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
bool error(const char *fmt, const Args &... args)