diff --git a/CMakeLists.txt b/CMakeLists.txt index d1a09f6..8e9b438 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ endif() set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) # Default to Release build if(NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "") diff --git a/src/network/rpc_server.cpp b/src/network/rpc_server.cpp index 66ef089..63262a9 100644 --- a/src/network/rpc_server.cpp +++ b/src/network/rpc_server.cpp @@ -679,7 +679,7 @@ std::string RPCServer::HandleGetBlockHash(const std::vector& params return util::JsonError("Block height out of range"); } - return index->GetBlockHash().GetHex() + "\n"; + return "\"" + index->GetBlockHash().GetHex() + "\"\n"; } std::string RPCServer::HandleGetBlockHeader(const std::vector& params) { @@ -755,7 +755,7 @@ std::string RPCServer::HandleGetBestBlockHash(const std::vector& pa return "null\n"; } - return tip->GetBlockHash().GetHex() + "\n"; + return "\"" + tip->GetBlockHash().GetHex() + "\"\n"; } std::string RPCServer::HandleGetConnectionCount(const std::vector& params) { diff --git a/test/integration-network/rpc_integration_tests.cpp b/test/integration-network/rpc_integration_tests.cpp index 554c22c..afcf9f4 100644 --- a/test/integration-network/rpc_integration_tests.cpp +++ b/test/integration-network/rpc_integration_tests.cpp @@ -8,6 +8,7 @@ #include "network/rpc_client.hpp" #include "network/rpc_server.hpp" #include "util/logging.hpp" +#include #include #include @@ -604,6 +605,28 @@ TEST_CASE("RPC Commands: getbestblockhash", "[rpc][integration][blockchain]") { std::string response = client.ExecuteCommand("getbestblockhash", {}); // Empty chain should return null/zero hash or error REQUIRE(!response.empty()); + + auto j = nlohmann::json::parse(response); + REQUIRE(j.is_null()); + } +} + +TEST_CASE("RPC Commands: getblockhash", "[rpc][integration][blockchain]") { + RPCTestFixture fixture; + REQUIRE(fixture.StartServer()); + std::this_thread::sleep_for(100ms); + + rpc::RPCClient client(fixture.GetSocketPath()); + REQUIRE_FALSE(client.Connect().has_value()); + + SECTION("Returns error for empty chain") { + std::string response = client.ExecuteCommand("getblockhash", {"0"}); + REQUIRE(!response.empty()); + + auto j = nlohmann::json::parse(response); + REQUIRE(j.is_object()); + REQUIRE(j.contains("error")); + REQUIRE(j["error"].get().find("out of range") != std::string::npos); } }