1
- // Copyright (c) 2019 The Bitcoin Core developers
1
+ // Copyright (c) 2019-2022 The Bitcoin Core developers
2
2
// Distributed under the MIT software license, see the accompanying
3
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
4
@@ -172,8 +172,8 @@ Type ComputeType(Fragment fragment, Type x, Type y, Type z, const std::vector<Ty
172
172
(y & " B" _mst).If (x << " Bdu" _mst) | // B=B_y*B_x*d_x*u_x
173
173
(x & " o" _mst).If (y << " z" _mst) | // o=o_x*z_y
174
174
(x & y & " m" _mst).If (x << " e" _mst && (x | y) << " s" _mst) | // m=m_x*m_y*e_x*(s_x+s_y)
175
- (x & y & " zes " _mst) | // z=z_x*z_y, e=e_x*e_y , s=s_x*s_y
176
- (y & " ufd " _mst) | // u=u_y, f=f_y, d=d_y
175
+ (x & y & " zs " _mst) | // z=z_x*z_y, s=s_x*s_y
176
+ (y & " ufde " _mst) | // u=u_y, f=f_y, d=d_y, e=e_y
177
177
" x" _mst | // x
178
178
((x | y) & " ghij" _mst) | // g=g_x+g_y, h=h_x+h_y, i=i_x+i_y, j=j_x+j_y
179
179
(x & y & " k" _mst); // k=k_x*k_y
@@ -201,7 +201,7 @@ Type ComputeType(Fragment fragment, Type x, Type y, Type z, const std::vector<Ty
201
201
(y & z & " u" _mst) | // u=u_y*u_z
202
202
(z & " f" _mst).If ((x << " s" _mst) || (y << " f" _mst)) | // f=(s_x+f_y)*f_z
203
203
(z & " d" _mst) | // d=d_z
204
- (x & z & " e" _mst).If (x << " s" _mst || y << " f" _mst) | // e=e_x* e_z*(s_x+f_y)
204
+ (z & " e" _mst).If (x << " s" _mst || y << " f" _mst) | // e=e_z*(s_x+f_y)
205
205
(x & y & z & " m" _mst).If (x << " e" _mst && (x | y | z) << " s" _mst) | // m=m_x*m_y*m_z*e_x*(s_x+s_y+s_z)
206
206
(z & (x | y) & " s" _mst) | // s=s_z*(s_x+s_y)
207
207
" x" _mst | // x
@@ -245,7 +245,6 @@ Type ComputeType(Fragment fragment, Type x, Type y, Type z, const std::vector<Ty
245
245
}
246
246
}
247
247
assert (false );
248
- return " " _mst;
249
248
}
250
249
251
250
size_t ComputeScriptLen (Fragment fragment, Type sub0typ, size_t subsize, uint32_t k, size_t n_subs, size_t n_keys) {
@@ -260,7 +259,7 @@ size_t ComputeScriptLen(Fragment fragment, Type sub0typ, size_t subsize, uint32_
260
259
case Fragment::SHA256: return 4 + 2 + 33 ;
261
260
case Fragment::HASH160:
262
261
case Fragment::RIPEMD160: return 4 + 2 + 21 ;
263
- case Fragment::MULTI: return 3 + (n_keys > 16 ) + (k > 16 ) + 34 * n_keys;
262
+ case Fragment::MULTI: return 1 + BuildScript (n_keys). size () + BuildScript (k). size ( ) + 34 * n_keys;
264
263
case Fragment::AND_V: return subsize;
265
264
case Fragment::WRAP_V: return subsize + (sub0typ << " x" _mst);
266
265
case Fragment::WRAP_S:
@@ -278,10 +277,9 @@ size_t ComputeScriptLen(Fragment fragment, Type sub0typ, size_t subsize, uint32_
278
277
case Fragment::THRESH: return subsize + n_subs + BuildScript (k).size ();
279
278
}
280
279
assert (false );
281
- return 0 ;
282
280
}
283
281
284
- InputStack& InputStack::Available (Availability avail) {
282
+ InputStack& InputStack::SetAvailable (Availability avail) {
285
283
available = avail;
286
284
if (avail == Availability::NO) {
287
285
stack.clear ();
@@ -293,37 +291,37 @@ InputStack& InputStack::Available(Availability avail) {
293
291
return *this ;
294
292
}
295
293
296
- InputStack& InputStack::WithSig () {
294
+ InputStack& InputStack::SetWithSig () {
297
295
has_sig = true ;
298
296
return *this ;
299
297
}
300
298
301
- InputStack& InputStack::NonCanon () {
299
+ InputStack& InputStack::SetNonCanon () {
302
300
non_canon = true ;
303
301
return *this ;
304
302
}
305
303
306
- InputStack& InputStack::Malleable (bool x) {
304
+ InputStack& InputStack::SetMalleable (bool x) {
307
305
malleable = x;
308
306
return *this ;
309
307
}
310
308
311
309
InputStack operator +(InputStack a, InputStack b) {
312
310
a.stack = Cat (std::move (a.stack ), std::move (b.stack ));
313
- a.size += b.size ;
311
+ if (a. available != Availability::NO && b. available != Availability::NO) a.size += b.size ;
314
312
a.has_sig |= b.has_sig ;
315
313
a.malleable |= b.malleable ;
316
314
a.non_canon |= b.non_canon ;
317
315
if (a.available == Availability::NO || b.available == Availability::NO) {
318
- a.Available (Availability::NO);
316
+ a.SetAvailable (Availability::NO);
319
317
} else if (a.available == Availability::MAYBE || b.available == Availability::MAYBE) {
320
- a.Available (Availability::MAYBE);
318
+ a.SetAvailable (Availability::MAYBE);
321
319
}
322
320
return a;
323
321
}
324
322
325
323
InputStack operator |(InputStack a, InputStack b) {
326
- // If only one (or neither) is valid , pick the other one.
324
+ // If only one is invalid , pick the other one. If both are invalid, pick an arbitrary one.
327
325
if (a.available == Availability::NO) return b;
328
326
if (b.available == Availability::NO) return a;
329
327
// If only one of the solutions has a signature, we must pick the other one.
@@ -351,9 +349,9 @@ InputStack operator|(InputStack a, InputStack b) {
351
349
}
352
350
}
353
351
354
- std::optional<std::vector<std::pair<opcodetype, std::vector< unsigned char >> >> DecomposeScript (const CScript& script)
352
+ std::optional<std::vector<Opcode >> DecomposeScript (const CScript& script)
355
353
{
356
- std::vector<std::pair<opcodetype, std::vector< unsigned char >> > out;
354
+ std::vector<Opcode > out;
357
355
CScript::const_iterator it = script.begin (), itend = script.end ();
358
356
while (it != itend) {
359
357
std::vector<unsigned char > push_data;
@@ -387,7 +385,7 @@ std::optional<std::vector<std::pair<opcodetype, std::vector<unsigned char>>>> De
387
385
return out;
388
386
}
389
387
390
- std::optional<int64_t > ParseScriptNumber (const std::pair<opcodetype, std::vector< unsigned char >> & in) {
388
+ std::optional<int64_t > ParseScriptNumber (const Opcode & in) {
391
389
if (in.first == OP_0) {
392
390
return 0 ;
393
391
}
0 commit comments