Merge #12317: Document method for reviewers to verify chainTxData
7444149
Document method for reviewers to verify chainTxData (John Newbery)
Pull request description:
This commit adds the final block hash of the window to getchaintxstats
and documents how reviewers can verify changes to chainTxData.
Tree-SHA512: d16abb5f47d058e52660f4d495f1e453205b1b83716d7c810ff62a70338db721386c1808ec1fc8468f514e4d80cc58e3c96eeb3184cbbcb1d07830fa5e53f342
This commit is contained in:
commit
85123be78d
3 changed files with 19 additions and 12 deletions
|
@ -24,7 +24,7 @@ Before every major release:
|
||||||
* Update hardcoded [seeds](/contrib/seeds/README.md), see [this pull request](https://github.com/bitcoin/bitcoin/pull/7415) for an example.
|
* Update hardcoded [seeds](/contrib/seeds/README.md), see [this pull request](https://github.com/bitcoin/bitcoin/pull/7415) for an example.
|
||||||
* Update [`BLOCK_CHAIN_SIZE`](/src/qt/intro.cpp) to the current size plus some overhead.
|
* Update [`BLOCK_CHAIN_SIZE`](/src/qt/intro.cpp) to the current size plus some overhead.
|
||||||
* Update `src/chainparams.cpp` chainTxData with statistics about the transaction count and rate. Use the output of the RPC `getchaintxstats`, see
|
* Update `src/chainparams.cpp` chainTxData with statistics about the transaction count and rate. Use the output of the RPC `getchaintxstats`, see
|
||||||
[this pull request](https://github.com/bitcoin/bitcoin/pull/12270) for an example.
|
[this pull request](https://github.com/bitcoin/bitcoin/pull/12270) for an example. Reviewers can verify the results by running `getchaintxstats <window_block_count> <window_last_block_hash>` with the `window_block_count` and `window_last_block_hash` from your output.
|
||||||
* Update version of `contrib/gitian-descriptors/*.yml`: usually one'd want to do this on master after branching off the release - but be sure to at least do it before a new major release
|
* Update version of `contrib/gitian-descriptors/*.yml`: usually one'd want to do this on master after branching off the release - but be sure to at least do it before a new major release
|
||||||
|
|
||||||
### First time / New builders
|
### First time / New builders
|
||||||
|
|
|
@ -1528,6 +1528,7 @@ UniValue getchaintxstats(const JSONRPCRequest& request)
|
||||||
"{\n"
|
"{\n"
|
||||||
" \"time\": xxxxx, (numeric) The timestamp for the final block in the window in UNIX format.\n"
|
" \"time\": xxxxx, (numeric) The timestamp for the final block in the window in UNIX format.\n"
|
||||||
" \"txcount\": xxxxx, (numeric) The total number of transactions in the chain up to that point.\n"
|
" \"txcount\": xxxxx, (numeric) The total number of transactions in the chain up to that point.\n"
|
||||||
|
" \"window_final_block_hash\": \"...\", (string) The hash of the final block in the window.\n"
|
||||||
" \"window_block_count\": xxxxx, (numeric) Size of the window in number of blocks.\n"
|
" \"window_block_count\": xxxxx, (numeric) Size of the window in number of blocks.\n"
|
||||||
" \"window_tx_count\": xxxxx, (numeric) The number of transactions in the window. Only returned if \"window_block_count\" is > 0.\n"
|
" \"window_tx_count\": xxxxx, (numeric) The number of transactions in the window. Only returned if \"window_block_count\" is > 0.\n"
|
||||||
" \"window_interval\": xxxxx, (numeric) The elapsed time in the window in seconds. Only returned if \"window_block_count\" is > 0.\n"
|
" \"window_interval\": xxxxx, (numeric) The elapsed time in the window in seconds. Only returned if \"window_block_count\" is > 0.\n"
|
||||||
|
@ -1582,6 +1583,7 @@ UniValue getchaintxstats(const JSONRPCRequest& request)
|
||||||
UniValue ret(UniValue::VOBJ);
|
UniValue ret(UniValue::VOBJ);
|
||||||
ret.push_back(Pair("time", (int64_t)pindex->nTime));
|
ret.push_back(Pair("time", (int64_t)pindex->nTime));
|
||||||
ret.push_back(Pair("txcount", (int64_t)pindex->nChainTx));
|
ret.push_back(Pair("txcount", (int64_t)pindex->nChainTx));
|
||||||
|
ret.push_back(Pair("window_final_block_hash", pindex->GetBlockHash().GetHex()));
|
||||||
ret.push_back(Pair("window_block_count", blockcount));
|
ret.push_back(Pair("window_block_count", blockcount));
|
||||||
if (blockcount > 0) {
|
if (blockcount > 0) {
|
||||||
ret.push_back(Pair("window_tx_count", nTxDiff));
|
ret.push_back(Pair("window_tx_count", nTxDiff));
|
||||||
|
|
|
@ -100,6 +100,8 @@ class BlockchainTest(BitcoinTestFramework):
|
||||||
assert_greater_than(res['size_on_disk'], 0)
|
assert_greater_than(res['size_on_disk'], 0)
|
||||||
|
|
||||||
def _test_getchaintxstats(self):
|
def _test_getchaintxstats(self):
|
||||||
|
self.log.info("Test getchaintxstats")
|
||||||
|
|
||||||
chaintxstats = self.nodes[0].getchaintxstats(1)
|
chaintxstats = self.nodes[0].getchaintxstats(1)
|
||||||
# 200 txs plus genesis tx
|
# 200 txs plus genesis tx
|
||||||
assert_equal(chaintxstats['txcount'], 201)
|
assert_equal(chaintxstats['txcount'], 201)
|
||||||
|
@ -107,21 +109,25 @@ class BlockchainTest(BitcoinTestFramework):
|
||||||
# we have to round because of binary math
|
# we have to round because of binary math
|
||||||
assert_equal(round(chaintxstats['txrate'] * 600, 10), Decimal(1))
|
assert_equal(round(chaintxstats['txrate'] * 600, 10), Decimal(1))
|
||||||
|
|
||||||
b1 = self.nodes[0].getblock(self.nodes[0].getblockhash(1))
|
b1_hash = self.nodes[0].getblockhash(1)
|
||||||
b200 = self.nodes[0].getblock(self.nodes[0].getblockhash(200))
|
b1 = self.nodes[0].getblock(b1_hash)
|
||||||
|
b200_hash = self.nodes[0].getblockhash(200)
|
||||||
|
b200 = self.nodes[0].getblock(b200_hash)
|
||||||
time_diff = b200['mediantime'] - b1['mediantime']
|
time_diff = b200['mediantime'] - b1['mediantime']
|
||||||
|
|
||||||
chaintxstats = self.nodes[0].getchaintxstats()
|
chaintxstats = self.nodes[0].getchaintxstats()
|
||||||
assert_equal(chaintxstats['time'], b200['time'])
|
assert_equal(chaintxstats['time'], b200['time'])
|
||||||
assert_equal(chaintxstats['txcount'], 201)
|
assert_equal(chaintxstats['txcount'], 201)
|
||||||
|
assert_equal(chaintxstats['window_final_block_hash'], b200_hash)
|
||||||
assert_equal(chaintxstats['window_block_count'], 199)
|
assert_equal(chaintxstats['window_block_count'], 199)
|
||||||
assert_equal(chaintxstats['window_tx_count'], 199)
|
assert_equal(chaintxstats['window_tx_count'], 199)
|
||||||
assert_equal(chaintxstats['window_interval'], time_diff)
|
assert_equal(chaintxstats['window_interval'], time_diff)
|
||||||
assert_equal(round(chaintxstats['txrate'] * time_diff, 10), Decimal(199))
|
assert_equal(round(chaintxstats['txrate'] * time_diff, 10), Decimal(199))
|
||||||
|
|
||||||
chaintxstats = self.nodes[0].getchaintxstats(blockhash=b1['hash'])
|
chaintxstats = self.nodes[0].getchaintxstats(blockhash=b1_hash)
|
||||||
assert_equal(chaintxstats['time'], b1['time'])
|
assert_equal(chaintxstats['time'], b1['time'])
|
||||||
assert_equal(chaintxstats['txcount'], 2)
|
assert_equal(chaintxstats['txcount'], 2)
|
||||||
|
assert_equal(chaintxstats['window_final_block_hash'], b1_hash)
|
||||||
assert_equal(chaintxstats['window_block_count'], 0)
|
assert_equal(chaintxstats['window_block_count'], 0)
|
||||||
assert('window_tx_count' not in chaintxstats)
|
assert('window_tx_count' not in chaintxstats)
|
||||||
assert('window_interval' not in chaintxstats)
|
assert('window_interval' not in chaintxstats)
|
||||||
|
@ -173,8 +179,7 @@ class BlockchainTest(BitcoinTestFramework):
|
||||||
def _test_getblockheader(self):
|
def _test_getblockheader(self):
|
||||||
node = self.nodes[0]
|
node = self.nodes[0]
|
||||||
|
|
||||||
assert_raises_rpc_error(-5, "Block not found",
|
assert_raises_rpc_error(-5, "Block not found", node.getblockheader, "nonsense")
|
||||||
node.getblockheader, "nonsense")
|
|
||||||
|
|
||||||
besthash = node.getbestblockhash()
|
besthash = node.getbestblockhash()
|
||||||
secondbesthash = node.getblockhash(199)
|
secondbesthash = node.getblockhash(199)
|
||||||
|
|
Loading…
Reference in a new issue