[rpc] mining: Omit uninitialized currentblockweight, currentblocktx
This commit is contained in:
parent
ad039aa0d3
commit
fa178a6385
7 changed files with 62 additions and 39 deletions
|
@ -263,6 +263,9 @@ in the Low-level Changes section below.
|
||||||
|
|
||||||
- See the [Mining](#mining) section for changes to `getblocktemplate`.
|
- See the [Mining](#mining) section for changes to `getblocktemplate`.
|
||||||
|
|
||||||
|
- The `getmininginfo` RPC now omits `currentblockweight` and `currentblocktx`
|
||||||
|
when a block was never assembled via RPC on this node.
|
||||||
|
|
||||||
- The `getrawtransaction` RPC & REST endpoints no longer check the
|
- The `getrawtransaction` RPC & REST endpoints no longer check the
|
||||||
unspent UTXO set for a transaction. The remaining behaviors are as
|
unspent UTXO set for a transaction. The remaining behaviors are as
|
||||||
follows: 1. If a blockhash is provided, check the corresponding block.
|
follows: 1. If a blockhash is provided, check the corresponding block.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||||
// Copyright (c) 2009-2018 The Bitcoin Core developers
|
// Copyright (c) 2009-2019 The Bitcoin Core developers
|
||||||
// Distributed under the MIT software license, see the accompanying
|
// Distributed under the MIT software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
@ -10,8 +10,8 @@
|
||||||
#include <chainparams.h>
|
#include <chainparams.h>
|
||||||
#include <coins.h>
|
#include <coins.h>
|
||||||
#include <consensus/consensus.h>
|
#include <consensus/consensus.h>
|
||||||
#include <consensus/tx_verify.h>
|
|
||||||
#include <consensus/merkle.h>
|
#include <consensus/merkle.h>
|
||||||
|
#include <consensus/tx_verify.h>
|
||||||
#include <consensus/validation.h>
|
#include <consensus/validation.h>
|
||||||
#include <hash.h>
|
#include <hash.h>
|
||||||
#include <net.h>
|
#include <net.h>
|
||||||
|
@ -21,22 +21,14 @@
|
||||||
#include <primitives/transaction.h>
|
#include <primitives/transaction.h>
|
||||||
#include <script/standard.h>
|
#include <script/standard.h>
|
||||||
#include <timedata.h>
|
#include <timedata.h>
|
||||||
#include <util/system.h>
|
|
||||||
#include <util/moneystr.h>
|
#include <util/moneystr.h>
|
||||||
|
#include <util/system.h>
|
||||||
#include <validationinterface.h>
|
#include <validationinterface.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
// Unconfirmed transactions in the memory pool often depend on other
|
|
||||||
// transactions in the memory pool. When we select transactions from the
|
|
||||||
// pool, we select by highest fee rate of a transaction combined with all
|
|
||||||
// its ancestors.
|
|
||||||
|
|
||||||
uint64_t nLastBlockTx = 0;
|
|
||||||
uint64_t nLastBlockWeight = 0;
|
|
||||||
|
|
||||||
int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)
|
int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)
|
||||||
{
|
{
|
||||||
int64_t nOldTime = pblock->nTime;
|
int64_t nOldTime = pblock->nTime;
|
||||||
|
@ -95,6 +87,9 @@ void BlockAssembler::resetBlock()
|
||||||
nFees = 0;
|
nFees = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Optional<int64_t> BlockAssembler::m_last_block_num_txs{nullopt};
|
||||||
|
Optional<int64_t> BlockAssembler::m_last_block_weight{nullopt};
|
||||||
|
|
||||||
std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& scriptPubKeyIn)
|
std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& scriptPubKeyIn)
|
||||||
{
|
{
|
||||||
int64_t nTimeStart = GetTimeMicros();
|
int64_t nTimeStart = GetTimeMicros();
|
||||||
|
@ -147,8 +142,8 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
|
||||||
|
|
||||||
int64_t nTime1 = GetTimeMicros();
|
int64_t nTime1 = GetTimeMicros();
|
||||||
|
|
||||||
nLastBlockTx = nBlockTx;
|
m_last_block_num_txs = nBlockTx;
|
||||||
nLastBlockWeight = nBlockWeight;
|
m_last_block_weight = nBlockWeight;
|
||||||
|
|
||||||
// Create coinbase transaction.
|
// Create coinbase transaction.
|
||||||
CMutableTransaction coinbaseTx;
|
CMutableTransaction coinbaseTx;
|
||||||
|
|
|
@ -1,17 +1,19 @@
|
||||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||||
// Copyright (c) 2009-2018 The Bitcoin Core developers
|
// Copyright (c) 2009-2019 The Bitcoin Core developers
|
||||||
// Distributed under the MIT software license, see the accompanying
|
// Distributed under the MIT software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
#ifndef BITCOIN_MINER_H
|
#ifndef BITCOIN_MINER_H
|
||||||
#define BITCOIN_MINER_H
|
#define BITCOIN_MINER_H
|
||||||
|
|
||||||
|
#include <optional.h>
|
||||||
#include <primitives/block.h>
|
#include <primitives/block.h>
|
||||||
#include <txmempool.h>
|
#include <txmempool.h>
|
||||||
#include <validation.h>
|
#include <validation.h>
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#include <boost/multi_index_container.hpp>
|
#include <boost/multi_index_container.hpp>
|
||||||
#include <boost/multi_index/ordered_index.hpp>
|
#include <boost/multi_index/ordered_index.hpp>
|
||||||
|
|
||||||
|
@ -159,6 +161,9 @@ public:
|
||||||
/** Construct a new block template with coinbase to scriptPubKeyIn */
|
/** Construct a new block template with coinbase to scriptPubKeyIn */
|
||||||
std::unique_ptr<CBlockTemplate> CreateNewBlock(const CScript& scriptPubKeyIn);
|
std::unique_ptr<CBlockTemplate> CreateNewBlock(const CScript& scriptPubKeyIn);
|
||||||
|
|
||||||
|
static Optional<int64_t> m_last_block_num_txs;
|
||||||
|
static Optional<int64_t> m_last_block_weight;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// utility functions
|
// utility functions
|
||||||
/** Clear the block's state and prepare for assembling a new block */
|
/** Clear the block's state and prepare for assembling a new block */
|
||||||
|
|
|
@ -187,36 +187,36 @@ static UniValue generatetoaddress(const JSONRPCRequest& request)
|
||||||
|
|
||||||
static UniValue getmininginfo(const JSONRPCRequest& request)
|
static UniValue getmininginfo(const JSONRPCRequest& request)
|
||||||
{
|
{
|
||||||
if (request.fHelp || request.params.size() != 0)
|
if (request.fHelp || request.params.size() != 0) {
|
||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
RPCHelpMan{"getmininginfo",
|
RPCHelpMan{"getmininginfo",
|
||||||
"\nReturns a json object containing mining-related information.",
|
"\nReturns a json object containing mining-related information.",
|
||||||
{},
|
{},
|
||||||
RPCResult{
|
RPCResult{
|
||||||
"{\n"
|
"{\n"
|
||||||
" \"blocks\": nnn, (numeric) The current block\n"
|
" \"blocks\": nnn, (numeric) The current block\n"
|
||||||
" \"currentblockweight\": nnn, (numeric) The last block weight\n"
|
" \"currentblockweight\": nnn, (numeric, optional) The block weight of the last assembled block (only present if a block was ever assembled)\n"
|
||||||
" \"currentblocktx\": nnn, (numeric) The last block transaction\n"
|
" \"currentblocktx\": nnn, (numeric, optional) The number of block transactions of the last assembled block (only present if a block was ever assembled)\n"
|
||||||
" \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
|
" \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
|
||||||
" \"networkhashps\": nnn, (numeric) The network hashes per second\n"
|
" \"networkhashps\": nnn, (numeric) The network hashes per second\n"
|
||||||
" \"pooledtx\": n (numeric) The size of the mempool\n"
|
" \"pooledtx\": n (numeric) The size of the mempool\n"
|
||||||
" \"chain\": \"xxxx\", (string) current network name as defined in BIP70 (main, test, regtest)\n"
|
" \"chain\": \"xxxx\", (string) current network name as defined in BIP70 (main, test, regtest)\n"
|
||||||
" \"warnings\": \"...\" (string) any network and blockchain warnings\n"
|
" \"warnings\": \"...\" (string) any network and blockchain warnings\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
},
|
},
|
||||||
RPCExamples{
|
RPCExamples{
|
||||||
HelpExampleCli("getmininginfo", "")
|
HelpExampleCli("getmininginfo", "")
|
||||||
+ HelpExampleRpc("getmininginfo", "")
|
+ HelpExampleRpc("getmininginfo", "")
|
||||||
},
|
},
|
||||||
}.ToString());
|
}.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
|
|
||||||
UniValue obj(UniValue::VOBJ);
|
UniValue obj(UniValue::VOBJ);
|
||||||
obj.pushKV("blocks", (int)chainActive.Height());
|
obj.pushKV("blocks", (int)chainActive.Height());
|
||||||
obj.pushKV("currentblockweight", (uint64_t)nLastBlockWeight);
|
if (BlockAssembler::m_last_block_weight) obj.pushKV("currentblockweight", *BlockAssembler::m_last_block_weight);
|
||||||
obj.pushKV("currentblocktx", (uint64_t)nLastBlockTx);
|
if (BlockAssembler::m_last_block_num_txs) obj.pushKV("currentblocktx", *BlockAssembler::m_last_block_num_txs);
|
||||||
obj.pushKV("difficulty", (double)GetDifficulty(chainActive.Tip()));
|
obj.pushKV("difficulty", (double)GetDifficulty(chainActive.Tip()));
|
||||||
obj.pushKV("networkhashps", getnetworkhashps(request));
|
obj.pushKV("networkhashps", getnetworkhashps(request));
|
||||||
obj.pushKV("pooledtx", (uint64_t)mempool.size());
|
obj.pushKV("pooledtx", (uint64_t)mempool.size());
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||||
// Copyright (c) 2009-2018 The Bitcoin Core developers
|
// Copyright (c) 2009-2019 The Bitcoin Core developers
|
||||||
// Distributed under the MIT software license, see the accompanying
|
// Distributed under the MIT software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
@ -14,8 +14,8 @@
|
||||||
#include <coins.h>
|
#include <coins.h>
|
||||||
#include <crypto/common.h> // for ReadLE64
|
#include <crypto/common.h> // for ReadLE64
|
||||||
#include <fs.h>
|
#include <fs.h>
|
||||||
#include <protocol.h> // For CMessageHeader::MessageStartChars
|
|
||||||
#include <policy/feerate.h>
|
#include <policy/feerate.h>
|
||||||
|
#include <protocol.h> // For CMessageHeader::MessageStartChars
|
||||||
#include <script/script_error.h>
|
#include <script/script_error.h>
|
||||||
#include <sync.h>
|
#include <sync.h>
|
||||||
#include <versionbits.h>
|
#include <versionbits.h>
|
||||||
|
@ -152,8 +152,6 @@ extern CTxMemPool mempool;
|
||||||
extern std::atomic_bool g_is_mempool_loaded;
|
extern std::atomic_bool g_is_mempool_loaded;
|
||||||
typedef std::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap;
|
typedef std::unordered_map<uint256, CBlockIndex*, BlockHasher> BlockMap;
|
||||||
extern BlockMap& mapBlockIndex GUARDED_BY(cs_main);
|
extern BlockMap& mapBlockIndex GUARDED_BY(cs_main);
|
||||||
extern uint64_t nLastBlockTx;
|
|
||||||
extern uint64_t nLastBlockWeight;
|
|
||||||
extern const std::string strMessageMagic;
|
extern const std::string strMessageMagic;
|
||||||
extern Mutex g_best_block_mutex;
|
extern Mutex g_best_block_mutex;
|
||||||
extern std::condition_variable g_best_block_cv;
|
extern std::condition_variable g_best_block_cv;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# Copyright (c) 2014-2018 The Bitcoin Core developers
|
# Copyright (c) 2014-2019 The Bitcoin Core developers
|
||||||
# Distributed under the MIT software license, see the accompanying
|
# Distributed under the MIT software license, see the accompanying
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
"""Test mining RPCs
|
"""Test mining RPCs
|
||||||
|
@ -11,7 +11,10 @@
|
||||||
import copy
|
import copy
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
|
|
||||||
from test_framework.blocktools import create_coinbase
|
from test_framework.blocktools import (
|
||||||
|
create_coinbase,
|
||||||
|
TIME_GENESIS_BLOCK,
|
||||||
|
)
|
||||||
from test_framework.messages import (
|
from test_framework.messages import (
|
||||||
CBlock,
|
CBlock,
|
||||||
CBlockHeader,
|
CBlockHeader,
|
||||||
|
@ -24,9 +27,11 @@ from test_framework.util import (
|
||||||
assert_equal,
|
assert_equal,
|
||||||
assert_raises_rpc_error,
|
assert_raises_rpc_error,
|
||||||
bytes_to_hex_str as b2x,
|
bytes_to_hex_str as b2x,
|
||||||
|
connect_nodes_bi,
|
||||||
)
|
)
|
||||||
from test_framework.script import CScriptNum
|
from test_framework.script import CScriptNum
|
||||||
|
|
||||||
|
|
||||||
def assert_template(node, block, expect, rehash=True):
|
def assert_template(node, block, expect, rehash=True):
|
||||||
if rehash:
|
if rehash:
|
||||||
block.hashMerkleRoot = block.calc_merkle_root()
|
block.hashMerkleRoot = block.calc_merkle_root()
|
||||||
|
@ -37,9 +42,22 @@ def assert_template(node, block, expect, rehash=True):
|
||||||
class MiningTest(BitcoinTestFramework):
|
class MiningTest(BitcoinTestFramework):
|
||||||
def set_test_params(self):
|
def set_test_params(self):
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = False
|
self.setup_clean_chain = True
|
||||||
|
|
||||||
|
def mine_chain(self):
|
||||||
|
self.log.info('Create some old blocks')
|
||||||
|
for t in range(TIME_GENESIS_BLOCK, TIME_GENESIS_BLOCK + 200 * 600, 600):
|
||||||
|
self.nodes[0].setmocktime(t)
|
||||||
|
self.nodes[0].generate(1)
|
||||||
|
mining_info = self.nodes[0].getmininginfo()
|
||||||
|
assert_equal(mining_info['blocks'], 200)
|
||||||
|
assert_equal(mining_info['currentblocktx'], 0)
|
||||||
|
assert_equal(mining_info['currentblockweight'], 4000)
|
||||||
|
self.restart_node(0)
|
||||||
|
connect_nodes_bi(self.nodes, 0, 1)
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
self.mine_chain()
|
||||||
node = self.nodes[0]
|
node = self.nodes[0]
|
||||||
|
|
||||||
def assert_submitblock(block, result_str_1, result_str_2=None):
|
def assert_submitblock(block, result_str_1, result_str_2=None):
|
||||||
|
@ -52,8 +70,8 @@ class MiningTest(BitcoinTestFramework):
|
||||||
mining_info = node.getmininginfo()
|
mining_info = node.getmininginfo()
|
||||||
assert_equal(mining_info['blocks'], 200)
|
assert_equal(mining_info['blocks'], 200)
|
||||||
assert_equal(mining_info['chain'], 'regtest')
|
assert_equal(mining_info['chain'], 'regtest')
|
||||||
assert_equal(mining_info['currentblocktx'], 0)
|
assert 'currentblocktx' not in mining_info
|
||||||
assert_equal(mining_info['currentblockweight'], 0)
|
assert 'currentblockweight' not in mining_info
|
||||||
assert_equal(mining_info['difficulty'], Decimal('4.656542373906925E-10'))
|
assert_equal(mining_info['difficulty'], Decimal('4.656542373906925E-10'))
|
||||||
assert_equal(mining_info['networkhashps'], Decimal('0.003333333333333334'))
|
assert_equal(mining_info['networkhashps'], Decimal('0.003333333333333334'))
|
||||||
assert_equal(mining_info['pooledtx'], 0)
|
assert_equal(mining_info['pooledtx'], 0)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# Copyright (c) 2015-2018 The Bitcoin Core developers
|
# Copyright (c) 2015-2019 The Bitcoin Core developers
|
||||||
# Distributed under the MIT software license, see the accompanying
|
# Distributed under the MIT software license, see the accompanying
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
"""Utilities for manipulating blocks and transactions."""
|
"""Utilities for manipulating blocks and transactions."""
|
||||||
|
@ -43,9 +43,13 @@ from io import BytesIO
|
||||||
|
|
||||||
MAX_BLOCK_SIGOPS = 20000
|
MAX_BLOCK_SIGOPS = 20000
|
||||||
|
|
||||||
|
# Genesis block time (regtest)
|
||||||
|
TIME_GENESIS_BLOCK = 1296688602
|
||||||
|
|
||||||
# From BIP141
|
# From BIP141
|
||||||
WITNESS_COMMITMENT_HEADER = b"\xaa\x21\xa9\xed"
|
WITNESS_COMMITMENT_HEADER = b"\xaa\x21\xa9\xed"
|
||||||
|
|
||||||
|
|
||||||
def create_block(hashprev, coinbase, ntime=None, *, version=1):
|
def create_block(hashprev, coinbase, ntime=None, *, version=1):
|
||||||
"""Create a block (with regtest difficulty)."""
|
"""Create a block (with regtest difficulty)."""
|
||||||
block = CBlock()
|
block = CBlock()
|
||||||
|
|
Loading…
Reference in a new issue