diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -655,6 +655,9 @@ "-disablesafemode", strprintf("Disable safemode, override a real " "safe mode event (default: %d)", DEFAULT_DISABLE_SAFEMODE)); + strUsage += + HelpMessageOpt("-deprecatedrpc=", + "Allows deprecated RPC method(s) to be used"); strUsage += HelpMessageOpt( "-testsafemode", strprintf("Force safe mode (default: %d)", DEFAULT_TESTSAFEMODE)); diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -798,6 +798,16 @@ HelpExampleCli("estimatefee", "6")); } + if (!IsDeprecatedRPCEnabled("estimatefee")) { + throw JSONRPCError( + RPC_METHOD_DEPRECATED, + "estimatefee is deprecated and will be fully removed in v0.17. " + "To use estimatefee in v0.16, restart bitcoind with " + "-deprecatedrpc=estimatefee.\n" + "Projects should transition to using estimatesmartfee before " + "upgrading to v0.17"); + } + RPCTypeCheck(request.params, {UniValue::VNUM}); int nBlocks = request.params[0].get_int(); diff --git a/src/rpc/protocol.h b/src/rpc/protocol.h --- a/src/rpc/protocol.h +++ b/src/rpc/protocol.h @@ -67,6 +67,8 @@ RPC_VERIFY_ALREADY_IN_CHAIN = -27, //!< Client still warming up RPC_IN_WARMUP = -28, + //!< RPC method is deprecated + RPC_METHOD_DEPRECATED = -32, //! Aliases for backward compatibility RPC_TRANSACTION_ERROR = RPC_VERIFY_ERROR, diff --git a/src/rpc/server.h b/src/rpc/server.h --- a/src/rpc/server.h +++ b/src/rpc/server.h @@ -243,6 +243,8 @@ const ContextFreeRPCCommand *pcmd); }; +bool IsDeprecatedRPCEnabled(const std::string &method); + extern CRPCTable tableRPC; /** diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -405,6 +405,14 @@ return fRPCInWarmup; } +bool IsDeprecatedRPCEnabled(const std::string &method) { + const std::vector enabled_methods = + gArgs.GetArgs("-deprecatedrpc"); + + return find(enabled_methods.begin(), enabled_methods.end(), method) != + enabled_methods.end(); +} + static UniValue JSONRPCExecOne(Config &config, RPCServer &rpcServer, JSONRPCRequest jreq, const UniValue &req) { UniValue rpc_result(UniValue::VOBJ); diff --git a/test/functional/deprecated_rpc.py b/test/functional/deprecated_rpc.py new file mode 100755 --- /dev/null +++ b/test/functional/deprecated_rpc.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# Copyright (c) 2017 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +"""Test deprecation of RPC calls.""" +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import assert_raises_rpc_error + + +class DeprecatedRpcTest(BitcoinTestFramework): + def set_test_params(self): + self.num_nodes = 2 + self.setup_clean_chain = True + self.extra_args = [[], ["-deprecatedrpc=estimatefee"]] + + def run_test(self): + self.log.info("estimatefee: Shows deprecated message") + assert_raises_rpc_error(-32, 'estimatefee is deprecated', + self.nodes[0].estimatefee, 1) + + self.log.info("Using -deprecatedrpc=estimatefee bypasses the error") + self.nodes[1].estimatefee(1) + + +if __name__ == '__main__': + DeprecatedRpcTest().main() diff --git a/test/functional/timing.json b/test/functional/timing.json --- a/test/functional/timing.json +++ b/test/functional/timing.json @@ -1,23 +1,23 @@ [ { "name": "abandonconflict.py", - "time": 17 + "time": 14 }, { "name": "abc-checkdatasig-activation.py", - "time": 16 + "time": 5 }, { "name": "abc-cmdline.py", - "time": 8 + "time": 9 }, { "name": "abc-high_priority_transaction.py", - "time": 22 + "time": 11 }, { "name": "abc-magnetic-anomaly-activation.py", - "time": 10 + "time": 8 }, { "name": "abc-mempool-accept-txn.py", @@ -25,59 +25,63 @@ }, { "name": "abc-p2p-compactblocks.py", - "time": 184 + "time": 165 }, { "name": "abc-p2p-fullblocktest.py", - "time": 65 + "time": 52 }, { "name": "abc-replay-protection.py", - "time": 5 + "time": 13 }, { "name": "abc-rpc.py", - "time": 15 + "time": 4 }, { "name": "abc-transaction-ordering.py", - "time": 9 + "time": 8 }, { "name": "assumevalid.py", - "time": 13 + "time": 29 }, { "name": "bip65-cltv-p2p.py", - "time": 5 + "time": 16 }, { "name": "bip68-112-113-p2p.py", - "time": 21 + "time": 26 }, { "name": "bip68-sequence.py", - "time": 37 + "time": 29 }, { "name": "bipdersig-p2p.py", - "time": 5 + "time": 15 }, { "name": "bitcoin_cli.py", - "time": 14 + "time": 3 }, { "name": "blockchain.py", - "time": 9 + "time": 8 }, { "name": "dbcrash.py", - "time": 1161 + "time": 1320 }, { "name": "decodescript.py", - "time": 15 + "time": 3 + }, + { + "name": "deprecated_rpc.py", + "time": 3 }, { "name": "disablewallet.py", @@ -85,47 +89,47 @@ }, { "name": "disconnect_ban.py", - "time": 10 + "time": 20 }, { "name": "example_test.py", - "time": 14 + "time": 4 }, { "name": "forknotify.py", - "time": 20 + "time": 17 }, { "name": "fundrawtransaction.py", - "time": 50 + "time": 43 }, { "name": "getblocktemplate_longpoll.py", - "time": 68 + "time": 73 }, { "name": "getchaintips.py", - "time": 22 + "time": 6 }, { "name": "httpbasics.py", - "time": 19 + "time": 16 }, { "name": "import-rescan.py", - "time": 44 + "time": 18 }, { "name": "importmulti.py", - "time": 24 + "time": 14 }, { "name": "importprunedfunds.py", - "time": 3 + "time": 4 }, { "name": "invalidateblock.py", - "time": 8 + "time": 13 }, { "name": "invalidblockrequest.py", @@ -133,71 +137,71 @@ }, { "name": "invalidtxrequest.py", - "time": 3 + "time": 4 }, { "name": "keypool-topup.py", - "time": 45 + "time": 31 }, { "name": "keypool.py", - "time": 9 + "time": 20 }, { "name": "listsinceblock.py", - "time": 4 + "time": 5 }, { "name": "listtransactions.py", - "time": 8 + "time": 26 }, { "name": "maxuploadtarget.py", - "time": 49 + "time": 55 }, { "name": "mempool_limit.py", - "time": 35 + "time": 22 }, { "name": "mempool_packages.py", - "time": 62 + "time": 29 }, { "name": "mempool_persist.py", - "time": 26 + "time": 20 }, { "name": "mempool_reorg.py", - "time": 5 + "time": 8 }, { "name": "mempool_resurrect_test.py", - "time": 4 + "time": 30 }, { "name": "mempool_spendcoinbase.py", - "time": 3 + "time": 16 }, { "name": "merkle_blocks.py", - "time": 4 + "time": 5 }, { "name": "minchainwork.py", - "time": 16 + "time": 7 }, { "name": "mining.py", - "time": 4 + "time": 17 }, { "name": "multi_rpc.py", - "time": 6 + "time": 5 }, { "name": "multiwallet.py", - "time": 21 + "time": 8 }, { "name": "net.py", @@ -209,23 +213,23 @@ }, { "name": "p2p-acceptblock.py", - "time": 7 + "time": 15 }, { "name": "p2p-compactblocks.py", - "time": 31 + "time": 29 }, { "name": "p2p-feefilter.py", - "time": 24 + "time": 41 }, { "name": "p2p-fullblocktest.py", - "time": 175 + "time": 182 }, { "name": "p2p-leaktests.py", - "time": 9 + "time": 8 }, { "name": "p2p-mempool.py", @@ -233,47 +237,47 @@ }, { "name": "p2p-timeouts.py", - "time": 66 + "time": 65 }, { "name": "preciousblock.py", - "time": 5 + "time": 6 }, { "name": "prioritise_transaction.py", - "time": 9 + "time": 40 }, { "name": "proxy_test.py", - "time": 4 + "time": 5 }, { "name": "pruning.py", - "time": 1590 + "time": 1515 }, { "name": "rawtransactions.py", - "time": 26 + "time": 14 }, { "name": "receivedby.py", - "time": 24 + "time": 16 }, { "name": "reindex.py", - "time": 25 + "time": 14 }, { "name": "resendwallettransactions.py", - "time": 7 + "time": 5 }, { "name": "rest.py", - "time": 19 + "time": 22 }, { "name": "rpcbind_test.py", - "time": 27 + "time": 25 }, { "name": "rpcnamedargs.py", @@ -281,11 +285,11 @@ }, { "name": "sendheaders.py", - "time": 30 + "time": 27 }, { "name": "signmessages.py", - "time": 3 + "time": 2 }, { "name": "signrawtransactions.py", @@ -297,7 +301,7 @@ }, { "name": "txn_clone.py --mineblock", - "time": 17 + "time": 7 }, { "name": "txn_doublespend.py", @@ -309,38 +313,38 @@ }, { "name": "uptime.py", - "time": 2 + "time": 3 }, { "name": "wallet-accounts.py", - "time": 22 + "time": 11 }, { "name": "wallet-dump.py", - "time": 7 + "time": 37 }, { "name": "wallet-encryption.py", - "time": 9 + "time": 15 }, { "name": "wallet-hd.py", - "time": 85 + "time": 132 }, { "name": "wallet.py", - "time": 47 + "time": 57 }, { "name": "walletbackup.py", - "time": 116 + "time": 154 }, { "name": "zapwallettxes.py", - "time": 34 + "time": 12 }, { "name": "zmq_test.py", - "time": 5 + "time": 6 } ] \ No newline at end of file