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:
Wladimir J. van der Laan 2018-02-02 17:57:01 +01:00
commit 85123be78d
No known key found for this signature in database
GPG key ID: 1E4AED62986CD25D
3 changed files with 19 additions and 12 deletions

View file

@ -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

View file

@ -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));

View file

@ -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)