main_blocks_info.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
  4. # Copyright (C)2013-2021 The MMGen Project <mmgen@tuta.io>
  5. #
  6. # This program is free software: you can redistribute it and/or modify it under
  7. # the terms of the GNU General Public License as published by the Free Software
  8. # Foundation, either version 3 of the License, or (at your option) any later
  9. # version.
  10. #
  11. # This program is distributed in the hope that it will be useful, but WITHOUT
  12. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  13. # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  14. # details.
  15. #
  16. # You should have received a copy of the GNU General Public License along with
  17. # this program. If not, see <http://www.gnu.org/licenses/>.
  18. """
  19. mmnode-blocks-info: Display information about a block or range of blocks
  20. """
  21. from mmgen.common import *
  22. from .BlocksInfo import BlocksInfo,JSONBlocksInfo
  23. opts_data = {
  24. 'sets': [
  25. ('header_info', True, 'fields', None),
  26. ('header_info', True, 'miner_info', None),
  27. ('header_info', True, 'stats', 'range'),
  28. ('json_raw', True, 'json', True),
  29. ('raw_miner_info', True, 'miner_info', True),
  30. ('stats_only', True, 'no_header', True),
  31. ],
  32. 'text': {
  33. 'desc': 'Display information about a block or range of blocks',
  34. 'usage': '[opts] blocknum ... | blocknum-blocknum[+step] | [blocknum|-nBlocks]+nBlocks[+step]',
  35. 'usage2': [
  36. '[opts] blocknum ...',
  37. '[opts] blocknum-blocknum[+step]',
  38. '[opts] [blocknum|-nBlocks]+nBlocks[+step]',
  39. ],
  40. 'options': """
  41. -h, --help Print this help message
  42. --, --longhelp Print help message for long options (common options)
  43. -f, --full-stats Stats that relate to a specific field are shown only
  44. if that field is configured, whether by default or via
  45. the --fields option. This option adds the fields req-
  46. uired to produce a full display of configured stats.
  47. -H, --header-info Display information from block headers only
  48. -j, --json Produce JSON output
  49. -J, --json-raw Produce JSON output with unformatted values
  50. -m, --miner-info Display miner info in coinbase transaction
  51. -M, --raw-miner-info Display miner info in uninterpreted form
  52. -n, --no-header Don’t print the column header
  53. -o, --fields= Display the specified fields (comma-separated list).
  54. See AVAILABLE FIELDS below. Prefix the list with '+'
  55. to add the fields to the defaults, or '-' to remove
  56. them. The special values 'all' and 'none' select all
  57. available fields or none, respectively. The '+' and
  58. '-'-prefixed lists may be concatenated to specify both
  59. addition and removal of fields. A single '-'-prefixed
  60. list may be additionally prefixed by 'all'.
  61. -s, --stats= Display the specified stats (comma-separated list).
  62. See AVAILABLE STATS below. The prefixes and special
  63. values available to the --fields option are recognized.
  64. -S, --stats-only Display stats only. Suppress display of per-block data.
  65. """,
  66. 'notes': """
  67. If no block number is specified, the current chain tip is assumed.
  68. The special value 'cur' can be used to designate the chain tip wherever a
  69. block number is expected.
  70. If the requested range ends at the current chain tip, an estimate of the next
  71. difficulty adjustment is also displayed. The estimate is based on the average
  72. Block Discovery Interval from the beginning of the current {I}-block period.
  73. All fee fields except for 'totalfee' are in satoshis per virtual byte.
  74. AVAILABLE FIELDS: {F}
  75. AVAILABLE STATS: {S}
  76. EXAMPLES:
  77. Display info for current block:
  78. $ {p}
  79. Display info for the Genesis Block:
  80. $ {p} 0
  81. Display info for the last 20 blocks:
  82. $ {p} +20
  83. Display specified fields for blocks 165-190
  84. $ {p} -o block,date,size,inputs,nTx 165-190
  85. Display info for 10 blocks beginning at block 600000:
  86. $ {p} 600000+10
  87. Display info for every 5th block of 50-block range beginning at 1000
  88. blocks from chain tip:
  89. $ {p} -- -1000+50+5
  90. Display info for block 152817, adding miner field:
  91. $ {p} -o +miner 152817
  92. Display specified fields for listed blocks:
  93. $ {p} -o block,date,hash 245798 170 624044
  94. Display every difficulty adjustment from Genesis Block to chain tip:
  95. $ {p} -o +difficulty 0-cur+{I}
  96. Display roughly a block a day over the last two weeks. Note that
  97. multiplication is allowed in the nBlocks spec:
  98. $ {p} +144*14+144
  99. Display only range stats for the last ten blocks:
  100. $ {p} -o none -s range +10
  101. Display data for the last ten blocks, omitting the 'size' and 'subsidy'
  102. fields from the defaults and skipping stats:
  103. $ {p} -o -size,subsidy -s none +10
  104. Display data for the last ten blocks, omitting the 'size' and 'version'
  105. fields from the defaults and adding the 'inputs' and 'utxo_inc' fields:
  106. $ {p} -o -version,size+utxo_inc,inputs +10
  107. Display all fields and stats for the last ten blocks:
  108. $ {p} -o all -s all +10
  109. Same as above, but omit the 'miner' and 'hash' fields:
  110. $ {p} -o all-miner,hash -s all +10
  111. Same as above, but display only fields relating to stats:
  112. $ {p} -o none -s all -f +10
  113. Same as above, but display stats only:
  114. $ {p} -o none -s all -fS +10
  115. Display headers-only info for the last 1000 blocks. Speed up execution
  116. using the async RPC backend:
  117. $ {p} --rpc-backend=aio -H +1000
  118. This program requires a txindex-enabled daemon for correct operation.
  119. """ },
  120. 'code': {
  121. 'notes': lambda proto,s: s.format(
  122. I = proto.diff_adjust_interval,
  123. F = fmt_list(BlocksInfo.fields,fmt='bare'),
  124. S = fmt_list(BlocksInfo.all_stats,fmt='bare'),
  125. p = g.prog_name,
  126. )
  127. }
  128. }
  129. cmd_args = opts.init(opts_data)
  130. async def main():
  131. from mmgen.protocol import init_proto_from_opts
  132. from mmgen.rpc import rpc_init
  133. proto = init_proto_from_opts(need_amt=True)
  134. cls = JSONBlocksInfo if opt.json else BlocksInfo
  135. m = cls( cmd_args, opt, await rpc_init(proto) )
  136. if m.fnames and not opt.no_header:
  137. m.print_header()
  138. await m.process_blocks()
  139. if m.last:
  140. for i,sname in enumerate(m.stats):
  141. m.process_stats_pre(i)
  142. await m.process_stats(sname)
  143. m.finalize_output()
  144. async_run(main())