mmnode-blocks-info: store internal data in unformatted form

This commit is contained in:
The MMGen Project 2021-03-20 21:29:22 +00:00
commit 0dfdcf7372
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2

View file

@ -97,15 +97,14 @@ class BlocksInfo:
all_stats = ['range','diff']
dfl_stats = ['range','diff']
funcs = {
'df': lambda self,loc: strftime('%Y-%m-%d %X',gmtime(self.t_cur)),
'td': lambda self,loc: (
'-{:02}:{:02}'.format(abs(self.t_diff)//60,abs(self.t_diff)%60) if self.t_diff < 0 else
' {:02}:{:02}'.format(self.t_diff//60,self.t_diff%60) ),
'tf': lambda self,loc: '{:.8f}'.format(loc.bs["totalfee"] * Decimal('0.00000001')),
'fp': lambda self,loc: loc.bs['feerate_percentiles'],
'su': lambda self,loc: str(loc.bs['subsidy'] * Decimal('0.00000001')).rstrip('0').rstrip('.'),
'di': lambda self,loc: '{:.2e}'.format(loc.bh['difficulty']),
fmt_funcs = {
'df': lambda arg: strftime('%Y-%m-%d %X',gmtime(arg)),
'td': lambda arg: (
'-{:02}:{:02}'.format(abs(arg)//60,abs(self.t_diff)%60) if arg < 0 else
' {:02}:{:02}'.format(arg//60,arg%60) ),
'tf': lambda arg: '{:.8f}'.format(arg * Decimal('0.00000001')),
'su': lambda arg: str(arg * Decimal('0.00000001')).rstrip('0').rstrip('.'),
'di': lambda arg: '{:.2e}'.format(arg),
}
range_data = namedtuple('parsed_range_data',['first','last','from_tip','nblocks','step'])
@ -159,10 +158,10 @@ class BlocksInfo:
self.fs = ''.join(self.gen_fs(fnames)).strip()
self.deps = set(' '.join(v.varname + ' ' + ' '.join(v.deps) for v in self.fvals).split())
self.bs_keys = [(v.bs_key or v.key) for v in self.fvals if v.bs_key or v.varname == 'bs']
self.bs_keys.extend(['total_size','total_weight'])
self.ufuncs = {v.varname:self.funcs[v.varname] for v in self.fvals if v.varname in self.funcs}
self.bs_keys = set(
[(v.bs_key or v.key) for v in self.fvals if v.bs_key or v.varname == 'bs']
+ ['total_size','total_weight'] )
self.blk_data_bs_add = set([(v.varname,v.bs_key) for v in self.fvals if v.bs_key in self.bs_keys])
if opt.miner_info:
fnames.append('miner')
@ -321,26 +320,34 @@ class BlocksInfo:
self.output_block(ret,n)
def output_block(self,data,n):
Msg(self.fs.format(*data))
def gen():
for k,v in data._asdict().items():
vn = self.fields[k].varname
yield self.fmt_funcs[vn](v) if vn in self.fmt_funcs else v
Msg(self.fs.format(*gen()))
async def process_block(self,height,H,hdr):
class local_vars: pass
loc = local_vars()
loc.height = height
loc.H = H
loc.bh = hdr
self.t_diff = hdr['time'] - self.t_cur
self.t_cur = hdr['time']
self.total_solve_time += self.t_diff
if 'bs' in self.deps:
loc.bs = self.genesis_stats if height == 0 else await self.rpc.call('getblockstats',H,self.bs_keys)
self.total_bytes += loc.bs['total_size']
self.total_weight += loc.bs['total_weight']
blk_data = {
'height': height,
'H': H,
'bh': hdr,
'df': self.t_cur,
'td': self.t_diff,
'di': hdr['difficulty']
}
for varname,func in self.ufuncs.items():
setattr(loc,varname,func(self,loc))
if 'bs' in self.deps:
bs = self.genesis_stats if height == 0 else await self.rpc.call('getblockstats',H,list(self.bs_keys))
self.total_bytes += bs['total_size']
self.total_weight += bs['total_weight']
blk_data['bs'] = bs
for k1,k2 in self.blk_data_bs_add:
blk_data[k1] = bs[k2]
if self.opt.miner_info:
miner_info = '-' if height == 0 else await self.get_miner_string(H)
@ -348,9 +355,9 @@ class BlocksInfo:
def gen():
for v in self.fvals:
if v.key is None:
yield getattr(loc,v.varname)
yield blk_data[v.varname]
else:
yield getattr(loc,v.varname)[v.key]
yield blk_data[v.varname][v.key]
if self.opt.miner_info:
yield miner_info
@ -522,7 +529,11 @@ class JSONBlocksInfo(BlocksInfo):
Msg_r(']')
def output_block(self,data,n):
Msg_r( (', ','')[n==0] + json.dumps(data._asdict()) )
def gen():
for k,v in data._asdict().items():
vn = self.fields[k].varname
yield ( k, (self.fmt_funcs[vn](v) if vn in self.fmt_funcs else v) )
Msg_r(json.dumps(dict(gen())))
async def output_stats(self,res):
def gen(data):