diff --git a/doc/release-notes-6207.md b/doc/release-notes-6207.md new file mode 100644 index 000000000000..f49cfc940d88 --- /dev/null +++ b/doc/release-notes-6207.md @@ -0,0 +1,4 @@ +RPC changes +----------- + +- `spork` no longer have `active` and `show` commands, it always shows actual raw values now. `command` argument is deprecated and ignored. diff --git a/src/rpc/node.cpp b/src/rpc/node.cpp index 97d6188828b9..8d40f845e782 100644 --- a/src/rpc/node.cpp +++ b/src/rpc/node.cpp @@ -149,48 +149,32 @@ static RPCHelpMan spork() { // default help, for basic mode return RPCHelpMan{"spork", - "\nShows information about current state of sporks\n", + "\nShows information about current state of sporks for non-mainnet networks. Mainnet values are hardcoded.\n", { - {"command", RPCArg::Type::STR, RPCArg::Optional::NO, "'show' to show all current spork values, 'active' to show which sporks are active"}, + {"command", RPCArg::Type::STR, RPCArg::Default{""}, "Deprecated and ignored"}, }, { - RPCResult{"For 'show'", + RPCResult{ RPCResult::Type::OBJ_DYN, "", "keys are the sporks, and values indicates its value", { {RPCResult::Type::NUM, "SPORK_NAME", "The value of the specific spork with the name SPORK_NAME"}, }}, - RPCResult{"For 'active'", - RPCResult::Type::OBJ_DYN, "", "keys are the sporks, and values indicates its status", - { - {RPCResult::Type::BOOL, "SPORK_NAME", "'true' for time-based sporks if spork is active and 'false' otherwise"}, - }}, }, RPCExamples { - HelpExampleCli("spork", "show") - + HelpExampleRpc("spork", "\"show\"") + HelpExampleCli("spork", "") + + HelpExampleRpc("spork", "") }, [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue { // basic mode, show info - std:: string strCommand = request.params[0].get_str(); const NodeContext& node = EnsureAnyNodeContext(request.context); CHECK_NONFATAL(node.sporkman); - if (strCommand == "show") { - UniValue ret(UniValue::VOBJ); - for (const auto& sporkDef : sporkDefs) { - ret.pushKV(std::string(sporkDef.name), node.sporkman->GetSporkValue(sporkDef.sporkId)); - } - return ret; - } else if(strCommand == "active"){ - UniValue ret(UniValue::VOBJ); - for (const auto& sporkDef : sporkDefs) { - ret.pushKV(std::string(sporkDef.name), node.sporkman->IsSporkActive(sporkDef.sporkId)); - } - return ret; + UniValue ret(UniValue::VOBJ); + for (const auto& sporkDef : sporkDefs) { + ret.pushKV(std::string(sporkDef.name), node.sporkman->GetSporkValue(sporkDef.sporkId)); } - - return NullUniValue; + return ret; }, }; } @@ -198,7 +182,7 @@ static RPCHelpMan spork() static RPCHelpMan sporkupdate() { return RPCHelpMan{"sporkupdate", - "\nUpdate the value of the specific spork. Requires \"-sporkkey\" to be set to sign the message.\n", + "\nUpdate the value of the specific spork on non-mainnet networks. Requires \"-sporkkey\" to be set to sign the message.\n", { {"name", RPCArg::Type::STR, RPCArg::Optional::NO, "The name of the spork to update"}, {"value", RPCArg::Type::NUM, RPCArg::Optional::NO, "The new desired value of the spork"}, diff --git a/test/functional/feature_multikeysporks.py b/test/functional/feature_multikeysporks.py index 999622b1e6d4..06c7f9b71c8d 100755 --- a/test/functional/feature_multikeysporks.py +++ b/test/functional/feature_multikeysporks.py @@ -69,7 +69,7 @@ def setup_network(self): def get_test_spork_value(self, node, spork_name): self.bump_mocktime(5) # advance ProcessTick - info = node.spork('show') + info = node.spork() # use InstantSend spork for tests return info[spork_name] diff --git a/test/functional/feature_sporks.py b/test/functional/feature_sporks.py index b6b5fdf7b817..0183d90e7322 100755 --- a/test/functional/feature_sporks.py +++ b/test/functional/feature_sporks.py @@ -20,46 +20,41 @@ def setup_network(self): # connect only 2 first nodes at start self.connect_nodes(0, 1) - def get_test_spork_state(self, node): - info = node.spork('active') + def get_test_spork_value(self, node): # use InstantSend spork for tests - return info['SPORK_2_INSTANTSEND_ENABLED'] + return node.spork()['SPORK_2_INSTANTSEND_ENABLED'] - def set_test_spork_state(self, node, state): - if state: - value = 0 - else: - value = 4070908800 + def set_test_spork_value(self, node, value): # use InstantSend spork for tests node.sporkupdate("SPORK_2_INSTANTSEND_ENABLED", value) def run_test(self): - spork_default_state = self.get_test_spork_state(self.nodes[0]) + spork_default_value = self.get_test_spork_value(self.nodes[0]) # check test spork default state matches on all nodes - assert self.get_test_spork_state(self.nodes[1]) == spork_default_state - assert self.get_test_spork_state(self.nodes[2]) == spork_default_state + assert self.get_test_spork_value(self.nodes[1]) == spork_default_value + assert self.get_test_spork_value(self.nodes[2]) == spork_default_value # check spork propagation for connected nodes - spork_new_state = not spork_default_state - self.set_test_spork_state(self.nodes[0], spork_new_state) - self.wait_until(lambda: self.get_test_spork_state(self.nodes[1]), timeout=10) + spork_new_value = spork_default_value + 1 + self.set_test_spork_value(self.nodes[0], spork_new_value) + self.wait_until(lambda: self.get_test_spork_value(self.nodes[1]) == spork_new_value, timeout=10) # restart nodes to check spork persistence self.stop_node(0) self.stop_node(1) self.start_node(0) self.start_node(1) - assert self.get_test_spork_state(self.nodes[0]) == spork_new_state - assert self.get_test_spork_state(self.nodes[1]) == spork_new_state + assert self.get_test_spork_value(self.nodes[0]) == spork_new_value + assert self.get_test_spork_value(self.nodes[1]) == spork_new_value # Generate one block to kick off masternode sync, which also starts sporks syncing for node2 self.generate(self.nodes[1], 1, sync_fun=self.no_op) # connect new node and check spork propagation after restoring from cache self.connect_nodes(1, 2) - self.wait_until(lambda: self.get_test_spork_state(self.nodes[2]), timeout=10) + self.wait_until(lambda: self.get_test_spork_value(self.nodes[2]) == spork_new_value, timeout=10) - assert "" not in self.nodes[0].spork('show').keys() + assert "" not in self.nodes[0].spork().keys() if __name__ == '__main__': diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py index 8c8ac38b011f..4a05e814c912 100755 --- a/test/functional/test_framework/test_framework.py +++ b/test/functional/test_framework/test_framework.py @@ -1527,7 +1527,7 @@ def activate_by_name(self, name, expected_activation_height=None, slow_mode=True self.log.info("Wait for " + name + " activation") # disable spork17 while mining blocks to activate "name" to prevent accidental quorum formation - spork17_value = self.nodes[0].spork('show')['SPORK_17_QUORUM_DKG_ENABLED'] + spork17_value = self.nodes[0].spork()['SPORK_17_QUORUM_DKG_ENABLED'] self.bump_mocktime(1) self.nodes[0].sporkupdate("SPORK_17_QUORUM_DKG_ENABLED", 4070908800) self.wait_for_sporks_same() @@ -1951,8 +1951,8 @@ def wait_for_best_chainlock(self, node, block_hash, timeout=15): def wait_for_sporks_same(self, timeout=30): def check_sporks_same(): self.bump_mocktime(1) - sporks = self.nodes[0].spork('show') - return all(node.spork('show') == sporks for node in self.nodes[1:]) + sporks = self.nodes[0].spork() + return all(node.spork() == sporks for node in self.nodes[1:]) self.wait_until(check_sporks_same, timeout=timeout, sleep=1) def wait_for_quorum_connections(self, quorum_hash, expected_connections, mninfos, llmq_type_name="llmq_test", timeout = 60, wait_proc=None): @@ -2095,8 +2095,8 @@ def move_blocks(self, nodes, num_blocks): self.generate(self.nodes[0], num_blocks, sync_fun=lambda: self.sync_blocks(nodes)) def mine_quorum(self, llmq_type_name="llmq_test", llmq_type=100, expected_connections=None, expected_members=None, expected_contributions=None, expected_complaints=0, expected_justifications=0, expected_commitments=None, mninfos_online=None, mninfos_valid=None, skip_maturity=False): - spork21_active = self.nodes[0].spork('show')['SPORK_21_QUORUM_ALL_CONNECTED'] <= 1 - spork23_active = self.nodes[0].spork('show')['SPORK_23_QUORUM_POSE'] <= 1 + spork21_active = self.nodes[0].spork()['SPORK_21_QUORUM_ALL_CONNECTED'] <= 1 + spork23_active = self.nodes[0].spork()['SPORK_23_QUORUM_POSE'] <= 1 if expected_connections is None: expected_connections = (self.llmq_size - 1) if spork21_active else 2 @@ -2185,8 +2185,8 @@ def mine_quorum(self, llmq_type_name="llmq_test", llmq_type=100, expected_connec return new_quorum def mine_cycle_quorum(self): - spork21_active = self.nodes[0].spork('show')['SPORK_21_QUORUM_ALL_CONNECTED'] <= 1 - spork23_active = self.nodes[0].spork('show')['SPORK_23_QUORUM_POSE'] <= 1 + spork21_active = self.nodes[0].spork()['SPORK_21_QUORUM_ALL_CONNECTED'] <= 1 + spork23_active = self.nodes[0].spork()['SPORK_23_QUORUM_POSE'] <= 1 llmq_type_name="llmq_test_dip0024" llmq_type=103