Skip to content
Snippets Groups Projects
Unverified Commit c240e80a authored by Holger Nahrstaedt's avatar Holger Nahrstaedt Committed by GitHub
Browse files

Merge pull request #272 from crokkon/vopt_batch_stream

correct blockchain virtual op batch calls
parents f51b914c a05d8cbd
No related branches found
No related tags found
2 merge requests!5Taken current version of master branch in the https://github.com/holgern/beem,!4Original changes pushed to master at https://github.com/holgern/beem
...@@ -221,7 +221,7 @@ class Blockchain(object): ...@@ -221,7 +221,7 @@ class Blockchain(object):
if kwargs.get("steem_instance"): if kwargs.get("steem_instance"):
blockchain_instance = kwargs["steem_instance"] blockchain_instance = kwargs["steem_instance"]
elif kwargs.get("hive_instance"): elif kwargs.get("hive_instance"):
blockchain_instance = kwargs["hive_instance"] blockchain_instance = kwargs["hive_instance"]
self.blockchain = blockchain_instance or shared_blockchain_instance() self.blockchain = blockchain_instance or shared_blockchain_instance()
if mode == "irreversible": if mode == "irreversible":
...@@ -313,7 +313,7 @@ class Blockchain(object): ...@@ -313,7 +313,7 @@ class Blockchain(object):
when instantiating from this class. when instantiating from this class.
.. code-block:: python .. code-block:: python
>>> from beem.blockchain import Blockchain >>> from beem.blockchain import Blockchain
>>> from datetime import datetime >>> from datetime import datetime
>>> blockchain = Blockchain() >>> blockchain = Blockchain()
...@@ -339,10 +339,10 @@ class Blockchain(object): ...@@ -339,10 +339,10 @@ class Blockchain(object):
if block_number > last_block.identifier: if block_number > last_block.identifier:
block_number = last_block.identifier block_number = last_block.identifier
block_time_diff = timedelta(seconds=10) block_time_diff = timedelta(seconds=10)
last_block_time_diff_seconds = 10 last_block_time_diff_seconds = 10
second_last_block_time_diff_seconds = 10 second_last_block_time_diff_seconds = 10
while block_time_diff.total_seconds() > self.block_interval or block_time_diff.total_seconds() < -self.block_interval: while block_time_diff.total_seconds() > self.block_interval or block_time_diff.total_seconds() < -self.block_interval:
block = BlockHeader(block_number, blockchain_instance=self.blockchain) block = BlockHeader(block_number, blockchain_instance=self.blockchain)
second_last_block_time_diff_seconds = last_block_time_diff_seconds second_last_block_time_diff_seconds = last_block_time_diff_seconds
...@@ -518,54 +518,43 @@ class Blockchain(object): ...@@ -518,54 +518,43 @@ class Blockchain(object):
# Get full block # Get full block
if (head_block - blocknumblock) < batches: if (head_block - blocknumblock) < batches:
batches = head_block - blocknumblock + 1 batches = head_block - blocknumblock + 1
for blocknum in range(blocknumblock, blocknumblock + batches - 1): # add up to 'batches' calls to the queue
if only_virtual_ops: block_batch = []
if self.blockchain.rpc.get_use_appbase(): for blocknum in range(blocknumblock, blocknumblock + batches):
# self.blockchain.rpc.get_ops_in_block({"block_num": blocknum, 'only_virtual': only_virtual_ops}, api="account_history", add_to_queue=True) if blocknum == blocknumblock + batches - 1:
self.blockchain.rpc.get_ops_in_block(blocknum, only_virtual_ops, add_to_queue=True) add_to_queue = False # execute the call with the last request
else:
self.blockchain.rpc.get_ops_in_block(blocknum, only_virtual_ops, add_to_queue=True)
else: else:
if self.blockchain.rpc.get_use_appbase(): add_to_queue = True # append request to the queue w/o executing
self.blockchain.rpc.get_block({"block_num": blocknum}, api="block", add_to_queue=True)
else:
self.blockchain.rpc.get_block(blocknum, add_to_queue=True)
latest_block = blocknum
if batches >= 1:
latest_block += 1
if latest_block <= head_block:
if only_virtual_ops: if only_virtual_ops:
if self.blockchain.rpc.get_use_appbase(): if self.blockchain.rpc.get_use_appbase():
# self.blockchain.rpc.get_ops_in_block({"block_num": blocknum, 'only_virtual': only_virtual_ops}, api="account_history", add_to_queue=False) block_batch = self.blockchain.rpc.get_ops_in_block({"block_num": blocknum, 'only_virtual': only_virtual_ops}, api="account_history", add_to_queue=add_to_queue)
block_batch = self.blockchain.rpc.get_ops_in_block(blocknum, only_virtual_ops, add_to_queue=False)
else: else:
block_batch = self.blockchain.rpc.get_ops_in_block(blocknum, only_virtual_ops, add_to_queue=False) block_batch = self.blockchain.rpc.get_ops_in_block(blocknum, only_virtual_ops, add_to_queue=add_to_queue)
else: else:
if self.blockchain.rpc.get_use_appbase(): if self.blockchain.rpc.get_use_appbase():
block_batch = self.blockchain.rpc.get_block({"block_num": latest_block}, api="block", add_to_queue=False) block_batch = self.blockchain.rpc.get_block({"block_num": blocknum}, api="block", add_to_queue=add_to_queue)
else: else:
block_batch = self.blockchain.rpc.get_block(latest_block, add_to_queue=False) block_batch = self.blockchain.rpc.get_block(blocknum, add_to_queue=add_to_queue)
if not bool(block_batch):
raise BatchedCallsNotSupported() if not bool(block_batch):
blocknum = latest_block - len(block_batch) + 1 raise BatchedCallsNotSupported()
if not isinstance(block_batch, list): if not isinstance(block_batch, list):
block_batch = [block_batch] block_batch = [block_batch]
for block in block_batch: for block in block_batch:
if not bool(block): if not bool(block):
continue continue
if self.blockchain.rpc.get_use_appbase(): if self.blockchain.rpc.get_use_appbase():
if only_virtual_ops: if only_virtual_ops:
block = {'block': block[0]["block"], block = {'block': block['ops'][0]["block"],
'timestamp': block[0]["timestamp"], 'timestamp': block['ops'][0]["timestamp"],
'id': block[0]['block'], 'id': block['ops'][0]['block'],
'operations': block} 'operations': block['ops']}
else: else:
block = block["block"] block = block["block"]
block = Block(block, only_ops=only_ops, only_virtual_ops=only_virtual_ops, blockchain_instance=self.blockchain) block = Block(block, only_ops=only_ops, only_virtual_ops=only_virtual_ops, blockchain_instance=self.blockchain)
block["id"] = block.block_num block["id"] = block.block_num
block.identifier = block.block_num block.identifier = block.block_num
yield block yield block
blocknum = block.block_num
else: else:
# Blocks from start until head block # Blocks from start until head block
for blocknum in range(start, head_block + 1): for blocknum in range(start, head_block + 1):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment