mmnode-blocks-info: --hashes -> --header-info; block list optimizations

This commit is contained in:
The MMGen Project 2021-03-22 14:32:58 +00:00
commit 52fb93ba73
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
2 changed files with 36 additions and 25 deletions

View file

@ -164,6 +164,7 @@ class BlocksInfo:
self.block_list,self.first,self.last,self.step = parse_cmd_args()
self.fnames = tuple(
[f for f in self.fields if self.fields[f].src == 'bh' or f == 'interval'] if opt.header_info else
get_fields() if opt.fields else
self.dfl_fields
)
@ -203,7 +204,7 @@ class BlocksInfo:
self.deps = set(
[v.src for v in self.fvals] +
# display full range stats if no fields selected
(['bs'] if 'range' in self.stats else [])
(['bs'] if 'range' in self.stats and not self.fvals else [])
)
def gen_fs(self,fnames,fill=[],fill_char='-',add_name=False):
@ -316,27 +317,30 @@ class BlocksInfo:
async def process_blocks(self):
async def get_hdrs(heights):
hashes = await c.gathered_call('getblockhash',[(height,) for height in heights])
return await c.gathered_call('getblockheader',[(H,) for H in hashes])
c = self.rpc
heights = self.block_list or range(self.first,self.last+1)
hashes = await c.gathered_call('getblockhash',[(height,) for height in heights])
self.hdrs = await c.gathered_call('getblockheader',[(H,) for H in hashes])
self.hdrs = await get_hdrs(heights)
async def init(count):
h0 = (
self.hdrs[count] if heights[count] == 0 else
await c.call('getblockheader',await c.call('getblockhash',heights[count]-1))
if self.block_list:
self.prev_hdrs = await get_hdrs([(n-1 if n else 0) for n in self.block_list])
self.first_prev_hdr = self.prev_hdrs[0]
else:
self.first_prev_hdr = (
self.hdrs[0] if heights[0] == 0 else
await c.call('getblockheader',await c.call('getblockhash',heights[0]-1))
)
self.t_cur = h0['time']
if count == 0:
self.first_prev_hdr = h0
if not self.block_list:
await init(0)
self.t_cur = self.first_prev_hdr['time']
self.res = []
for n in range(len(heights)):
if self.block_list:
await init(n)
self.t_cur = self.prev_hdrs[n]['time']
ret = await self.process_block(self.hdrs[n])
self.res.append(ret)
if self.fnames:
@ -449,12 +453,14 @@ class BlocksInfo:
}
)
if elapsed:
avg_bdi = int(elapsed / nblocks)
rate = (self.total_bytes / 10000) / (self.total_solve_time / 36)
yield ( 'Avg size: {} bytes', 'avg_size', '{}', self.total_bytes//total_blks )
yield ( 'Avg weight: {} bytes', 'avg_weight', '{}', self.total_weight//total_blks )
yield ( 'MB/hr: {}', 'mb_per_hour', '{:0.4f}', rate )
yield ( 'Avg BDI: {} min', 'avg_bdi', '{:.2f}', avg_bdi/60 )
if 'bs' in self.deps:
rate = (self.total_bytes / 10000) / (self.total_solve_time / 36)
yield ( 'Avg size: {} bytes', 'avg_size', '{}', self.total_bytes//total_blks )
yield ( 'Avg weight: {} bytes', 'avg_weight', '{}', self.total_weight//total_blks )
yield ( 'MB/hr: {}', 'mb_per_hour', '{:0.4f}', rate )
yield ( 'Start: {}', 'start_date', self.fmt_funcs['da'], self.hdrs[0]['time'] )
yield ( 'End: {}', 'end_date', self.fmt_funcs['da'], self.hdrs[-1]['time'] )
yield ( 'Avg BDI: {} min', 'avg_bdi', '{:.2f}', elapsed / nblocks / 60 )
return ( 'range', gen() )

View file

@ -25,10 +25,11 @@ from mmgen.node_tools.BlocksInfo import BlocksInfo,JSONBlocksInfo
opts_data = {
'sets': [
('hashes', True, 'fields', 'block,hash'),
('hashes', True, 'stats', 'none'),
('json_raw', True, 'json', True),
('raw_miner_info',True,'miner_info', True),
('header_info', True, 'fields', None),
('header_info', True, 'miner_info', None),
('header_info', True, 'stats', 'range'),
('json_raw', True, 'json', True),
('raw_miner_info', True, 'miner_info', True),
],
'text': {
'desc': 'Display information about a block or range of blocks',
@ -41,7 +42,7 @@ opts_data = {
'options': """
-h, --help Print this help message
--, --longhelp Print help message for long options (common options)
-H, --hashes Display only block numbers and hashes
-H, --header-info Display information from block headers only
-j, --json Produce JSON output
-J, --json-raw Produce JSON output with unformatted values
-m, --miner-info Display miner info in coinbase transaction
@ -116,6 +117,10 @@ EXAMPLES:
Display all fields and stats for the last ten blocks:
$ {p} -o all -s all +10
Display headers-only info for the last 1000 blocks. Speed up execution
using the async RPC backend:
$ {p} --rpc-backend=aio -H +1000
This program requires a txindex-enabled daemon for correct operation.
""".format(
f = fmt_list(BlocksInfo.fields,fmt='bare'),