diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -179,6 +179,19 @@ return chainActive.Tip()->GetBlockHash().GetHex(); } +UniValue getfinalizedblock(const Config &config, + const JSONRPCRequest &request) { + if (request.fHelp || request.params.size() != 0) { + throw std::runtime_error( + "getfinalizedblock\n" + "\nReturns the hash of the currently finalized block\n" + "\nResult:\n" + "\"hex\" (string) the block hash hex encoded\n"); + } + + return GetFinalizedBlockHash().GetHex(); +} + void RPCNotifyBlockChange(bool ibd, const CBlockIndex *pindex) { if (pindex) { std::lock_guard lock(cs_blockchange); @@ -1827,6 +1840,7 @@ { "blockchain", "preciousblock", preciousblock, {"blockhash"} }, /* Not shown in help */ + { "hidden", "getfinalizedblock", getfinalizedblock, {""} }, { "hidden", "finalizeblock", finalizeblock, {"blockhash"} }, { "hidden", "invalidateblock", invalidateblock, {"blockhash"} }, { "hidden", "parkblock", parkblock, {"blockhash"} }, diff --git a/src/validation.h b/src/validation.h --- a/src/validation.h +++ b/src/validation.h @@ -636,6 +636,8 @@ bool FinalizeBlockAndInvalidate(const Config &config, CValidationState &state, CBlockIndex *pindex); +uint256 GetFinalizedBlockHash(); + /** Mark a block as invalid. */ bool InvalidateBlock(const Config &config, CValidationState &state, CBlockIndex *pindex); diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2915,6 +2915,11 @@ return true; } +uint256 GetFinalizedBlockHash() { + LOCK(cs_main); + return pindexFinalized->GetBlockHash(); +} + bool InvalidateBlock(const Config &config, CValidationState &state, CBlockIndex *pindex) { return UnwindBlock(config, state, pindex, true); diff --git a/test/functional/abc-finalize-block.py b/test/functional/abc-finalize-block.py --- a/test/functional/abc-finalize-block.py +++ b/test/functional/abc-finalize-block.py @@ -76,10 +76,13 @@ self.log.info("Trigger reorg via block finalization...") node.finalizeblock(tip) assert_equal(node.getbestblockhash(), tip) + assert_equal(node.getfinalizedblock(), tip) self.log.info("Try to finalized a block on a competiting fork...") assert_raises_rpc_error(-20, RPC_FINALIZE_INVALID_BLOCK_ERROR, node.finalizeblock, alt_node.getbestblockhash()) + assert_not_equal(node.getfinalizedblock(), alt_node.getbestblockhash()) + assert_equal(node.getfinalizedblock(), tip) if __name__ == '__main__':