Project Information
- Repository: https://github.com/holgern/beem
- Project Name: Beem
- Publisher: @holger80
A GitHub issue and a PR to fix the problem were provided and merged to master. The fix will be included in the next release.
Expected result
Blockchain.stream/blocks(start, stop, only_ops=True) should return all ops in the given block range. Additionally using threading=True should eventually speed things up.
Actual result
Blockchain.stream/blocks(start, stop, only_ops=True, threading=True) prints errors
int() argument must be a string, a bytes-like object or a number, not 'NoneType'
and never completes.
How to reproduce
from beem.blockchain import Blockchain
b = Blockchain()
for op in b.blocks(start=25000000, stop=25000010, only_ops=True,
threading=True):
continue
Output:
int() argument must be a string, a bytes-like object or a number, not 'NoneType'
int() argument must be a string, a bytes-like object or a number, not 'NoneType'
int() argument must be a string, a bytes-like object or a number, not 'NoneType'
int() argument must be a string, a bytes-like object or a number, not 'NoneType'
int() argument must be a string, a bytes-like object or a number, not 'NoneType'
int() argument must be a string, a bytes-like object or a number, not 'NoneType'
...
Cause/Fix
When only_ops=False (default), beem uses the get_block API call. The get_block() answer contains the block_id field, which is correctly parsed by Block.block_num here.
When only_ops=True, beem uses the get_ops_in_block API call, which also includes virtual operations (e.g. author/curation rewards etc.) The get_ops_in_block() answer, however, does not contain a block_id field. Calling Block.block_num on this data returns None, causing the threads bookkeeping logic to fail to register the received block data. The Blockchain.blocks() logic then endlessly retries to fetch the corresponding block data.
The get_ops_in_block() answer contains the corresponding block number in a block field. By adding a check for the block field into the Block.block_num method, both cases can be treated correctly and Blockchain.blocks() doesn't run into int(None) errors anymore here.
Environment
# beempy --version
beempy, version 0.20.12
# python --version
Python 3.6.6