14
14
15
15
typedef std::vector<unsigned char > valtype;
16
16
17
- TransactionSignatureCreator::TransactionSignatureCreator (const SigningProvider* provider, const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn) : BaseSignatureCreator(provider), txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {}
17
+ TransactionSignatureCreator::TransactionSignatureCreator (const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, int nHashTypeIn) : txTo(txToIn), nIn(nInIn), nHashType(nHashTypeIn), amount(amountIn), checker(txTo, nIn, amountIn) {}
18
18
19
- bool TransactionSignatureCreator::CreateSig (std::vector<unsigned char >& vchSig, const CKeyID& address, const CScript& scriptCode, SigVersion sigversion) const
19
+ bool TransactionSignatureCreator::CreateSig (const SigningProvider& provider, std::vector<unsigned char >& vchSig, const CKeyID& address, const CScript& scriptCode, SigVersion sigversion) const
20
20
{
21
21
CKey key;
22
- if (!m_provider-> GetKey (address, key))
22
+ if (!provider. GetKey (address, key))
23
23
return false ;
24
24
25
25
// Signing with uncompressed keys is disabled in witness scripts
@@ -33,24 +33,24 @@ bool TransactionSignatureCreator::CreateSig(std::vector<unsigned char>& vchSig,
33
33
return true ;
34
34
}
35
35
36
- static bool Sign1 (const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion)
36
+ static bool Sign1 (const SigningProvider& provider, const CKeyID& address, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion)
37
37
{
38
38
std::vector<unsigned char > vchSig;
39
- if (!creator.CreateSig (vchSig, address, scriptCode, sigversion))
39
+ if (!creator.CreateSig (provider, vchSig, address, scriptCode, sigversion))
40
40
return false ;
41
41
ret.push_back (vchSig);
42
42
return true ;
43
43
}
44
44
45
- static bool SignN (const std::vector<valtype>& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion)
45
+ static bool SignN (const SigningProvider& provider, const std::vector<valtype>& multisigdata, const BaseSignatureCreator& creator, const CScript& scriptCode, std::vector<valtype>& ret, SigVersion sigversion)
46
46
{
47
47
int nSigned = 0 ;
48
48
int nRequired = multisigdata.front ()[0 ];
49
49
for (unsigned int i = 1 ; i < multisigdata.size ()-1 && nSigned < nRequired; i++)
50
50
{
51
51
const valtype& pubkey = multisigdata[i];
52
52
CKeyID keyID = CPubKey (pubkey).GetID ();
53
- if (Sign1 (keyID, creator, scriptCode, ret, sigversion))
53
+ if (Sign1 (provider, keyID, creator, scriptCode, ret, sigversion))
54
54
++nSigned;
55
55
}
56
56
return nSigned==nRequired;
@@ -62,7 +62,7 @@ static bool SignN(const std::vector<valtype>& multisigdata, const BaseSignatureC
62
62
* unless whichTypeRet is TX_SCRIPTHASH, in which case scriptSigRet is the redemption script.
63
63
* Returns false if scriptPubKey could not be completely satisfied.
64
64
*/
65
- static bool SignStep (const BaseSignatureCreator& creator, const CScript& scriptPubKey,
65
+ static bool SignStep (const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& scriptPubKey,
66
66
std::vector<valtype>& ret, txnouttype& whichTypeRet, SigVersion sigversion)
67
67
{
68
68
CScript scriptRet;
@@ -82,36 +82,36 @@ static bool SignStep(const BaseSignatureCreator& creator, const CScript& scriptP
82
82
return false ;
83
83
case TX_PUBKEY:
84
84
keyID = CPubKey (vSolutions[0 ]).GetID ();
85
- return Sign1 (keyID, creator, scriptPubKey, ret, sigversion);
85
+ return Sign1 (provider, keyID, creator, scriptPubKey, ret, sigversion);
86
86
case TX_PUBKEYHASH:
87
87
keyID = CKeyID (uint160 (vSolutions[0 ]));
88
- if (!Sign1 (keyID, creator, scriptPubKey, ret, sigversion))
88
+ if (!Sign1 (provider, keyID, creator, scriptPubKey, ret, sigversion))
89
89
return false ;
90
90
else
91
91
{
92
92
CPubKey vch;
93
- creator. Provider () .GetPubKey (keyID, vch);
93
+ provider .GetPubKey (keyID, vch);
94
94
ret.push_back (ToByteVector (vch));
95
95
}
96
96
return true ;
97
97
case TX_SCRIPTHASH:
98
- if (creator. Provider () .GetCScript (uint160 (vSolutions[0 ]), scriptRet)) {
98
+ if (provider .GetCScript (uint160 (vSolutions[0 ]), scriptRet)) {
99
99
ret.push_back (std::vector<unsigned char >(scriptRet.begin (), scriptRet.end ()));
100
100
return true ;
101
101
}
102
102
return false ;
103
103
104
104
case TX_MULTISIG:
105
105
ret.push_back (valtype ()); // workaround CHECKMULTISIG bug
106
- return (SignN (vSolutions, creator, scriptPubKey, ret, sigversion));
106
+ return (SignN (provider, vSolutions, creator, scriptPubKey, ret, sigversion));
107
107
108
108
case TX_WITNESS_V0_KEYHASH:
109
109
ret.push_back (vSolutions[0 ]);
110
110
return true ;
111
111
112
112
case TX_WITNESS_V0_SCRIPTHASH:
113
113
CRIPEMD160 ().Write (&vSolutions[0 ][0 ], vSolutions[0 ].size ()).Finalize (h160.begin ());
114
- if (creator. Provider () .GetCScript (h160, scriptRet)) {
114
+ if (provider .GetCScript (h160, scriptRet)) {
115
115
ret.push_back (std::vector<unsigned char >(scriptRet.begin (), scriptRet.end ()));
116
116
return true ;
117
117
}
@@ -137,11 +137,11 @@ static CScript PushAll(const std::vector<valtype>& values)
137
137
return result;
138
138
}
139
139
140
- bool ProduceSignature (const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata)
140
+ bool ProduceSignature (const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& fromPubKey, SignatureData& sigdata)
141
141
{
142
142
std::vector<valtype> result;
143
143
txnouttype whichType;
144
- bool solved = SignStep (creator, fromPubKey, result, whichType, SigVersion::BASE);
144
+ bool solved = SignStep (provider, creator, fromPubKey, result, whichType, SigVersion::BASE);
145
145
bool P2SH = false ;
146
146
CScript subscript;
147
147
sigdata.scriptWitness .stack .clear ();
@@ -152,7 +152,7 @@ bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPu
152
152
// the final scriptSig is the signatures from that
153
153
// and then the serialized subscript:
154
154
subscript = CScript (result[0 ].begin (), result[0 ].end ());
155
- solved = solved && SignStep (creator, subscript, result, whichType, SigVersion::BASE) && whichType != TX_SCRIPTHASH;
155
+ solved = solved && SignStep (provider, creator, subscript, result, whichType, SigVersion::BASE) && whichType != TX_SCRIPTHASH;
156
156
P2SH = true ;
157
157
}
158
158
@@ -161,15 +161,15 @@ bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& fromPu
161
161
CScript witnessscript;
162
162
witnessscript << OP_DUP << OP_HASH160 << ToByteVector (result[0 ]) << OP_EQUALVERIFY << OP_CHECKSIG;
163
163
txnouttype subType;
164
- solved = solved && SignStep (creator, witnessscript, result, subType, SigVersion::WITNESS_V0);
164
+ solved = solved && SignStep (provider, creator, witnessscript, result, subType, SigVersion::WITNESS_V0);
165
165
sigdata.scriptWitness .stack = result;
166
166
result.clear ();
167
167
}
168
168
else if (solved && whichType == TX_WITNESS_V0_SCRIPTHASH)
169
169
{
170
170
CScript witnessscript (result[0 ].begin (), result[0 ].end ());
171
171
txnouttype subType;
172
- solved = solved && SignStep (creator, witnessscript, result, subType, SigVersion::WITNESS_V0) && subType != TX_SCRIPTHASH && subType != TX_WITNESS_V0_SCRIPTHASH && subType != TX_WITNESS_V0_KEYHASH;
172
+ solved = solved && SignStep (provider, creator, witnessscript, result, subType, SigVersion::WITNESS_V0) && subType != TX_SCRIPTHASH && subType != TX_WITNESS_V0_SCRIPTHASH && subType != TX_WITNESS_V0_KEYHASH;
173
173
result.push_back (std::vector<unsigned char >(witnessscript.begin (), witnessscript.end ()));
174
174
sigdata.scriptWitness .stack = result;
175
175
result.clear ();
@@ -210,10 +210,10 @@ bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, C
210
210
assert (nIn < txTo.vin .size ());
211
211
212
212
CTransaction txToConst (txTo);
213
- TransactionSignatureCreator creator (&provider, & txToConst, nIn, amount, nHashType);
213
+ TransactionSignatureCreator creator (&txToConst, nIn, amount, nHashType);
214
214
215
215
SignatureData sigdata;
216
- bool ret = ProduceSignature (creator, fromPubKey, sigdata);
216
+ bool ret = ProduceSignature (provider, creator, fromPubKey, sigdata);
217
217
UpdateTransaction (txTo, nIn, sigdata);
218
218
return ret;
219
219
}
@@ -392,54 +392,51 @@ SignatureData CombineSignatures(const CScript& scriptPubKey, const BaseSignature
392
392
393
393
namespace {
394
394
/* * Dummy signature checker which accepts all signatures. */
395
- class DummySignatureChecker : public BaseSignatureChecker
395
+ class DummySignatureChecker final : public BaseSignatureChecker
396
396
{
397
397
public:
398
398
DummySignatureChecker () {}
399
+ bool CheckSig (const std::vector<unsigned char >& scriptSig, const std::vector<unsigned char >& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const override { return true ; }
400
+ };
401
+ const DummySignatureChecker DUMMY_CHECKER;
399
402
400
- bool CheckSig (const std::vector<unsigned char >& scriptSig, const std::vector<unsigned char >& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const override
403
+ class DummySignatureCreator final : public BaseSignatureCreator {
404
+ public:
405
+ DummySignatureCreator () {}
406
+ const BaseSignatureChecker& Checker () const override { return DUMMY_CHECKER; }
407
+ bool CreateSig (const SigningProvider& provider, std::vector<unsigned char >& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const override
401
408
{
409
+ // Create a dummy signature that is a valid DER-encoding
410
+ vchSig.assign (72 , ' \000 ' );
411
+ vchSig[0 ] = 0x30 ;
412
+ vchSig[1 ] = 69 ;
413
+ vchSig[2 ] = 0x02 ;
414
+ vchSig[3 ] = 33 ;
415
+ vchSig[4 ] = 0x01 ;
416
+ vchSig[4 + 33 ] = 0x02 ;
417
+ vchSig[5 + 33 ] = 32 ;
418
+ vchSig[6 + 33 ] = 0x01 ;
419
+ vchSig[6 + 33 + 32 ] = SIGHASH_ALL;
402
420
return true ;
403
421
}
404
422
};
405
- const DummySignatureChecker dummyChecker;
406
- } // namespace
407
-
408
- const BaseSignatureChecker& DummySignatureCreator::Checker () const
409
- {
410
- return dummyChecker;
411
423
}
412
424
413
- bool DummySignatureCreator::CreateSig (std::vector<unsigned char >& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const
414
- {
415
- // Create a dummy signature that is a valid DER-encoding
416
- vchSig.assign (72 , ' \000 ' );
417
- vchSig[0 ] = 0x30 ;
418
- vchSig[1 ] = 69 ;
419
- vchSig[2 ] = 0x02 ;
420
- vchSig[3 ] = 33 ;
421
- vchSig[4 ] = 0x01 ;
422
- vchSig[4 + 33 ] = 0x02 ;
423
- vchSig[5 + 33 ] = 32 ;
424
- vchSig[6 + 33 ] = 0x01 ;
425
- vchSig[6 + 33 + 32 ] = SIGHASH_ALL;
426
- return true ;
427
- }
425
+ const BaseSignatureCreator& DUMMY_SIGNATURE_CREATOR = DummySignatureCreator();
428
426
429
427
bool IsSolvable (const SigningProvider& provider, const CScript& script)
430
428
{
431
429
// This check is to make sure that the script we created can actually be solved for and signed by us
432
430
// if we were to have the private keys. This is just to make sure that the script is valid and that,
433
431
// if found in a transaction, we would still accept and relay that transaction. In particular,
434
432
// it will reject witness outputs that require signing with an uncompressed public key.
435
- DummySignatureCreator creator (&provider);
436
433
SignatureData sigs;
437
434
// Make sure that STANDARD_SCRIPT_VERIFY_FLAGS includes SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, the most
438
435
// important property this function is designed to test for.
439
436
static_assert (STANDARD_SCRIPT_VERIFY_FLAGS & SCRIPT_VERIFY_WITNESS_PUBKEYTYPE, " IsSolvable requires standard script flags to include WITNESS_PUBKEYTYPE" );
440
- if (ProduceSignature (creator , script, sigs)) {
437
+ if (ProduceSignature (provider, DUMMY_SIGNATURE_CREATOR , script, sigs)) {
441
438
// VerifyScript check is just defensive, and should never fail.
442
- assert (VerifyScript (sigs.scriptSig , script, &sigs.scriptWitness , STANDARD_SCRIPT_VERIFY_FLAGS, creator. Checker () ));
439
+ assert (VerifyScript (sigs.scriptSig , script, &sigs.scriptWitness , STANDARD_SCRIPT_VERIFY_FLAGS, DUMMY_CHECKER ));
443
440
return true ;
444
441
}
445
442
return false ;
0 commit comments