Bitcoin Core 31.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
script.cpp
Go to the documentation of this file.
1// Copyright (c) 2019-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <chainparams.h>
6#include <compressor.h>
7#include <core_io.h>
8#include <core_memusage.h>
9#include <key_io.h>
10#include <policy/policy.h>
11#include <pubkey.h>
12#include <rpc/util.h>
13#include <script/descriptor.h>
14#include <script/interpreter.h>
15#include <script/script.h>
16#include <script/script_error.h>
17#include <script/sign.h>
19#include <script/solver.h>
20#include <streams.h>
22#include <test/fuzz/fuzz.h>
23#include <test/fuzz/util.h>
24#include <univalue.h>
25#include <util/chaintype.h>
26
27#include <algorithm>
28#include <cassert>
29#include <cstdint>
30#include <optional>
31#include <string>
32#include <vector>
33
38
40{
41 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
43
46 const unsigned int size = compressed[0];
48 assert(size <= 5);
51 assert(ok);
53 }
54
57 if (!is_standard_ret) {
61 }
64 }
66 assert(script.IsUnspendable());
67 }
68 if (script.IsUnspendable()) {
71 }
72
73 CTxDestination address;
80 }
85 }
86
90
92
93 std::vector<std::vector<unsigned char>> solutions;
95
96 (void)script.HasValidOps();
97 (void)script.IsPayToAnchor();
98 (void)script.IsPayToScriptHash();
99 (void)script.IsPayToWitnessScriptHash();
100 (void)script.IsPushOnly();
101 (void)script.GetSigOpCount(/* fAccurate= */ false);
102
103 {
104 const std::vector<uint8_t> bytes = ConsumeRandomLengthByteVector(fuzzed_data_provider);
106 compressed_script.assign(bytes.begin(), bytes.end());
107 // DecompressScript(..., ..., bytes) is not guaranteed to be defined if the bytes vector is too short
108 if (compressed_script.size() >= 32) {
111 }
112 }
113
115 if (other_script) {
116 {
119 }
123 {
125 for (const auto& s : random_string_vector) {
126 wit.stack.emplace_back(s.begin(), s.end());
127 }
129 wit.SetNull();
130 }
131 }
132
135
136 {
137 const std::vector<uint8_t> bytes = ConsumeRandomLengthByteVector(fuzzed_data_provider);
138 CScript append_script{bytes.begin(), bytes.end()};
143 }
144
145 {
155 const bool valid{IsValidDestination(tx_destination_1)};
156
157 if (!std::get_if<PubKeyDestination>(&tx_destination_1)) {
158 // Only try to round trip non-pubkey destinations since PubKeyDestination has no encoding
159 Assert(dest.empty() != valid);
162 }
163
169 }
170 }
171}
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
int flags
void SelectParams(const ChainType chain)
Sets the params returned by Params() to those for the given chain type.
#define Assert(val)
Identity function.
Definition check.h:113
Serialized script, used inside transaction inputs and outputs.
Definition script.h:405
std::string ConsumeRandomLengthString(size_t max_length)
T ConsumeIntegralInRange(T min, T max)
Implements a drop-in replacement for std::vector<T> which stores up to N elements directly (without h...
Definition prevector.h:37
iterator erase(iterator pos)
Definition prevector.h:364
iterator begin()
Definition prevector.h:255
void assign(size_type n, const T &val)
Definition prevector.h:176
static constexpr script_verify_flags from_int(value_type f)
bool DecompressScript(CScript &script, unsigned int nSize, const CompressedScript &in)
bool CompressScript(const CScript &script, CompressedScript &out)
static size_t RecursiveDynamicUsage(const CScript &script)
#define FUZZ_TARGET(...)
Definition fuzz.h:35
int FindAndDelete(CScript &script, const CScript &b)
size_t CountWitnessSigOps(const CScript &scriptSig, const CScript &scriptPubKey, const CScriptWitness &witness, script_verify_flags flags)
bool IsValidDestinationString(const std::string &str, const CChainParams &params)
Definition key_io.cpp:310
CTxDestination DecodeDestination(const std::string &str, std::string &error_msg, std::vector< int > *error_locations)
Definition key_io.cpp:299
std::string EncodeDestination(const CTxDestination &dest)
Definition key_io.cpp:294
bool IsStandard(const CScript &scriptPubKey, TxoutType &whichType)
Definition policy.cpp:79
UniValue DescribeAddress(const CTxDestination &dest)
Definition util.cpp:347
std::unique_ptr< Descriptor > InferDescriptor(const CScript &script, const SigningProvider &provider)
Find a descriptor for the specified script, using information from provider where possible.
std::string GetOpName(opcodetype opcode)
Definition script.cpp:18
std::string ScriptErrorString(const ScriptError serror)
enum ScriptError_t ScriptError
@ SCRIPT_ERR_ERROR_COUNT
bool IsSegWitOutput(const SigningProvider &provider, const CScript &script)
Check whether a scriptPubKey is known to be segwit.
Definition sign.cpp:990
CKeyID GetKeyForDestination(const SigningProvider &store, const CTxDestination &dest)
Return the CKeyID of the key involved in a script (if there is a unique one).
TxoutType Solver(const CScript &scriptPubKey, std::vector< std::vector< unsigned char > > &vSolutionsRet)
Parse a scriptPubKey and identify script type for standard scripts.
Definition solver.cpp:141
TxoutType
Definition solver.h:22
@ NULL_DATA
unspendable OP_RETURN script that carries data
std::vector< std::vector< unsigned char > > stack
Definition script.h:580
void initialize_script()
Definition script.cpp:34
CScript ConsumeScript(FuzzedDataProvider &fuzzed_data_provider, const bool maybe_p2wsh) noexcept
Definition util.cpp:98
CTxDestination ConsumeTxDestination(FuzzedDataProvider &fuzzed_data_provider) noexcept
Definition util.cpp:189
std::vector< B > ConsumeRandomLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, const std::optional< size_t > &max_length=std::nullopt) noexcept
Definition util.h:57
std::vector< std::string > ConsumeRandomLengthStringVector(FuzzedDataProvider &fuzzed_data_provider, const size_t max_vector_size=16, const size_t max_string_length=16) noexcept
Definition util.h:73
opcodetype ConsumeOpcodeType(FuzzedDataProvider &fuzzed_data_provider) noexcept
Definition util.h:135
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.
Definition time.h:73
assert(!tx.IsCoinBase())
FuzzedDataProvider & fuzzed_data_provider
Definition fees.cpp:38