52 request.
params = std::move(params);
56 std::vector<std::string> GetRPCCommands()
const
62RPCFuzzTestingSetup* rpc_testing_setup =
nullptr;
63std::string g_limit_to_rpc_command;
68const std::vector<std::string> RPC_COMMANDS_NOT_SAFE_FOR_FUZZING{
77 "generatetodescriptor",
88const std::vector<std::string> RPC_COMMANDS_SAFE_FOR_FUZZING{
89 "abortprivatebroadcast",
93 "combinerawtransaction",
97 "createrawtransaction",
99 "decoderawtransaction",
102 "descriptorprocesspsbt",
126 "getconnectioncount",
128 "getdescriptoractivity",
133 "getmempoolancestors",
134 "getmempooldescendants",
136 "getmempoolfeeratediagram",
147 "getprioritisedtransactions",
148 "getprivatebroadcastinfo",
155 "gettxspendingprevout",
164 "prioritisetransaction",
171 "sendrawtransaction",
174 "signmessagewithprivkey",
175 "signrawtransactionwithkey",
179 "syncwithvalidationinterfacequeue",
188 "waitforblockheight",
194 const size_t max_string_length = 4096;
195 const size_t max_base58_bytes_length{64};
274 std::optional<CBlockHeader> opt_block_header = ConsumeDeserializable<CBlockHeader>(
fuzzed_data_provider);
275 if (!opt_block_header) {
280 data_stream << *opt_block_header;
292 data_stream << allow_witness(*opt_tx);
297 std::optional<PartiallySignedTransaction> opt_psbt = ConsumeDeserializableConstructor<PartiallySignedTransaction>(
fuzzed_data_provider);
303 data_stream << *opt_psbt;
327constexpr int MAX_RPC_ARGUMENT_NESTING{9};
332 if (nesting_depth == 0) {
336 std::vector<std::function<void()>> mks{
357RPCFuzzTestingSetup* InitializeRPCFuzzTestingSetup()
359 static const auto setup = MakeNoLogFileContext<RPCFuzzTestingSetup>();
367 rpc_testing_setup = InitializeRPCFuzzTestingSetup();
368 const std::vector<std::string> supported_rpc_commands = rpc_testing_setup->GetRPCCommands();
369 for (
const std::string& rpc_command : supported_rpc_commands) {
370 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();
371 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();
372 if (!(safe_for_fuzzing || not_safe_for_fuzzing)) {
373 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";
376 if (safe_for_fuzzing && not_safe_for_fuzzing) {
377 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";
381 const char* limit_to_rpc_command_env = std::getenv(
"LIMIT_TO_RPC_COMMAND");
382 if (limit_to_rpc_command_env !=
nullptr) {
383 g_limit_to_rpc_command = std::string{limit_to_rpc_command_env};
391 bool good_data{
true};
394 if (!g_limit_to_rpc_command.empty() && rpc_command != g_limit_to_rpc_command) {
397 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();
398 if (!safe_for_fuzzing) {
406 std::optional<test_only_CheckFailuresAreExceptionsNotAborts> maybe_mock{};
407 if (rpc_command ==
"echo") {
410 maybe_mock.emplace();
412 rpc_testing_setup->CallRPC(rpc_command, std::move(arguments));
413 }
catch (
const UniValue& json_rpc_error) {
415 if (error_msg.starts_with(
"Internal bug detected")) {
417 assert(error_msg.find(
"trigger_internal_bug") != std::string::npos);
std::string EncodeBase58(std::span< const unsigned char > input)
Why base-58 instead of standard base-64 encoding?
std::string EncodeBase58Check(std::span< const unsigned char > input)
Encode a byte span into a base58-encoded string, including checksum.
static UniValue CallRPC(BaseRequestHandler *rh, const std::string &strMethod, const std::vector< std::string > &args, const std::string &endpoint, const std::string &username)
An encapsulated private key.
bool IsValid() const
Check whether this private key is valid.
CPubKey GetPubKey() const
Compute the public key from a private key.
std::vector< std::string > listCommands() const
Returns a list of registered commands.
UniValue execute(const JSONRPCRequest &request) const
Execute a method.
Double ended buffer combining vector and stream-like interfaces.
Helper to initialize the global NodeClock, let a duration elapse, and reset it after use in a test.
std::string ConsumeRandomLengthString(size_t max_length)
void push_back(UniValue val)
const std::string & get_str() const
const UniValue & find_value(std::string_view key) const
std::string ToString() const
LIMITED_WHILE(provider.remaining_bytes(), 10000)
std::string HexStr(const std::span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
std::string EncodeSecret(const CKey &key)
std::string EncodeDestination(const CTxDestination &dest)
constexpr TransactionSerParams TX_NO_WITNESS
constexpr TransactionSerParams TX_WITH_WITNESS
FUZZ_TARGET(rpc,.init=initialize_rpc)
void SetRPCWarmupFinished()
constexpr auto MakeUCharSpan(const V &v) -> decltype(UCharSpanCast(std::span{v}))
Like the std::span constructor, but for (const) unsigned char member types only.
Testing setup that configures a complete environment.
SeedRandomStateForTest(SeedRand::ZEROS)
NodeSeconds ConsumeTime(FuzzedDataProvider &fuzzed_data_provider, const std::optional< int64_t > &min, const std::optional< int64_t > &max) noexcept
CKey ConsumePrivateKey(FuzzedDataProvider &fuzzed_data_provider, std::optional< bool > compressed) noexcept
CTxDestination ConsumeTxDestination(FuzzedDataProvider &fuzzed_data_provider) noexcept
auto & PickValue(FuzzedDataProvider &fuzzed_data_provider, Collection &col)
uint256 ConsumeUInt256(FuzzedDataProvider &fuzzed_data_provider) noexcept
size_t CallOneOf(FuzzedDataProvider &fuzzed_data_provider, Callables... callables)
uint160 ConsumeUInt160(FuzzedDataProvider &fuzzed_data_provider) noexcept
@ ZEROS
Seed with a compile time constant of zeros.
std::string EncodeBase32(std::span< const unsigned char > input, bool pad)
Base32 encode.
std::string EncodeBase64(std::span< const unsigned char > input)
FuzzedDataProvider & fuzzed_data_provider