25 #include <util/time.h> 48 void CallRPC(
const std::string& rpc_method,
const std::vector<std::string>& arguments)
55 }
catch (
const std::runtime_error&) {
61 std::vector<std::string> GetRPCCommands()
const 67 RPCFuzzTestingSetup* rpc_testing_setup =
nullptr;
68 std::string g_limit_to_rpc_command;
73 const std::vector<std::string> RPC_COMMANDS_NOT_SAFE_FOR_FUZZING{
81 "generatetodescriptor",
92 const std::vector<std::string> RPC_COMMANDS_SAFE_FOR_FUZZING{
93 "abortprivatebroadcast",
97 "combinerawtransaction",
101 "createrawtransaction",
103 "decoderawtransaction",
106 "descriptorprocesspsbt",
130 "getconnectioncount",
132 "getdescriptoractivity",
137 "getmempoolancestors",
138 "getmempooldescendants",
140 "getmempoolfeeratediagram",
150 "getprioritisedtransactions",
151 "getprivatebroadcastinfo",
158 "gettxspendingprevout",
167 "prioritisetransaction",
173 "sendrawtransaction",
176 "signmessagewithprivkey",
177 "signrawtransactionwithkey",
181 "syncwithvalidationinterfacequeue",
190 "waitforblockheight",
196 const size_t max_string_length = 4096;
197 const size_t max_base58_bytes_length{64};
270 std::optional<CBlockHeader> opt_block_header = ConsumeDeserializable<CBlockHeader>(
fuzzed_data_provider);
271 if (!opt_block_header) {
276 data_stream << *opt_block_header;
288 data_stream << allow_witness(*opt_tx);
293 std::optional<PartiallySignedTransaction> opt_psbt = ConsumeDeserializable<PartiallySignedTransaction>(
fuzzed_data_provider);
299 data_stream << *opt_psbt;
325 std::vector<std::string> scalar_arguments;
330 return "[\"" +
Join(scalar_arguments,
"\",\"") +
"\"]";
338 RPCFuzzTestingSetup* InitializeRPCFuzzTestingSetup()
340 static const auto setup = MakeNoLogFileContext<RPCFuzzTestingSetup>();
348 rpc_testing_setup = InitializeRPCFuzzTestingSetup();
349 const std::vector<std::string> supported_rpc_commands = rpc_testing_setup->GetRPCCommands();
350 for (
const std::string& rpc_command : supported_rpc_commands) {
351 const bool safe_for_fuzzing = std::find(RPC_COMMANDS_SAFE_FOR_FUZZING.begin(), RPC_COMMANDS_SAFE_FOR_FUZZING.end(), rpc_command) != RPC_COMMANDS_SAFE_FOR_FUZZING.end();
352 const bool not_safe_for_fuzzing = std::find(RPC_COMMANDS_NOT_SAFE_FOR_FUZZING.begin(), RPC_COMMANDS_NOT_SAFE_FOR_FUZZING.end(), rpc_command) != RPC_COMMANDS_NOT_SAFE_FOR_FUZZING.end();
353 if (!(safe_for_fuzzing || not_safe_for_fuzzing)) {
354 std::cerr <<
"Error: RPC command \"" << rpc_command <<
"\" not found in RPC_COMMANDS_SAFE_FOR_FUZZING or RPC_COMMANDS_NOT_SAFE_FOR_FUZZING. Please update " << __FILE__ <<
".\n";
357 if (safe_for_fuzzing && not_safe_for_fuzzing) {
358 std::cerr <<
"Error: RPC command \"" << rpc_command <<
"\" found in *both* RPC_COMMANDS_SAFE_FOR_FUZZING and RPC_COMMANDS_NOT_SAFE_FOR_FUZZING. Please update " << __FILE__ <<
".\n";
362 const char* limit_to_rpc_command_env = std::getenv(
"LIMIT_TO_RPC_COMMAND");
363 if (limit_to_rpc_command_env !=
nullptr) {
364 g_limit_to_rpc_command = std::string{limit_to_rpc_command_env};
372 bool good_data{
true};
375 if (!g_limit_to_rpc_command.empty() && rpc_command != g_limit_to_rpc_command) {
378 const bool safe_for_fuzzing = std::find(RPC_COMMANDS_SAFE_FOR_FUZZING.begin(), RPC_COMMANDS_SAFE_FOR_FUZZING.end(), rpc_command) != RPC_COMMANDS_SAFE_FOR_FUZZING.end();
379 if (!safe_for_fuzzing) {
382 std::vector<std::string> arguments;
388 std::optional<test_only_CheckFailuresAreExceptionsNotAborts> maybe_mock{};
389 if (rpc_command ==
"echo") {
392 maybe_mock.emplace();
394 rpc_testing_setup->CallRPC(rpc_command, arguments);
395 }
catch (
const UniValue& json_rpc_error) {
397 if (error_msg.starts_with(
"Internal bug detected")) {
399 assert(error_msg.find(
"trigger_internal_bug") != std::string::npos);
constexpr auto MakeUCharSpan(const V &v) -> decltype(UCharSpanCast(std::span
Like the std::span constructor, but for (const) unsigned char member types only.
CPubKey GetPubKey() const
Compute the public key from a private key.
std::string EncodeBase32(std::span< const unsigned char > input, bool pad)
Base32 encode.
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
const std::string & get_str() const
std::string EncodeBase64(std::span< const unsigned char > input)
std::string EncodeBase58(std::span< const unsigned char > input)
Why base-58 instead of standard base-64 encoding?
UniValue RPCConvertValues(const std::string &strMethod, const std::vector< std::string > &strParams)
Convert command lines arguments to params object when -named is disabled.
UniValue execute(const JSONRPCRequest &request) const
Execute a method.
const UniValue & find_value(std::string_view key) const
void SetRPCWarmupFinished()
static UniValue CallRPC(BaseRequestHandler *rh, const std::string &strMethod, const std::vector< std::string > &args, const std::optional< std::string > &rpcwallet={})
Double ended buffer combining vector and stream-like interfaces.
std::string ConsumeRandomLengthString(size_t max_length)
std::string ToString() const
std::string EncodeBase58Check(std::span< const unsigned char > input)
Encode a byte span into a base58-encoded string, including checksum.
NodeSeconds ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min, const std::optional< int64_t > &max) noexcept
void SeedRandomStateForTest(SeedRand seedtype)
Seed the global RNG state for testing and log the seed value.
FuzzedDataProvider & fuzzed_data_provider
FUZZ_TARGET(rpc,.init=initialize_rpc)
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
std::string EncodeDestination(const CTxDestination &dest)
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
An encapsulated private key.
uint160 ConsumeUInt160(FuzzedDataProvider &fuzzed_data_provider) noexcept
Seed with a compile time constant of zeros.
uint256 ConsumeUInt256(FuzzedDataProvider &fuzzed_data_provider) noexcept
std::vector< std::string > listCommands() const
Returns a list of registered commands.
std::string EncodeSecret(const CKey &key)
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
std::string HexStr(const std::span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
CTxDestination ConsumeTxDestination(FuzzedDataProvider &fuzzed_data_provider) noexcept
Testing setup that configures a complete environment.
std::string ToString(const T &t)
Locale-independent version of std::to_string.
CKey ConsumePrivateKey(FuzzedDataProvider &fuzzed_data_provider, std::optional< bool > compressed) noexcept
static constexpr TransactionSerParams TX_NO_WITNESS
static constexpr TransactionSerParams TX_WITH_WITNESS
bool IsValid() const
Check whether this private key is valid.