/bitcoin/src/script/script.h
Line | Count | Source |
1 | | // Copyright (c) 2009-2010 Satoshi Nakamoto |
2 | | // Copyright (c) 2009-present The Bitcoin Core developers |
3 | | // Distributed under the MIT software license, see the accompanying |
4 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
5 | | |
6 | | #ifndef BITCOIN_SCRIPT_SCRIPT_H |
7 | | #define BITCOIN_SCRIPT_SCRIPT_H |
8 | | |
9 | | #include <attributes.h> |
10 | | #include <crypto/common.h> |
11 | | #include <prevector.h> |
12 | | #include <serialize.h> |
13 | | #include <uint256.h> |
14 | | #include <util/hash_type.h> |
15 | | |
16 | | #include <cassert> |
17 | | #include <cstddef> |
18 | | #include <cstdint> |
19 | | #include <iterator> |
20 | | #include <limits> |
21 | | #include <span> |
22 | | #include <stdexcept> |
23 | | #include <string> |
24 | | #include <type_traits> |
25 | | #include <utility> |
26 | | #include <vector> |
27 | | |
28 | | // Maximum number of bytes pushable to the stack |
29 | | static const unsigned int MAX_SCRIPT_ELEMENT_SIZE = 520; |
30 | | |
31 | | // Maximum number of non-push operations per script |
32 | | static const int MAX_OPS_PER_SCRIPT = 201; |
33 | | |
34 | | // Maximum number of public keys per multisig |
35 | | static const int MAX_PUBKEYS_PER_MULTISIG = 20; |
36 | | |
37 | | /** The limit of keys in OP_CHECKSIGADD-based scripts. It is due to the stack limit in BIP342. */ |
38 | | static constexpr unsigned int MAX_PUBKEYS_PER_MULTI_A = 999; |
39 | | |
40 | | // Maximum script length in bytes |
41 | | static const int MAX_SCRIPT_SIZE = 10000; |
42 | | |
43 | | // Maximum number of values on script interpreter stack |
44 | | static const int MAX_STACK_SIZE = 1000; |
45 | | |
46 | | // Threshold for nLockTime: below this value it is interpreted as block number, |
47 | | // otherwise as UNIX timestamp. |
48 | | static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC |
49 | | |
50 | | // Maximum nLockTime. Since a lock time indicates the last invalid timestamp, a |
51 | | // transaction with this lock time will never be valid unless lock time |
52 | | // checking is disabled (by setting all input sequence numbers to |
53 | | // SEQUENCE_FINAL). |
54 | | static const uint32_t LOCKTIME_MAX = 0xFFFFFFFFU; |
55 | | |
56 | | // Tag for input annex. If there are at least two witness elements for a transaction input, |
57 | | // and the first byte of the last element is 0x50, this last element is called annex, and |
58 | | // has meanings independent of the script |
59 | | static constexpr unsigned int ANNEX_TAG = 0x50; |
60 | | |
61 | | // Validation weight per passing signature (Tapscript only, see BIP 342). |
62 | | static constexpr int64_t VALIDATION_WEIGHT_PER_SIGOP_PASSED{50}; |
63 | | |
64 | | // How much weight budget is added to the witness size (Tapscript only, see BIP 342). |
65 | | static constexpr int64_t VALIDATION_WEIGHT_OFFSET{50}; |
66 | | |
67 | | template <typename T> |
68 | | std::vector<unsigned char> ToByteVector(const T& in) |
69 | 0 | { |
70 | 0 | return std::vector<unsigned char>(in.begin(), in.end()); |
71 | 0 | } Unexecuted instantiation: std::vector<unsigned char, std::allocator<unsigned char> > ToByteVector<XOnlyPubKey>(XOnlyPubKey const&) Unexecuted instantiation: std::vector<unsigned char, std::allocator<unsigned char> > ToByteVector<CPubKey>(CPubKey const&) Unexecuted instantiation: std::vector<unsigned char, std::allocator<unsigned char> > ToByteVector<PKHash>(PKHash const&) Unexecuted instantiation: std::vector<unsigned char, std::allocator<unsigned char> > ToByteVector<ScriptHash>(ScriptHash const&) Unexecuted instantiation: std::vector<unsigned char, std::allocator<unsigned char> > ToByteVector<WitnessV0ScriptHash>(WitnessV0ScriptHash const&) Unexecuted instantiation: std::vector<unsigned char, std::allocator<unsigned char> > ToByteVector<WitnessV0KeyHash>(WitnessV0KeyHash const&) Unexecuted instantiation: std::vector<unsigned char, std::allocator<unsigned char> > ToByteVector<WitnessV1Taproot>(WitnessV1Taproot const&) Unexecuted instantiation: std::vector<unsigned char, std::allocator<unsigned char> > ToByteVector<std::vector<unsigned char, std::allocator<unsigned char> > >(std::vector<unsigned char, std::allocator<unsigned char> > const&) |
72 | | |
73 | | /** Script opcodes */ |
74 | | enum opcodetype |
75 | | { |
76 | | // push value |
77 | | OP_0 = 0x00, |
78 | | OP_FALSE = OP_0, |
79 | | OP_PUSHDATA1 = 0x4c, |
80 | | OP_PUSHDATA2 = 0x4d, |
81 | | OP_PUSHDATA4 = 0x4e, |
82 | | OP_1NEGATE = 0x4f, |
83 | | OP_RESERVED = 0x50, |
84 | | OP_1 = 0x51, |
85 | | OP_TRUE=OP_1, |
86 | | OP_2 = 0x52, |
87 | | OP_3 = 0x53, |
88 | | OP_4 = 0x54, |
89 | | OP_5 = 0x55, |
90 | | OP_6 = 0x56, |
91 | | OP_7 = 0x57, |
92 | | OP_8 = 0x58, |
93 | | OP_9 = 0x59, |
94 | | OP_10 = 0x5a, |
95 | | OP_11 = 0x5b, |
96 | | OP_12 = 0x5c, |
97 | | OP_13 = 0x5d, |
98 | | OP_14 = 0x5e, |
99 | | OP_15 = 0x5f, |
100 | | OP_16 = 0x60, |
101 | | |
102 | | // control |
103 | | OP_NOP = 0x61, |
104 | | OP_VER = 0x62, |
105 | | OP_IF = 0x63, |
106 | | OP_NOTIF = 0x64, |
107 | | OP_VERIF = 0x65, |
108 | | OP_VERNOTIF = 0x66, |
109 | | OP_ELSE = 0x67, |
110 | | OP_ENDIF = 0x68, |
111 | | OP_VERIFY = 0x69, |
112 | | OP_RETURN = 0x6a, |
113 | | |
114 | | // stack ops |
115 | | OP_TOALTSTACK = 0x6b, |
116 | | OP_FROMALTSTACK = 0x6c, |
117 | | OP_2DROP = 0x6d, |
118 | | OP_2DUP = 0x6e, |
119 | | OP_3DUP = 0x6f, |
120 | | OP_2OVER = 0x70, |
121 | | OP_2ROT = 0x71, |
122 | | OP_2SWAP = 0x72, |
123 | | OP_IFDUP = 0x73, |
124 | | OP_DEPTH = 0x74, |
125 | | OP_DROP = 0x75, |
126 | | OP_DUP = 0x76, |
127 | | OP_NIP = 0x77, |
128 | | OP_OVER = 0x78, |
129 | | OP_PICK = 0x79, |
130 | | OP_ROLL = 0x7a, |
131 | | OP_ROT = 0x7b, |
132 | | OP_SWAP = 0x7c, |
133 | | OP_TUCK = 0x7d, |
134 | | |
135 | | // splice ops |
136 | | OP_CAT = 0x7e, |
137 | | OP_SUBSTR = 0x7f, |
138 | | OP_LEFT = 0x80, |
139 | | OP_RIGHT = 0x81, |
140 | | OP_SIZE = 0x82, |
141 | | |
142 | | // bit logic |
143 | | OP_INVERT = 0x83, |
144 | | OP_AND = 0x84, |
145 | | OP_OR = 0x85, |
146 | | OP_XOR = 0x86, |
147 | | OP_EQUAL = 0x87, |
148 | | OP_EQUALVERIFY = 0x88, |
149 | | OP_RESERVED1 = 0x89, |
150 | | OP_RESERVED2 = 0x8a, |
151 | | |
152 | | // numeric |
153 | | OP_1ADD = 0x8b, |
154 | | OP_1SUB = 0x8c, |
155 | | OP_2MUL = 0x8d, |
156 | | OP_2DIV = 0x8e, |
157 | | OP_NEGATE = 0x8f, |
158 | | OP_ABS = 0x90, |
159 | | OP_NOT = 0x91, |
160 | | OP_0NOTEQUAL = 0x92, |
161 | | |
162 | | OP_ADD = 0x93, |
163 | | OP_SUB = 0x94, |
164 | | OP_MUL = 0x95, |
165 | | OP_DIV = 0x96, |
166 | | OP_MOD = 0x97, |
167 | | OP_LSHIFT = 0x98, |
168 | | OP_RSHIFT = 0x99, |
169 | | |
170 | | OP_BOOLAND = 0x9a, |
171 | | OP_BOOLOR = 0x9b, |
172 | | OP_NUMEQUAL = 0x9c, |
173 | | OP_NUMEQUALVERIFY = 0x9d, |
174 | | OP_NUMNOTEQUAL = 0x9e, |
175 | | OP_LESSTHAN = 0x9f, |
176 | | OP_GREATERTHAN = 0xa0, |
177 | | OP_LESSTHANOREQUAL = 0xa1, |
178 | | OP_GREATERTHANOREQUAL = 0xa2, |
179 | | OP_MIN = 0xa3, |
180 | | OP_MAX = 0xa4, |
181 | | |
182 | | OP_WITHIN = 0xa5, |
183 | | |
184 | | // crypto |
185 | | OP_RIPEMD160 = 0xa6, |
186 | | OP_SHA1 = 0xa7, |
187 | | OP_SHA256 = 0xa8, |
188 | | OP_HASH160 = 0xa9, |
189 | | OP_HASH256 = 0xaa, |
190 | | OP_CODESEPARATOR = 0xab, |
191 | | OP_CHECKSIG = 0xac, |
192 | | OP_CHECKSIGVERIFY = 0xad, |
193 | | OP_CHECKMULTISIG = 0xae, |
194 | | OP_CHECKMULTISIGVERIFY = 0xaf, |
195 | | |
196 | | // expansion |
197 | | OP_NOP1 = 0xb0, |
198 | | OP_CHECKLOCKTIMEVERIFY = 0xb1, |
199 | | OP_NOP2 = OP_CHECKLOCKTIMEVERIFY, |
200 | | OP_CHECKSEQUENCEVERIFY = 0xb2, |
201 | | OP_NOP3 = OP_CHECKSEQUENCEVERIFY, |
202 | | OP_NOP4 = 0xb3, |
203 | | OP_NOP5 = 0xb4, |
204 | | OP_NOP6 = 0xb5, |
205 | | OP_NOP7 = 0xb6, |
206 | | OP_NOP8 = 0xb7, |
207 | | OP_NOP9 = 0xb8, |
208 | | OP_NOP10 = 0xb9, |
209 | | |
210 | | // Opcode added by BIP 342 (Tapscript) |
211 | | OP_CHECKSIGADD = 0xba, |
212 | | |
213 | | OP_INVALIDOPCODE = 0xff, |
214 | | }; |
215 | | |
216 | | // Maximum value that an opcode can be |
217 | | static const unsigned int MAX_OPCODE = OP_NOP10; |
218 | | |
219 | | std::string GetOpName(opcodetype opcode); |
220 | | |
221 | | class scriptnum_error : public std::runtime_error |
222 | | { |
223 | | public: |
224 | 783 | explicit scriptnum_error(const std::string& str) : std::runtime_error(str) {} |
225 | | }; |
226 | | |
227 | | class CScriptNum |
228 | | { |
229 | | /** |
230 | | * Numeric opcodes (OP_1ADD, etc) are restricted to operating on 4-byte integers. |
231 | | * The semantics are subtle, though: operands must be in the range [-2^31 +1...2^31 -1], |
232 | | * but results may overflow (and are valid as long as they are not used in a subsequent |
233 | | * numeric operation). CScriptNum enforces those semantics by storing results as |
234 | | * an int64 and allowing out-of-range values to be returned as a vector of bytes but |
235 | | * throwing an exception if arithmetic is done or the result is interpreted as an integer. |
236 | | */ |
237 | | public: |
238 | | |
239 | | explicit CScriptNum(const int64_t& n) |
240 | 1.03M | { |
241 | 1.03M | m_value = n; |
242 | 1.03M | } |
243 | | |
244 | | static const size_t nDefaultMaxNumSize = 4; |
245 | | |
246 | | explicit CScriptNum(const std::vector<unsigned char>& vch, bool fRequireMinimal, |
247 | | const size_t nMaxNumSize = nDefaultMaxNumSize) |
248 | 14.6k | { |
249 | 14.6k | if (vch.size() > nMaxNumSize) { Branch (249:13): [True: 598, False: 14.0k]
|
250 | 598 | throw scriptnum_error("script number overflow"); |
251 | 598 | } |
252 | 14.0k | if (fRequireMinimal && vch.size() > 0) { Branch (252:13): [True: 12.0k, False: 1.98k]
Branch (252:32): [True: 7.92k, False: 4.12k]
|
253 | | // Check that the number is encoded with the minimum possible |
254 | | // number of bytes. |
255 | | // |
256 | | // If the most-significant-byte - excluding the sign bit - is zero |
257 | | // then we're not minimal. Note how this test also rejects the |
258 | | // negative-zero encoding, 0x80. |
259 | 7.92k | if ((vch.back() & 0x7f) == 0) { Branch (259:17): [True: 386, False: 7.53k]
|
260 | | // One exception: if there's more than one byte and the most |
261 | | // significant bit of the second-most-significant-byte is set |
262 | | // it would conflict with the sign bit. An example of this case |
263 | | // is +-255, which encode to 0xff00 and 0xff80 respectively. |
264 | | // (big-endian). |
265 | 386 | if (vch.size() <= 1 || (vch[vch.size() - 2] & 0x80) == 0) { Branch (265:21): [True: 61, False: 325]
Branch (265:40): [True: 124, False: 201]
|
266 | 185 | throw scriptnum_error("non-minimally encoded script number"); |
267 | 185 | } |
268 | 386 | } |
269 | 7.92k | } |
270 | 13.8k | m_value = set_vch(vch); |
271 | 13.8k | } |
272 | | |
273 | 2.99k | inline bool operator==(const int64_t& rhs) const { return m_value == rhs; } |
274 | 3.67k | inline auto operator<=>(const int64_t& rhs) const { return m_value <=> rhs; } |
275 | | |
276 | 2.85k | inline bool operator==(const CScriptNum& rhs) const { return operator==(rhs.m_value); } |
277 | 2.95k | inline auto operator<=>(const CScriptNum& rhs) const { return operator<=>(rhs.m_value); } |
278 | | |
279 | 126 | inline CScriptNum operator+( const int64_t& rhs) const { return CScriptNum(m_value + rhs);} |
280 | 355 | inline CScriptNum operator-( const int64_t& rhs) const { return CScriptNum(m_value - rhs);} |
281 | 126 | inline CScriptNum operator+( const CScriptNum& rhs) const { return operator+(rhs.m_value); } |
282 | 355 | inline CScriptNum operator-( const CScriptNum& rhs) const { return operator-(rhs.m_value); } |
283 | | |
284 | 661 | inline CScriptNum& operator+=( const CScriptNum& rhs) { return operator+=(rhs.m_value); } |
285 | 454 | inline CScriptNum& operator-=( const CScriptNum& rhs) { return operator-=(rhs.m_value); } |
286 | | |
287 | 143 | inline CScriptNum operator&( const int64_t& rhs) const { return CScriptNum(m_value & rhs);} |
288 | 0 | inline CScriptNum operator&( const CScriptNum& rhs) const { return operator&(rhs.m_value); } |
289 | | |
290 | 0 | inline CScriptNum& operator&=( const CScriptNum& rhs) { return operator&=(rhs.m_value); } |
291 | | |
292 | | inline CScriptNum operator-() const |
293 | 665 | { |
294 | 665 | assert(m_value != std::numeric_limits<int64_t>::min()); Branch (294:9): [True: 665, False: 0]
|
295 | 665 | return CScriptNum(-m_value); |
296 | 665 | } |
297 | | |
298 | | inline CScriptNum& operator=( const int64_t& rhs) |
299 | 3.75k | { |
300 | 3.75k | m_value = rhs; |
301 | 3.75k | return *this; |
302 | 3.75k | } |
303 | | |
304 | | inline CScriptNum& operator+=( const int64_t& rhs) |
305 | 661 | { |
306 | 661 | assert(rhs == 0 || (rhs > 0 && m_value <= std::numeric_limits<int64_t>::max() - rhs) || Branch (306:9): [True: 661, False: 0]
Branch (306:9): [True: 661, False: 0]
Branch (306:9): [True: 0, False: 661]
Branch (306:9): [True: 0, False: 0]
Branch (306:9): [True: 0, False: 0]
Branch (306:9): [True: 661, False: 0]
|
307 | 661 | (rhs < 0 && m_value >= std::numeric_limits<int64_t>::min() - rhs)); |
308 | 661 | m_value += rhs; |
309 | 661 | return *this; |
310 | 661 | } |
311 | | |
312 | | inline CScriptNum& operator-=( const int64_t& rhs) |
313 | 454 | { |
314 | 454 | assert(rhs == 0 || (rhs > 0 && m_value >= std::numeric_limits<int64_t>::min() + rhs) || Branch (314:9): [True: 454, False: 0]
Branch (314:9): [True: 454, False: 0]
Branch (314:9): [True: 0, False: 454]
Branch (314:9): [True: 0, False: 0]
Branch (314:9): [True: 0, False: 0]
Branch (314:9): [True: 454, False: 0]
|
315 | 454 | (rhs < 0 && m_value <= std::numeric_limits<int64_t>::max() + rhs)); |
316 | 454 | m_value -= rhs; |
317 | 454 | return *this; |
318 | 454 | } |
319 | | |
320 | | inline CScriptNum& operator&=( const int64_t& rhs) |
321 | 0 | { |
322 | 0 | m_value &= rhs; |
323 | 0 | return *this; |
324 | 0 | } |
325 | | |
326 | | int getint() const |
327 | 2.27k | { |
328 | 2.27k | if (m_value > std::numeric_limits<int>::max()) Branch (328:13): [True: 0, False: 2.27k]
|
329 | 0 | return std::numeric_limits<int>::max(); |
330 | 2.27k | else if (m_value < std::numeric_limits<int>::min()) Branch (330:18): [True: 0, False: 2.27k]
|
331 | 0 | return std::numeric_limits<int>::min(); |
332 | 2.27k | return m_value; |
333 | 2.27k | } |
334 | | |
335 | 0 | int64_t GetInt64() const { return m_value; } |
336 | | |
337 | | std::vector<unsigned char> getvch() const |
338 | 963k | { |
339 | 963k | return serialize(m_value); |
340 | 963k | } |
341 | | |
342 | | static std::vector<unsigned char> serialize(const int64_t& value) |
343 | 1.03M | { |
344 | 1.03M | if(value == 0) Branch (344:12): [True: 2.88k, False: 1.03M]
|
345 | 2.88k | return std::vector<unsigned char>(); |
346 | | |
347 | 1.03M | std::vector<unsigned char> result; |
348 | 1.03M | const bool neg = value < 0; |
349 | 1.03M | uint64_t absvalue = neg ? ~static_cast<uint64_t>(value) + 1 : static_cast<uint64_t>(value); Branch (349:29): [True: 2.51k, False: 1.02M]
|
350 | | |
351 | 2.06M | while(absvalue) Branch (351:15): [True: 1.03M, False: 1.03M]
|
352 | 1.03M | { |
353 | 1.03M | result.push_back(absvalue & 0xff); |
354 | 1.03M | absvalue >>= 8; |
355 | 1.03M | } |
356 | | |
357 | | // - If the most significant byte is >= 0x80 and the value is positive, push a |
358 | | // new zero-byte to make the significant byte < 0x80 again. |
359 | | |
360 | | // - If the most significant byte is >= 0x80 and the value is negative, push a |
361 | | // new 0x80 byte that will be popped off when converting to an integral. |
362 | | |
363 | | // - If the most significant byte is < 0x80 and the value is negative, add |
364 | | // 0x80 to it, since it will be subtracted and interpreted as a negative when |
365 | | // converting to an integral. |
366 | | |
367 | 1.03M | if (result.back() & 0x80) Branch (367:13): [True: 71.1k, False: 960k]
|
368 | 71.1k | result.push_back(neg ? 0x80 : 0); Branch (368:30): [True: 77, False: 71.0k]
|
369 | 960k | else if (neg) Branch (369:18): [True: 2.44k, False: 958k]
|
370 | 2.44k | result.back() |= 0x80; |
371 | | |
372 | 1.03M | return result; |
373 | 1.03M | } |
374 | | |
375 | | private: |
376 | | static int64_t set_vch(const std::vector<unsigned char>& vch) |
377 | 13.8k | { |
378 | 13.8k | if (vch.empty()) Branch (378:11): [True: 4.63k, False: 9.21k]
|
379 | 4.63k | return 0; |
380 | | |
381 | 9.21k | int64_t result = 0; |
382 | 21.4k | for (size_t i = 0; i != vch.size(); ++i) Branch (382:26): [True: 12.2k, False: 9.21k]
|
383 | 12.2k | result |= static_cast<int64_t>(vch[i]) << 8*i; |
384 | | |
385 | | // If the input vector's most significant byte is 0x80, remove it from |
386 | | // the result's msb and return a negative. |
387 | 9.21k | if (vch.back() & 0x80) Branch (387:11): [True: 1.65k, False: 7.56k]
|
388 | 1.65k | return -((int64_t)(result & ~(0x80ULL << (8 * (vch.size() - 1))))); |
389 | | |
390 | 7.56k | return result; |
391 | 9.21k | } |
392 | | |
393 | | int64_t m_value; |
394 | | }; |
395 | | |
396 | | /** |
397 | | * We use a prevector for the script to reduce the considerable memory overhead |
398 | | * of vectors in cases where they normally contain a small number of small elements. |
399 | | */ |
400 | | using CScriptBase = prevector<36, uint8_t>; |
401 | | |
402 | | bool GetScriptOp(CScriptBase::const_iterator& pc, CScriptBase::const_iterator end, opcodetype& opcodeRet, std::vector<unsigned char>* pvchRet); |
403 | | |
404 | | /** Serialized script, used inside transaction inputs and outputs */ |
405 | | class CScript : public CScriptBase |
406 | | { |
407 | | private: |
408 | | inline void AppendDataSize(const uint32_t size) |
409 | 76.0k | { |
410 | 76.0k | if (size < OP_PUSHDATA1) { Branch (410:13): [True: 75.9k, False: 90]
|
411 | 75.9k | insert(end(), static_cast<value_type>(size)); |
412 | 75.9k | } else if (size <= 0xff) { Branch (412:20): [True: 48, False: 42]
|
413 | 48 | insert(end(), OP_PUSHDATA1); |
414 | 48 | insert(end(), static_cast<value_type>(size)); |
415 | 48 | } else if (size <= 0xffff) { Branch (415:20): [True: 42, False: 0]
|
416 | 42 | insert(end(), OP_PUSHDATA2); |
417 | 42 | value_type data[2]; |
418 | 42 | WriteLE16(data, size); |
419 | 42 | insert(end(), std::cbegin(data), std::cend(data)); |
420 | 42 | } else { |
421 | 0 | insert(end(), OP_PUSHDATA4); |
422 | 0 | value_type data[4]; |
423 | 0 | WriteLE32(data, size); |
424 | 0 | insert(end(), std::cbegin(data), std::cend(data)); |
425 | 0 | } |
426 | 76.0k | } |
427 | | |
428 | | void AppendData(std::span<const value_type> data) |
429 | 76.0k | { |
430 | 76.0k | insert(end(), data.begin(), data.end()); |
431 | 76.0k | } |
432 | | |
433 | | protected: |
434 | | CScript& push_int64(int64_t n) |
435 | 71.1k | { |
436 | 71.1k | if (n == -1 || (n >= 1 && n <= 16)) Branch (436:13): [True: 0, False: 71.1k]
Branch (436:25): [True: 71.1k, False: 0]
Branch (436:35): [True: 0, False: 71.1k]
|
437 | 0 | { |
438 | 0 | push_back(n + (OP_1 - 1)); |
439 | 0 | } |
440 | 71.1k | else if (n == 0) Branch (440:18): [True: 0, False: 71.1k]
|
441 | 0 | { |
442 | 0 | push_back(OP_0); |
443 | 0 | } |
444 | 71.1k | else |
445 | 71.1k | { |
446 | 71.1k | *this << CScriptNum::serialize(n); |
447 | 71.1k | } |
448 | 71.1k | return *this; |
449 | 71.1k | } |
450 | | |
451 | | public: |
452 | 37.6M | CScript() = default; |
453 | | template <std::input_iterator InputIterator> |
454 | 1.56M | CScript(InputIterator first, InputIterator last) : CScriptBase{first, last} { }_ZN7CScriptC2ITkSt14input_iteratorN9__gnu_cxx17__normal_iteratorIPhSt6vectorIhSaIhEEEEEET_S8_ Line | Count | Source | 454 | 25.6k | CScript(InputIterator first, InputIterator last) : CScriptBase{first, last} { } |
_ZN7CScriptC2ITkSt14input_iteratorN9__gnu_cxx17__normal_iteratorIPKhSt6vectorIhSaIhEEEEEET_S9_ Line | Count | Source | 454 | 1.53M | CScript(InputIterator first, InputIterator last) : CScriptBase{first, last} { } |
Unexecuted instantiation: _ZN7CScriptC2ITkSt14input_iteratorN9__gnu_cxx17__normal_iteratorIPKhSt4spanIS3_Lm18446744073709551615EEEEEET_S8_ _ZN7CScriptC2ITkSt14input_iteratorN9prevectorILj36EhjiE14const_iteratorEEET_S4_ Line | Count | Source | 454 | 4.73k | CScript(InputIterator first, InputIterator last) : CScriptBase{first, last} { } |
|
455 | | |
456 | 102M | SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); }void CScript::SerializationOps<ParamsStream<SizeComputer&, TransactionSerParams>, CScript const, ActionSerialize>(CScript const&, ParamsStream<SizeComputer&, TransactionSerParams>&, ActionSerialize) Line | Count | Source | 456 | 70.8M | SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); } |
Unexecuted instantiation: void CScript::SerializationOps<ParamsStream<AutoFile&, TransactionSerParams>, CScript, ActionUnserialize>(CScript&, ParamsStream<AutoFile&, TransactionSerParams>&, ActionUnserialize) void CScript::SerializationOps<HashWriter, CScript const, ActionSerialize>(CScript const&, HashWriter&, ActionSerialize) Line | Count | Source | 456 | 613k | SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); } |
Unexecuted instantiation: void CScript::SerializationOps<DataStream, CScript const, ActionSerialize>(CScript const&, DataStream&, ActionSerialize) void CScript::SerializationOps<ParamsStream<VectorWriter&, TransactionSerParams>, CScript const, ActionSerialize>(CScript const&, ParamsStream<VectorWriter&, TransactionSerParams>&, ActionSerialize) Line | Count | Source | 456 | 277k | SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); } |
void CScript::SerializationOps<ParamsStream<DataStream&, TransactionSerParams>, CScript, ActionUnserialize>(CScript&, ParamsStream<DataStream&, TransactionSerParams>&, ActionUnserialize) Line | Count | Source | 456 | 7.99M | SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); } |
void CScript::SerializationOps<ParamsStream<SpanReader&, TransactionSerParams>, CScript, ActionUnserialize>(CScript&, ParamsStream<SpanReader&, TransactionSerParams>&, ActionUnserialize) Line | Count | Source | 456 | 1.02M | SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); } |
void CScript::SerializationOps<ParamsStream<BufferedWriter<AutoFile>&, TransactionSerParams>, CScript const, ActionSerialize>(CScript const&, ParamsStream<BufferedWriter<AutoFile>&, TransactionSerParams>&, ActionSerialize) Line | Count | Source | 456 | 1.33M | SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); } |
void CScript::SerializationOps<ParamsStream<AutoFile&, TransactionSerParams>, CScript const, ActionSerialize>(CScript const&, ParamsStream<AutoFile&, TransactionSerParams>&, ActionSerialize) Line | Count | Source | 456 | 530k | SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); } |
Unexecuted instantiation: void CScript::SerializationOps<ParamsStream<DataStream&, TransactionSerParams>, CScript const, ActionSerialize>(CScript const&, ParamsStream<DataStream&, TransactionSerParams>&, ActionSerialize) void CScript::SerializationOps<SizeComputer, CScript const, ActionSerialize>(CScript const&, SizeComputer&, ActionSerialize) Line | Count | Source | 456 | 2.89M | SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); } |
Unexecuted instantiation: void CScript::SerializationOps<SpanReader, CScript, ActionUnserialize>(CScript&, SpanReader&, ActionUnserialize) Unexecuted instantiation: void CScript::SerializationOps<ParamsStream<BufferedFile&, TransactionSerParams>, CScript, ActionUnserialize>(CScript&, ParamsStream<BufferedFile&, TransactionSerParams>&, ActionUnserialize) Unexecuted instantiation: void CScript::SerializationOps<DataStream, CScript, ActionUnserialize>(CScript&, DataStream&, ActionUnserialize) void CScript::SerializationOps<ParamsStream<HashWriter&, TransactionSerParams>, CScript const, ActionSerialize>(CScript const&, ParamsStream<HashWriter&, TransactionSerParams>&, ActionSerialize) Line | Count | Source | 456 | 17.4M | SERIALIZE_METHODS(CScript, obj) { READWRITE(AsBase<CScriptBase>(obj)); } |
|
457 | | |
458 | 0 | explicit CScript(int64_t b) { operator<<(b); } |
459 | 0 | explicit CScript(opcodetype b) { operator<<(b); } |
460 | 0 | explicit CScript(const CScriptNum& b) { operator<<(b); } |
461 | | // delete non-existent constructor to defend against future introduction |
462 | | // e.g. via prevector |
463 | | explicit CScript(const std::vector<unsigned char>& b) = delete; |
464 | | |
465 | | /** Delete non-existent operator to defend against future introduction */ |
466 | | CScript& operator<<(const CScript& b) = delete; |
467 | | |
468 | 71.1k | CScript& operator<<(int64_t b) LIFETIMEBOUND { return push_int64(b); } |
469 | | |
470 | | CScript& operator<<(opcodetype opcode) LIFETIMEBOUND |
471 | 1.35k | { |
472 | 1.35k | if (opcode < 0 || opcode > 0xff) Branch (472:13): [True: 0, False: 1.35k]
Branch (472:27): [True: 0, False: 1.35k]
|
473 | 0 | throw std::runtime_error("CScript::operator<<(): invalid opcode"); |
474 | 1.35k | insert(end(), (unsigned char)opcode); |
475 | 1.35k | return *this; |
476 | 1.35k | } |
477 | | |
478 | | CScript& operator<<(const CScriptNum& b) LIFETIMEBOUND |
479 | 162 | { |
480 | 162 | *this << b.getvch(); |
481 | 162 | return *this; |
482 | 162 | } |
483 | | |
484 | | CScript& operator<<(std::span<const std::byte> b) LIFETIMEBOUND |
485 | 76.0k | { |
486 | 76.0k | AppendDataSize(b.size()); |
487 | 76.0k | AppendData({reinterpret_cast<const value_type*>(b.data()), b.size()}); |
488 | 76.0k | return *this; |
489 | 76.0k | } |
490 | | |
491 | | // For compatibility reasons. In new code, prefer using std::byte instead of uint8_t. |
492 | | CScript& operator<<(std::span<const value_type> b) LIFETIMEBOUND |
493 | 75.8k | { |
494 | 75.8k | return *this << std::as_bytes(b); |
495 | 75.8k | } |
496 | | |
497 | | bool GetOp(const_iterator& pc, opcodetype& opcodeRet, std::vector<unsigned char>& vchRet) const |
498 | 3.07M | { |
499 | 3.07M | return GetScriptOp(pc, end(), opcodeRet, &vchRet); |
500 | 3.07M | } |
501 | | |
502 | | bool GetOp(const_iterator& pc, opcodetype& opcodeRet) const |
503 | 8.22M | { |
504 | 8.22M | return GetScriptOp(pc, end(), opcodeRet, nullptr); |
505 | 8.22M | } |
506 | | |
507 | | /** Encode/decode small integers: */ |
508 | | static int DecodeOP_N(opcodetype opcode) |
509 | 7.48M | { |
510 | 7.48M | if (opcode == OP_0) Branch (510:13): [True: 6.99M, False: 491k]
|
511 | 6.99M | return 0; |
512 | 7.48M | assert(opcode >= OP_1 && opcode <= OP_16); Branch (512:9): [True: 491k, False: 18.4E]
Branch (512:9): [True: 491k, False: 0]
Branch (512:9): [True: 491k, False: 18.4E]
|
513 | 491k | return (int)opcode - (int)(OP_1 - 1); |
514 | 491k | } |
515 | | static opcodetype EncodeOP_N(int n) |
516 | 0 | { |
517 | 0 | assert(n >= 0 && n <= 16); Branch (517:9): [True: 0, False: 0]
Branch (517:9): [True: 0, False: 0]
Branch (517:9): [True: 0, False: 0]
|
518 | 0 | if (n == 0) Branch (518:13): [True: 0, False: 0]
|
519 | 0 | return OP_0; |
520 | 0 | return (opcodetype)(OP_1+n-1); |
521 | 0 | } |
522 | | |
523 | | /** |
524 | | * Pre-version-0.6, Bitcoin always counted CHECKMULTISIGs |
525 | | * as 20 sigops. With pay-to-script-hash, that changed: |
526 | | * CHECKMULTISIGs serialized in scriptSigs are |
527 | | * counted more accurately, assuming they are of the form |
528 | | * ... OP_N CHECKMULTISIG ... |
529 | | */ |
530 | | unsigned int GetSigOpCount(bool fAccurate) const; |
531 | | |
532 | | /** |
533 | | * Accurately count sigOps, including sigOps in |
534 | | * pay-to-script-hash transactions: |
535 | | */ |
536 | | unsigned int GetSigOpCount(const CScript& scriptSig) const; |
537 | | |
538 | | /* |
539 | | * OP_1 <0x4e73> |
540 | | */ |
541 | | bool IsPayToAnchor() const; |
542 | | /** Checks if output of IsWitnessProgram comes from a P2A output script |
543 | | */ |
544 | | static bool IsPayToAnchor(int version, const std::vector<unsigned char>& program); |
545 | | |
546 | | bool IsPayToScriptHash() const; |
547 | | bool IsPayToWitnessScriptHash() const; |
548 | | bool IsWitnessProgram(int& version, std::vector<unsigned char>& program) const; |
549 | | |
550 | | bool IsPayToTaproot() const; |
551 | | |
552 | | /** Called by IsStandardTx and P2SH/BIP62 VerifyScript (which makes it consensus-critical). */ |
553 | | bool IsPushOnly(const_iterator pc) const; |
554 | | bool IsPushOnly() const; |
555 | | |
556 | | /** Check if the script contains valid OP_CODES */ |
557 | | bool HasValidOps() const; |
558 | | |
559 | | /** |
560 | | * Returns whether the script is guaranteed to fail at execution, |
561 | | * regardless of the initial stack. This allows outputs to be pruned |
562 | | * instantly when entering the UTXO set. |
563 | | */ |
564 | | bool IsUnspendable() const |
565 | 18.5M | { |
566 | 18.5M | return (size() > 0 && *begin() == OP_RETURN) || (size() > MAX_SCRIPT_SIZE); Branch (566:17): [True: 18.5M, False: 0]
Branch (566:31): [True: 743k, False: 17.7M]
Branch (566:57): [True: 0, False: 17.7M]
|
567 | 18.5M | } |
568 | | |
569 | | void clear() |
570 | 34.6M | { |
571 | | // The default prevector::clear() does not release memory |
572 | 34.6M | CScriptBase::clear(); |
573 | 34.6M | shrink_to_fit(); |
574 | 34.6M | } |
575 | | }; |
576 | | |
577 | | struct CScriptWitness |
578 | | { |
579 | | // Note that this encodes the data elements being pushed, rather than |
580 | | // encoding them as a CScript that pushes them. |
581 | | std::vector<std::vector<unsigned char> > stack; |
582 | | |
583 | | // Some compilers complain without a default constructor |
584 | 4.11M | CScriptWitness() = default; |
585 | | |
586 | 8.38M | bool IsNull() const { return stack.empty(); } |
587 | | |
588 | 0 | void SetNull() { stack.clear(); stack.shrink_to_fit(); } |
589 | | |
590 | | std::string ToString() const; |
591 | | |
592 | | bool operator==(const CScriptWitness&) const = default; |
593 | | }; |
594 | | |
595 | | /** A reference to a CScript: the Hash160 of its serialization */ |
596 | | class CScriptID : public BaseHash<uint160> |
597 | | { |
598 | | public: |
599 | 30.2M | CScriptID() : BaseHash() {} |
600 | | explicit CScriptID(const CScript& in); |
601 | 0 | explicit CScriptID(const uint160& in) : BaseHash(in) {} |
602 | | }; |
603 | | |
604 | | /** Test for OP_SUCCESSx opcodes as defined by BIP342. */ |
605 | | bool IsOpSuccess(const opcodetype& opcode); |
606 | | |
607 | | bool CheckMinimalPush(const std::vector<unsigned char>& data, opcodetype opcode); |
608 | | |
609 | | /** Build a script by concatenating other scripts, or any argument accepted by CScript::operator<<. */ |
610 | | template<typename... Ts> |
611 | | CScript BuildScript(Ts&&... inputs) |
612 | 0 | { |
613 | 0 | CScript ret; |
614 | 0 | int cnt{0}; |
615 | |
|
616 | 0 | ([&ret, &cnt] (Ts&& input) { |
617 | 0 | if constexpr (std::is_same_v<std::remove_cv_t<std::remove_reference_t<Ts>>, CScript>) { |
618 | | // If it is a CScript, extend ret with it. Move or copy the first element instead. |
619 | 0 | if (cnt == 0) { Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
Branch (619:17): [True: 0, False: 0]
|
620 | 0 | ret = std::forward<Ts>(input); |
621 | 0 | } else { |
622 | 0 | ret.insert(ret.end(), input.begin(), input.end()); |
623 | 0 | } |
624 | 0 | } else { |
625 | | // Otherwise invoke CScript::operator<<. |
626 | 0 | ret << input; |
627 | 0 | } |
628 | 0 | cnt++; |
629 | 0 | } (std::forward<Ts>(inputs)), ...); Unexecuted instantiation: BuildScript<unsigned long const&>(unsigned long const&)::{lambda(unsigned long const&)#1}::operator()(unsigned long const&) constUnexecuted instantiation: BuildScript<int const&>(int const&)::{lambda(int const&)#1}::operator()(int const&) constUnexecuted instantiation: BuildScript<long const&>(long const&)::{lambda(long const&)#1}::operator()(long const&) constUnexecuted instantiation: BuildScript<std::vector<unsigned char, std::allocator<unsigned char> > >(std::vector<unsigned char, std::allocator<unsigned char> >&&)::{lambda(std::vector<unsigned char, std::allocator<unsigned char> >&&)#1}::operator()(std::vector<unsigned char, std::allocator<unsigned char> >&&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&)::{lambda(opcodetype&&)#3}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&)::{lambda(opcodetype&&)#2}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&)::{lambda(std::vector<unsigned char, std::allocator<unsigned char> >&&)#1}::operator()(std::vector<unsigned char, std::allocator<unsigned char> >&&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<unsigned int const&, opcodetype>(unsigned int const&, opcodetype&&)::{lambda(unsigned int const&)#1}::operator()(unsigned int const&) constUnexecuted instantiation: BuildScript<unsigned int const&, opcodetype>(unsigned int const&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, int, opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype>(opcodetype&&, int&&, opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype&&)::{lambda(opcodetype&&)#4}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, int, opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype>(opcodetype&&, int&&, opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype&&)::{lambda(int&&)#1}::operator()(int&&) constUnexecuted instantiation: BuildScript<opcodetype, int, opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype>(opcodetype&&, int&&, opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype&&)::{lambda(opcodetype&&)#3}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, int, opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype>(opcodetype&&, int&&, opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype&&)::{lambda(opcodetype&&)#2}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, int, opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype>(opcodetype&&, int&&, opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype&&)::{lambda(std::vector<unsigned char, std::allocator<unsigned char> > const&)#1}::operator()(std::vector<unsigned char, std::allocator<unsigned char> > const&) constUnexecuted instantiation: BuildScript<opcodetype, int, opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype>(opcodetype&&, int&&, opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, CScript&, opcodetype>(opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#2}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, CScript&, opcodetype>(opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&)#1}::operator()(CScript&) constUnexecuted instantiation: BuildScript<opcodetype, CScript&, opcodetype>(opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, CScript&>(opcodetype&&, CScript&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, CScript&>(opcodetype&&, CScript&)::{lambda(CScript&)#1}::operator()(CScript&) constUnexecuted instantiation: BuildScript<CScript, opcodetype>(CScript&&, opcodetype&&)::{lambda(CScript&&)#1}::operator()(CScript&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype>(CScript&&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, CScript&, opcodetype>(opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#3}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, CScript&, opcodetype>(opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#2}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, CScript&, opcodetype>(opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&)#1}::operator()(CScript&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, CScript&, opcodetype>(opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, opcodetype, CScript&, opcodetype>(opcodetype&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#4}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, opcodetype, CScript&, opcodetype>(opcodetype&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#3}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, opcodetype, CScript&, opcodetype>(opcodetype&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#2}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, opcodetype, CScript&, opcodetype>(opcodetype&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&)#1}::operator()(CScript&) constUnexecuted instantiation: BuildScript<opcodetype, opcodetype, opcodetype, CScript&, opcodetype>(opcodetype&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype>(opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<CScript, CScript&>(CScript&&, CScript&)::{lambda(CScript&&)#1}::operator()(CScript&&) constUnexecuted instantiation: BuildScript<CScript, CScript&>(CScript&&, CScript&)::{lambda(CScript&)#1}::operator()(CScript&) constUnexecuted instantiation: BuildScript<CScript, CScript&, opcodetype>(CScript&&, CScript&, opcodetype&&)::{lambda(CScript&&)#1}::operator()(CScript&&) constUnexecuted instantiation: BuildScript<CScript, CScript&, opcodetype>(CScript&&, CScript&, opcodetype&&)::{lambda(CScript&)#1}::operator()(CScript&) constUnexecuted instantiation: BuildScript<CScript, CScript&, opcodetype>(CScript&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&&)#1}::operator()(CScript&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#3}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#2}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&)#1}::operator()(CScript&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&&)#1}::operator()(CScript&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#2}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&)#1}::operator()(CScript&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, CScript&, opcodetype, CScript&, opcodetype>(opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#3}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, CScript&, opcodetype, CScript&, opcodetype>(opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&)#2}::operator()(CScript&) constUnexecuted instantiation: BuildScript<opcodetype, CScript&, opcodetype, CScript&, opcodetype>(opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#2}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<opcodetype, CScript&, opcodetype, CScript&, opcodetype>(opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&)#1}::operator()(CScript&) constUnexecuted instantiation: BuildScript<opcodetype, CScript&, opcodetype, CScript&, opcodetype>(opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, CScript&, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&&)#1}::operator()(CScript&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, CScript&, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#3}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, CScript&, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&)#2}::operator()(CScript&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, CScript&, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#2}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, CScript&, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&)::{lambda(CScript&)#1}::operator()(CScript&) constUnexecuted instantiation: BuildScript<CScript, opcodetype, CScript&, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<unsigned int const&>(unsigned int const&)::{lambda(unsigned int const&)#1}::operator()(unsigned int const&) constUnexecuted instantiation: BuildScript<CScript, std::vector<unsigned char, std::allocator<unsigned char> > >(CScript&&, std::vector<unsigned char, std::allocator<unsigned char> >&&)::{lambda(CScript&&)#1}::operator()(CScript&&) constUnexecuted instantiation: BuildScript<CScript, std::vector<unsigned char, std::allocator<unsigned char> > >(CScript&&, std::vector<unsigned char, std::allocator<unsigned char> >&&)::{lambda(std::vector<unsigned char, std::allocator<unsigned char> >&&)#1}::operator()(std::vector<unsigned char, std::allocator<unsigned char> >&&) constUnexecuted instantiation: BuildScript<CScript, unsigned long, opcodetype>(CScript&&, unsigned long&&, opcodetype&&)::{lambda(CScript&&)#1}::operator()(CScript&&) constUnexecuted instantiation: BuildScript<CScript, unsigned long, opcodetype>(CScript&&, unsigned long&&, opcodetype&&)::{lambda(unsigned long&&)#1}::operator()(unsigned long&&) constUnexecuted instantiation: BuildScript<CScript, unsigned long, opcodetype>(CScript&&, unsigned long&&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&)::{lambda(std::vector<unsigned char, std::allocator<unsigned char> >&&)#1}::operator()(std::vector<unsigned char, std::allocator<unsigned char> >&&) constUnexecuted instantiation: BuildScript<std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<CScript, std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(CScript&&, std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&)::{lambda(CScript&&)#1}::operator()(CScript&&) constUnexecuted instantiation: BuildScript<CScript, std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(CScript&&, std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&)::{lambda(std::vector<unsigned char, std::allocator<unsigned char> >&&)#1}::operator()(std::vector<unsigned char, std::allocator<unsigned char> >&&) constUnexecuted instantiation: BuildScript<CScript, std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(CScript&&, std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<CScript, unsigned int const&, opcodetype>(CScript&&, unsigned int const&, opcodetype&&)::{lambda(CScript&&)#1}::operator()(CScript&&) constUnexecuted instantiation: BuildScript<CScript, unsigned int const&, opcodetype>(CScript&&, unsigned int const&, opcodetype&&)::{lambda(unsigned int const&)#1}::operator()(unsigned int const&) constUnexecuted instantiation: BuildScript<CScript, unsigned int const&, opcodetype>(CScript&&, unsigned int const&, opcodetype&&)::{lambda(opcodetype&&)#1}::operator()(opcodetype&&) constUnexecuted instantiation: BuildScript<unsigned int&>(unsigned int&)::{lambda(unsigned int&)#1}::operator()(unsigned int&) constUnexecuted instantiation: BuildScript<unsigned long&>(unsigned long&)::{lambda(unsigned long&)#1}::operator()(unsigned long&) const |
630 | |
|
631 | 0 | return ret; |
632 | 0 | } Unexecuted instantiation: CScript BuildScript<unsigned long const&>(unsigned long const&) Unexecuted instantiation: CScript BuildScript<int const&>(int const&) Unexecuted instantiation: CScript BuildScript<long const&>(long const&) Unexecuted instantiation: CScript BuildScript<std::vector<unsigned char, std::allocator<unsigned char> > >(std::vector<unsigned char, std::allocator<unsigned char> >&&) Unexecuted instantiation: CScript BuildScript<opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<unsigned int const&, opcodetype>(unsigned int const&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<opcodetype, int, opcodetype, opcodetype, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype>(opcodetype&&, int&&, opcodetype&&, opcodetype&&, std::vector<unsigned char, std::allocator<unsigned char> > const&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<opcodetype, CScript&, opcodetype>(opcodetype&&, CScript&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<opcodetype, CScript&>(opcodetype&&, CScript&) Unexecuted instantiation: CScript BuildScript<CScript, opcodetype>(CScript&&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<opcodetype, opcodetype, CScript&, opcodetype>(opcodetype&&, opcodetype&&, CScript&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<opcodetype, opcodetype, opcodetype, CScript&, opcodetype>(opcodetype&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<opcodetype>(opcodetype&&) Unexecuted instantiation: CScript BuildScript<CScript, CScript&>(CScript&&, CScript&) Unexecuted instantiation: CScript BuildScript<CScript, CScript&, opcodetype>(CScript&&, CScript&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<CScript, opcodetype, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, opcodetype&&, CScript&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<CScript, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<opcodetype, CScript&, opcodetype, CScript&, opcodetype>(opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<CScript, opcodetype, CScript&, opcodetype, CScript&, opcodetype>(CScript&&, opcodetype&&, CScript&, opcodetype&&, CScript&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<unsigned int const&>(unsigned int const&) Unexecuted instantiation: CScript BuildScript<CScript, std::vector<unsigned char, std::allocator<unsigned char> > >(CScript&&, std::vector<unsigned char, std::allocator<unsigned char> >&&) Unexecuted instantiation: CScript BuildScript<CScript, unsigned long, opcodetype>(CScript&&, unsigned long&&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<CScript, std::vector<unsigned char, std::allocator<unsigned char> >, opcodetype>(CScript&&, std::vector<unsigned char, std::allocator<unsigned char> >&&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<CScript, unsigned int const&, opcodetype>(CScript&&, unsigned int const&, opcodetype&&) Unexecuted instantiation: CScript BuildScript<unsigned int&>(unsigned int&) Unexecuted instantiation: CScript BuildScript<unsigned long&>(unsigned long&) |
633 | | |
634 | | #endif // BITCOIN_SCRIPT_SCRIPT_H |