Make list bloom task work with updated cic cache filter task
This commit is contained in:
parent
72afbc0cab
commit
a9073e1e23
@ -55,13 +55,14 @@ class Api:
|
|||||||
queue=callback_queue,
|
queue=callback_queue,
|
||||||
)
|
)
|
||||||
|
|
||||||
def list(self, offset=0, limit=100, address=None):
|
def list(self, offset=0, limit=100, address=None, oldest=False):
|
||||||
s = celery.signature(
|
s = celery.signature(
|
||||||
'cic_cache.tasks.tx.tx_filter',
|
'cic_cache.tasks.tx.tx_filter',
|
||||||
[
|
[
|
||||||
offset,
|
offset,
|
||||||
limit,
|
limit,
|
||||||
address,
|
address,
|
||||||
|
oldest,
|
||||||
],
|
],
|
||||||
queue=self.queue,
|
queue=self.queue,
|
||||||
)
|
)
|
||||||
@ -73,7 +74,7 @@ class Api:
|
|||||||
return t
|
return t
|
||||||
|
|
||||||
|
|
||||||
def list_content(self, offset=0, limit=100, address=None, block_offset=None, block_limit=None):
|
def list_content(self, offset=0, limit=100, address=None, block_offset=None, block_limit=None, oldest=False):
|
||||||
s = celery.signature(
|
s = celery.signature(
|
||||||
'cic_cache.tasks.tx.tx_filter_content',
|
'cic_cache.tasks.tx.tx_filter_content',
|
||||||
[
|
[
|
||||||
@ -82,6 +83,7 @@ class Api:
|
|||||||
address,
|
address,
|
||||||
block_offset,
|
block_offset,
|
||||||
block_limit,
|
block_limit,
|
||||||
|
oldest,
|
||||||
],
|
],
|
||||||
queue=self.queue,
|
queue=self.queue,
|
||||||
)
|
)
|
||||||
|
@ -36,7 +36,7 @@ class BloomCache(Cache):
|
|||||||
return n
|
return n
|
||||||
|
|
||||||
|
|
||||||
def load_transactions(self, offset, limit):
|
def load_transactions(self, offset, limit, oldest=False):
|
||||||
"""Retrieves a list of transactions from cache and creates a bloom filter pointing to blocks and transactions.
|
"""Retrieves a list of transactions from cache and creates a bloom filter pointing to blocks and transactions.
|
||||||
|
|
||||||
Block and transaction numbers are serialized as 32-bit big-endian numbers. The input to the second bloom filter is the concatenation of the serialized block number and transaction index.
|
Block and transaction numbers are serialized as 32-bit big-endian numbers. The input to the second bloom filter is the concatenation of the serialized block number and transaction index.
|
||||||
@ -53,7 +53,7 @@ class BloomCache(Cache):
|
|||||||
:return: Lowest block, bloom filter for blocks, bloom filter for blocks|tx
|
:return: Lowest block, bloom filter for blocks, bloom filter for blocks|tx
|
||||||
:rtype: tuple
|
:rtype: tuple
|
||||||
"""
|
"""
|
||||||
rows = list_transactions_mined(self.session, offset, limit, None, None)
|
rows = list_transactions_mined(self.session, offset, limit, block_offset=None, block_limit=None, oldest=oldest)
|
||||||
|
|
||||||
f_block = moolb.Bloom(BloomCache.__get_filter_size(limit), 3)
|
f_block = moolb.Bloom(BloomCache.__get_filter_size(limit), 3)
|
||||||
f_blocktx = moolb.Bloom(BloomCache.__get_filter_size(limit), 3)
|
f_blocktx = moolb.Bloom(BloomCache.__get_filter_size(limit), 3)
|
||||||
@ -71,7 +71,7 @@ class BloomCache(Cache):
|
|||||||
return (lowest_block, highest_block, f_block.to_bytes(), f_blocktx.to_bytes(),)
|
return (lowest_block, highest_block, f_block.to_bytes(), f_blocktx.to_bytes(),)
|
||||||
|
|
||||||
|
|
||||||
def load_transactions_account(self, address, offset, limit):
|
def load_transactions_account(self, address, offset, limit, oldest=False):
|
||||||
"""Same as load_transactions(...), but only retrieves transactions where the specified account address is sender or recipient.
|
"""Same as load_transactions(...), but only retrieves transactions where the specified account address is sender or recipient.
|
||||||
|
|
||||||
:param address: Address to retrieve transactions for.
|
:param address: Address to retrieve transactions for.
|
||||||
@ -83,7 +83,7 @@ class BloomCache(Cache):
|
|||||||
:return: Lowest block, bloom filter for blocks, bloom filter for blocks|tx
|
:return: Lowest block, bloom filter for blocks, bloom filter for blocks|tx
|
||||||
:rtype: tuple
|
:rtype: tuple
|
||||||
"""
|
"""
|
||||||
rows = list_transactions_account_mined(self.session, address, offset, limit, None, None)
|
rows = list_transactions_account_mined(self.session, address, offset, limit, block_offset=None, block_limit=None, oldest=oldest)
|
||||||
|
|
||||||
f_block = moolb.Bloom(BloomCache.__get_filter_size(limit), 3)
|
f_block = moolb.Bloom(BloomCache.__get_filter_size(limit), 3)
|
||||||
f_blocktx = moolb.Bloom(BloomCache.__get_filter_size(limit), 3)
|
f_blocktx = moolb.Bloom(BloomCache.__get_filter_size(limit), 3)
|
||||||
@ -103,31 +103,31 @@ class BloomCache(Cache):
|
|||||||
|
|
||||||
class DataCache(Cache):
|
class DataCache(Cache):
|
||||||
|
|
||||||
def load_transactions_with_data_index(self, offset, limit, block_offset=None, block_limit=None):
|
def load_transactions_with_data_index(self, offset, limit, block_offset=None, block_limit=None, oldest=False):
|
||||||
if limit == 0:
|
if limit == 0:
|
||||||
limit = DEFAULT_LIMIT
|
limit = DEFAULT_LIMIT
|
||||||
rows = list_transactions_mined_with_data_index(self.session, offset, limit, block_offset, block_limit)
|
rows = list_transactions_mined_with_data_index(self.session, offset, limit, block_offset, block_limit, oldest=oldest)
|
||||||
return self.__load_transactions(rows)
|
return self.__load_transactions(rows)
|
||||||
|
|
||||||
|
|
||||||
def load_transactions_with_data(self, offset, limit, block_offset=None, block_limit=None):
|
def load_transactions_with_data(self, offset, limit, block_offset=None, block_limit=None, oldest=False):
|
||||||
if limit == 0:
|
if limit == 0:
|
||||||
limit = DEFAULT_LIMIT
|
limit = DEFAULT_LIMIT
|
||||||
rows = list_transactions_mined_with_data(self.session, offset, limit, block_offset, block_limit)
|
rows = list_transactions_mined_with_data(self.session, offset, limit, block_offset, block_limit, oldest=oldest)
|
||||||
return self.__load_transactions(rows)
|
return self.__load_transactions(rows)
|
||||||
|
|
||||||
|
|
||||||
def load_transactions_account_with_data_index(self, address, offset, limit, block_offset=None, block_limit=None):
|
def load_transactions_account_with_data_index(self, address, offset, limit, block_offset=None, block_limit=None, oldest=False):
|
||||||
if limit == 0:
|
if limit == 0:
|
||||||
limit = DEFAULT_LIMIT
|
limit = DEFAULT_LIMIT
|
||||||
rows = list_transactions_account_mined_with_data_index(self.session, address, offset, limit, block_offset, block_limit)
|
rows = list_transactions_account_mined_with_data_index(self.session, address, offset, limit, block_offset, block_limit, oldest=oldest)
|
||||||
return self.__load_transactions(rows)
|
return self.__load_transactions(rows)
|
||||||
|
|
||||||
|
|
||||||
def load_transactions_account_with_data(self, address, offset, limit, block_offset=None, block_limit=None):
|
def load_transactions_account_with_data(self, address, offset, limit, block_offset=None, block_limit=None, oldest=False):
|
||||||
if limit == 0:
|
if limit == 0:
|
||||||
limit = DEFAULT_LIMIT
|
limit = DEFAULT_LIMIT
|
||||||
rows = list_transactions_account_mined_with_data(self.session, address, offset, limit, block_offset, block_limit)
|
rows = list_transactions_account_mined_with_data(self.session, address, offset, limit, block_offset, block_limit, oldest=oldest)
|
||||||
return self.__load_transactions(rows)
|
return self.__load_transactions(rows)
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ def list_transactions_mined(
|
|||||||
limit,
|
limit,
|
||||||
block_offset,
|
block_offset,
|
||||||
block_limit,
|
block_limit,
|
||||||
|
oldest=False,
|
||||||
):
|
):
|
||||||
"""Executes db query to return all confirmed transactions according to the specified offset and limit.
|
"""Executes db query to return all confirmed transactions according to the specified offset and limit.
|
||||||
|
|
||||||
@ -25,13 +26,17 @@ def list_transactions_mined(
|
|||||||
:result: Result set
|
:result: Result set
|
||||||
:rtype: SQLAlchemy.ResultProxy
|
:rtype: SQLAlchemy.ResultProxy
|
||||||
"""
|
"""
|
||||||
|
order_by = 'DESC'
|
||||||
|
if oldest:
|
||||||
|
order_by = 'ASC'
|
||||||
|
|
||||||
if block_offset:
|
if block_offset:
|
||||||
if block_limit:
|
if block_limit:
|
||||||
s = "SELECT block_number, tx_index FROM tx ORDER BY block_number DESC, tx_index DESC WHERE block_number >= {} and block_number <= {} LIMIT {} OFFSET {}".format(limit, offset, block_offset, block_limit)
|
s = "SELECT block_number, tx_index FROM tx ORDER BY block_number {}, tx_index {} WHERE block_number >= {} and block_number <= {} LIMIT {} OFFSET {}".format(order_by, order_by, limit, offset, block_offset, block_limit)
|
||||||
else:
|
else:
|
||||||
s = "SELECT block_number, tx_index FROM tx ORDER BY block_number DESC, tx_index DESC WHERE block_number >= {} LIMIT {} OFFSET {}".format(limit, offset, block_offset)
|
s = "SELECT block_number, tx_index FROM tx ORDER BY block_number {}, tx_index {} WHERE block_number >= {} LIMIT {} OFFSET {}".format(order_by, order_by, limit, offset, block_offset)
|
||||||
else:
|
else:
|
||||||
s = "SELECT block_number, tx_index FROM tx ORDER BY block_number DESC, tx_index DESC LIMIT {} OFFSET {}".format(limit, offset)
|
s = "SELECT block_number, tx_index FROM tx ORDER BY block_number {}, tx_index {} LIMIT {} OFFSET {}".format(order_by, order_by, limit, offset)
|
||||||
r = session.execute(s)
|
r = session.execute(s)
|
||||||
return r
|
return r
|
||||||
|
|
||||||
@ -42,6 +47,7 @@ def list_transactions_mined_with_data(
|
|||||||
limit,
|
limit,
|
||||||
block_offset,
|
block_offset,
|
||||||
block_limit,
|
block_limit,
|
||||||
|
oldest=False,
|
||||||
):
|
):
|
||||||
"""Executes db query to return all confirmed transactions according to the specified offset and limit.
|
"""Executes db query to return all confirmed transactions according to the specified offset and limit.
|
||||||
|
|
||||||
@ -52,13 +58,17 @@ def list_transactions_mined_with_data(
|
|||||||
:result: Result set
|
:result: Result set
|
||||||
:rtype: SQLAlchemy.ResultProxy
|
:rtype: SQLAlchemy.ResultProxy
|
||||||
"""
|
"""
|
||||||
|
order_by = 'DESC'
|
||||||
|
if oldest:
|
||||||
|
order_by = 'ASC'
|
||||||
|
|
||||||
if block_offset:
|
if block_offset:
|
||||||
if block_limit:
|
if block_limit:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} AND block_number <= {} ORDER BY block_number ASC, tx_index ASC OFFSET {} LIMIT {}".format(block_offset, block_limit, offset, limit)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} AND block_number <= {} ORDER BY block_number {}, tx_index {} OFFSET {} LIMIT {}".format(block_offset, block_limit, order_by, order_by, offset, limit)
|
||||||
else:
|
else:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} ORDER BY block_number ASC, tx_index ASC OFFSET {} LIMIT {}".format(block_offset, offset, limit)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} ORDER BY block_number {}, tx_index {} OFFSET {} LIMIT {}".format(block_offset, order_by, order_by, offset, limit)
|
||||||
else:
|
else:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id ORDER BY block_number ASC, tx_index ASC OFFSET {} LIMIT {}".format(offset, limit)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id ORDER BY block_number {}, tx_index {} OFFSET {} LIMIT {}".format(order_by, order_by, offset, limit)
|
||||||
|
|
||||||
|
|
||||||
r = session.execute(s)
|
r = session.execute(s)
|
||||||
@ -71,6 +81,7 @@ def list_transactions_mined_with_data_index(
|
|||||||
end,
|
end,
|
||||||
block_offset,
|
block_offset,
|
||||||
block_limit,
|
block_limit,
|
||||||
|
oldest=False,
|
||||||
):
|
):
|
||||||
"""Executes db query to return all confirmed transactions according to the specified offset and limit.
|
"""Executes db query to return all confirmed transactions according to the specified offset and limit.
|
||||||
|
|
||||||
@ -81,13 +92,18 @@ def list_transactions_mined_with_data_index(
|
|||||||
:result: Result set
|
:result: Result set
|
||||||
:rtype: SQLAlchemy.ResultProxy
|
:rtype: SQLAlchemy.ResultProxy
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
order_by = 'DESC'
|
||||||
|
if oldest:
|
||||||
|
order_by = 'ASC'
|
||||||
|
|
||||||
if block_offset:
|
if block_offset:
|
||||||
if block_limit:
|
if block_limit:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} and block_number <= {} ORDER BY block_number ASC, tx_index ASC OFFSET {} LIMIT {}".format(block_offset, block_limit, offset, end)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} and block_number <= {} ORDER BY block_number {}, tx_index {} OFFSET {} LIMIT {}".format(block_offset, block_limit, order_by, order_by, offset, end)
|
||||||
else:
|
else:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} ORDER BY block_number ASC, tx_index ASC OFFSET {} LIMIT {}".format(block_offset, offset, end)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} ORDER BY block_number {}, tx_index {} OFFSET {} LIMIT {}".format(block_offset, order_by, order_by, offset, end)
|
||||||
else:
|
else:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id ORDER BY block_number ASC, tx_index ASC OFFSET {} LIMIT {}".format(offset, end)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id ORDER BY block_number {}, tx_index {} OFFSET {} LIMIT {}".format(order_by, order_by, offset, end)
|
||||||
|
|
||||||
r = session.execute(s)
|
r = session.execute(s)
|
||||||
return r
|
return r
|
||||||
@ -100,6 +116,7 @@ def list_transactions_account_mined_with_data_index(
|
|||||||
limit,
|
limit,
|
||||||
block_offset,
|
block_offset,
|
||||||
block_limit,
|
block_limit,
|
||||||
|
oldest=False,
|
||||||
):
|
):
|
||||||
"""Executes db query to return all confirmed transactions according to the specified offset and limit, filtered by address
|
"""Executes db query to return all confirmed transactions according to the specified offset and limit, filtered by address
|
||||||
|
|
||||||
@ -110,13 +127,18 @@ def list_transactions_account_mined_with_data_index(
|
|||||||
:result: Result set
|
:result: Result set
|
||||||
:rtype: SQLAlchemy.ResultProxy
|
:rtype: SQLAlchemy.ResultProxy
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
order_by = 'DESC'
|
||||||
|
if oldest:
|
||||||
|
order_by = 'ASC'
|
||||||
|
|
||||||
if block_offset:
|
if block_offset:
|
||||||
if block_limit:
|
if block_limit:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} AND block_number <= {} AND (sender = '{}' OR recipient = '{}') ORDER BY block_number ASC, tx_index ASC OFFSET {} LIMIT {}".format(block_offset, block_limit, address, address, offset, limit)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} AND block_number <= {} AND (sender = '{}' OR recipient = '{}') ORDER BY block_number {}, tx_index {} OFFSET {} LIMIT {}".format(block_offset, block_limit, address, address, order_by, order_by, offset, limit)
|
||||||
else:
|
else:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} AND (sender = '{}' OR recipient = '{}') ORDER BY block_number ASC, tx_index ASC OFFSET {} LIMIT {}".format(block_offset, address, address, offset, limit)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} AND (sender = '{}' OR recipient = '{}') ORDER BY block_number {}, tx_index {} OFFSET {} LIMIT {}".format(block_offset, address, address, order_by, order_by, offset, limit)
|
||||||
else:
|
else:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE sender = '{}' OR recipient = '{}' ORDER BY block_number ASC, tx_index ASC OFFSET {} LIMIT {}".format(address, address, offset, limit)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE sender = '{}' OR recipient = '{}' ORDER BY block_number {}, tx_index {} OFFSET {} LIMIT {}".format(address, address, order_by, order_by, offset, limit)
|
||||||
|
|
||||||
r = session.execute(s)
|
r = session.execute(s)
|
||||||
return r
|
return r
|
||||||
@ -128,6 +150,7 @@ def list_transactions_account_mined_with_data(
|
|||||||
limit,
|
limit,
|
||||||
block_offset,
|
block_offset,
|
||||||
block_limit,
|
block_limit,
|
||||||
|
oldest=False,
|
||||||
):
|
):
|
||||||
"""Executes db query to return all confirmed transactions according to the specified offset and limit.
|
"""Executes db query to return all confirmed transactions according to the specified offset and limit.
|
||||||
|
|
||||||
@ -138,13 +161,18 @@ def list_transactions_account_mined_with_data(
|
|||||||
:result: Result set
|
:result: Result set
|
||||||
:rtype: SQLAlchemy.ResultProxy
|
:rtype: SQLAlchemy.ResultProxy
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
order_by = 'DESC'
|
||||||
|
if oldest:
|
||||||
|
order_by = 'ASC'
|
||||||
|
|
||||||
if block_offset:
|
if block_offset:
|
||||||
if block_limit:
|
if block_limit:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} AND block_number <= {} AND (sender = '{}' OR recipient = '{}') ORDER BY block_number ASC, tx_index ASC OFFSET {} LIMIT {}".format(block_offset, block_limit, address, address, offset, limit)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} AND block_number <= {} AND (sender = '{}' OR recipient = '{}') ORDER BY block_number {}, tx_index {} OFFSET {} LIMIT {}".format(block_offset, block_limit, address, address, order_by, order_by, offset, limit)
|
||||||
else:
|
else:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} AND (sender = '{}' OR recipient = '{}') ORDER BY block_number ASC, tx_index ASC OFFSET {} LIMIT {}".format(block_offset, address, address, offset, limit)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE block_number >= {} AND (sender = '{}' OR recipient = '{}') ORDER BY block_number {}, tx_index {} OFFSET {} LIMIT {}".format(block_offset, address, address, order_by, order_by, offset, limit)
|
||||||
else:
|
else:
|
||||||
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE sender = '{}' OR recipient = '{}' ORDER BY block_number ASC, tx_index ASC".format(address, address, offset, limit)
|
s = "SELECT tx_hash, block_number, date_block, sender, recipient, from_value, to_value, source_token, destination_token, success, domain, value FROM tx LEFT JOIN tag_tx_link ON tx.id = tag_tx_link.tx_id LEFT JOIN tag ON tag_tx_link.tag_id = tag.id WHERE sender = '{}' OR recipient = '{}' ORDER BY block_number , tx_index {} OFFSET {} LIMIT {}".format(address, address, order_by, order_by, offset, limit)
|
||||||
|
|
||||||
r = session.execute(s)
|
r = session.execute(s)
|
||||||
return r
|
return r
|
||||||
@ -157,6 +185,7 @@ def list_transactions_account_mined(
|
|||||||
limit,
|
limit,
|
||||||
block_offset,
|
block_offset,
|
||||||
block_limit,
|
block_limit,
|
||||||
|
oldest=False,
|
||||||
):
|
):
|
||||||
"""Same as list_transactions_mined(...), but only retrieves transaction where the specified account address is sender or recipient.
|
"""Same as list_transactions_mined(...), but only retrieves transaction where the specified account address is sender or recipient.
|
||||||
|
|
||||||
@ -169,7 +198,20 @@ def list_transactions_account_mined(
|
|||||||
:result: Result set
|
:result: Result set
|
||||||
:rtype: SQLAlchemy.ResultProxy
|
:rtype: SQLAlchemy.ResultProxy
|
||||||
"""
|
"""
|
||||||
s = "SELECT block_number, tx_index FROM tx WHERE sender = '{}' OR recipient = '{}' ORDER BY block_number DESC, tx_index DESC LIMIT {} OFFSET {}".format(address, address, limit, offset)
|
|
||||||
|
order_by = 'DESC'
|
||||||
|
if oldest:
|
||||||
|
order_by = 'ASC'
|
||||||
|
|
||||||
|
if block_offset:
|
||||||
|
if block_limit:
|
||||||
|
s = "SELECT block_number, tx_index FROM tx WHERE block_number >= {} AND block_number <= {} AND (sender = '{}' OR recipient = '{}') ORDER BY block_number {}, tx_index {} LIMIT {} OFFSET {}".format(block_offset, block_limit, address, address, order_by, order_by, limit, offset)
|
||||||
|
else:
|
||||||
|
s = "SELECT block_number, tx_index FROM tx WHERE block_number >= {} AND (sender = '{}' OR recipient = '{}') ORDER BY block_number {}, tx_index {} LIMIT {} OFFSET {}".format(block_offset, address, address, order_by, order_by, limit, offset)
|
||||||
|
|
||||||
|
else:
|
||||||
|
s = "SELECT block_number, tx_index FROM tx WHERE sender = '{}' OR recipient = '{}' ORDER BY block_number {}, tx_index {} LIMIT {} OFFSET {}".format(address, address, order_by, order_by, limit, offset)
|
||||||
|
|
||||||
r = session.execute(s)
|
r = session.execute(s)
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ def process_transactions_all_data(session, env):
|
|||||||
raise ValueError('cart before the horse, dude')
|
raise ValueError('cart before the horse, dude')
|
||||||
|
|
||||||
c = DataCache(session)
|
c = DataCache(session)
|
||||||
(lowest_block, highest_block, tx_cache) = c.load_transactions_with_data(0, 0, block_offset, block_end)
|
(lowest_block, highest_block, tx_cache) = c.load_transactions_with_data(0, 0, block_offset, block_end, oldest=True) # oldest needs to be settable
|
||||||
|
|
||||||
for r in tx_cache:
|
for r in tx_cache:
|
||||||
r['date_block'] = r['date_block'].timestamp()
|
r['date_block'] = r['date_block'].timestamp()
|
||||||
|
@ -12,7 +12,7 @@ celery_app = celery.current_app
|
|||||||
|
|
||||||
|
|
||||||
@celery_app.task(bind=True)
|
@celery_app.task(bind=True)
|
||||||
def tx_filter(self, offset, limit, address=None, encoding='hex'):
|
def tx_filter(self, offset, limit, address=None, oldest=False, encoding='hex'):
|
||||||
queue = self.request.delivery_info.get('routing_key')
|
queue = self.request.delivery_info.get('routing_key')
|
||||||
|
|
||||||
session = SessionBase.create_session()
|
session = SessionBase.create_session()
|
||||||
@ -20,9 +20,9 @@ def tx_filter(self, offset, limit, address=None, encoding='hex'):
|
|||||||
c = BloomCache(session)
|
c = BloomCache(session)
|
||||||
b = None
|
b = None
|
||||||
if address == None:
|
if address == None:
|
||||||
(lowest_block, highest_block, bloom_filter_block, bloom_filter_tx) = c.load_transactions(offset, limit)
|
(lowest_block, highest_block, bloom_filter_block, bloom_filter_tx) = c.load_transactions(offset, limit, oldest=oldest)
|
||||||
else:
|
else:
|
||||||
(lowest_block, highest_block, bloom_filter_block, bloom_filter_tx) = c.load_transactions_account(address, offset, limit)
|
(lowest_block, highest_block, bloom_filter_block, bloom_filter_tx) = c.load_transactions_account(address, offset, limit, oldest=oldest)
|
||||||
|
|
||||||
session.close()
|
session.close()
|
||||||
|
|
||||||
@ -39,21 +39,21 @@ def tx_filter(self, offset, limit, address=None, encoding='hex'):
|
|||||||
|
|
||||||
|
|
||||||
@celery_app.task(bind=True)
|
@celery_app.task(bind=True)
|
||||||
def tx_filter_content(self, offset, limit, address=None, block_offset=None, block_limit=None, encoding='hex'):
|
def tx_filter_content(self, offset, limit, address=None, block_offset=None, block_limit=None, oldest=False, encoding='hex'):
|
||||||
session = SessionBase.create_session()
|
session = SessionBase.create_session()
|
||||||
|
|
||||||
c = DataCache(session)
|
c = DataCache(session)
|
||||||
b = None
|
b = None
|
||||||
if address == None:
|
if address == None:
|
||||||
if block_offset:
|
if block_offset:
|
||||||
(lowest_block, highest_block, tx_cache) = c.load_transactions_with_data(offset, limit, block_offset=block_offset, block_limit=block_limit)
|
(lowest_block, highest_block, tx_cache) = c.load_transactions_with_data(offset, limit, block_offset=block_offset, block_limit=block_limit, oldest=oldest)
|
||||||
else:
|
else:
|
||||||
(lowest_block, highest_block, tx_cache) = c.load_transactions_with_data_index(offset, limit, block_offset=block_offset, block_limit=block_limit)
|
(lowest_block, highest_block, tx_cache) = c.load_transactions_with_data_index(offset, limit, block_offset=block_offset, block_limit=block_limit)
|
||||||
else:
|
else:
|
||||||
if block_offset:
|
if block_offset:
|
||||||
(lowest_block, highest_block, tx_cache) = c.load_transactions_account_with_data(address, offset, limit, block_offset=block_offset, block_limit=block_limit)
|
(lowest_block, highest_block, tx_cache) = c.load_transactions_account_with_data(address, offset, limit, block_offset=block_offset, block_limit=block_limit)
|
||||||
else:
|
else:
|
||||||
(lowest_block, highest_block, tx_cache) = c.load_transactions_account_with_data_index(address, offset, limit, block_number=block_number, block_limit=block_limit)
|
(lowest_block, highest_block, tx_cache) = c.load_transactions_account_with_data_index(address, offset, limit, block_offset=block_offset, block_limit=block_limit)
|
||||||
|
|
||||||
session.close()
|
session.close()
|
||||||
|
|
||||||
|
@ -4,8 +4,8 @@ import semver
|
|||||||
version = (
|
version = (
|
||||||
0,
|
0,
|
||||||
2,
|
2,
|
||||||
0,
|
1,
|
||||||
'alpha.2',
|
'alpha.1',
|
||||||
)
|
)
|
||||||
|
|
||||||
version_object = semver.VersionInfo(
|
version_object = semver.VersionInfo(
|
||||||
|
@ -41,3 +41,4 @@ console_scripts =
|
|||||||
cic-cache-trackerd = cic_cache.runnable.daemons.tracker:main
|
cic-cache-trackerd = cic_cache.runnable.daemons.tracker:main
|
||||||
cic-cache-serverd = cic_cache.runnable.daemons.server:main
|
cic-cache-serverd = cic_cache.runnable.daemons.server:main
|
||||||
cic-cache-taskerd = cic_cache.runnable.daemons.tasker:main
|
cic-cache-taskerd = cic_cache.runnable.daemons.tasker:main
|
||||||
|
cic-cache-list = cic_cache.runable.list:main
|
||||||
|
@ -520,9 +520,9 @@ class Api(ApiBase):
|
|||||||
s_external_get = celery.signature(
|
s_external_get = celery.signature(
|
||||||
external_task,
|
external_task,
|
||||||
[
|
[
|
||||||
address,
|
|
||||||
offset,
|
offset,
|
||||||
limit,
|
limit,
|
||||||
|
address,
|
||||||
],
|
],
|
||||||
queue=external_queue,
|
queue=external_queue,
|
||||||
)
|
)
|
||||||
|
@ -12,6 +12,7 @@ from chainlib.eth.tx import (
|
|||||||
transaction_by_block,
|
transaction_by_block,
|
||||||
receipt,
|
receipt,
|
||||||
)
|
)
|
||||||
|
from chainlib.eth.error import RequestMismatchException
|
||||||
from chainlib.eth.block import block_by_number
|
from chainlib.eth.block import block_by_number
|
||||||
from chainlib.eth.contract import abi_decode_single
|
from chainlib.eth.contract import abi_decode_single
|
||||||
from chainlib.eth.constant import ZERO_ADDRESS
|
from chainlib.eth.constant import ZERO_ADDRESS
|
||||||
@ -23,6 +24,7 @@ from chainqueue.db.models.otx import Otx
|
|||||||
from chainqueue.db.enum import StatusEnum
|
from chainqueue.db.enum import StatusEnum
|
||||||
from chainqueue.sql.query import get_tx_cache
|
from chainqueue.sql.query import get_tx_cache
|
||||||
from eth_erc20 import ERC20
|
from eth_erc20 import ERC20
|
||||||
|
from erc20_faucet import Faucet
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic_eth.queue.time import tx_times
|
from cic_eth.queue.time import tx_times
|
||||||
@ -35,6 +37,33 @@ logg = logging.getLogger()
|
|||||||
MAX_BLOCK_TX = 250
|
MAX_BLOCK_TX = 250
|
||||||
|
|
||||||
|
|
||||||
|
def parse_transaction(chain_spec, rpc, tx, sender_address=None):
|
||||||
|
try:
|
||||||
|
transfer_data = ERC20.parse_transfer_request(tx['input'])
|
||||||
|
tx_address = transfer_data[0]
|
||||||
|
tx_token_value = transfer_data[1]
|
||||||
|
logg.debug('matched transfer transaction {} sender {} recipient {} value {}'.format(tx['hash'], tx['from'], tx_address, tx_token_value))
|
||||||
|
return (tx_address, tx_token_value)
|
||||||
|
except RequestMismatchException:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
transfer_data = Faucet.parse_give_to_request(tx['input'])
|
||||||
|
tx_address = transfer_data[0]
|
||||||
|
logg.warning('looking up current faucet value, historic faucet value not implemented yet. use with care!!')
|
||||||
|
c = Faucet(chain_spec)
|
||||||
|
o = c.token_amount(tx['to'], sender_address=sender_address)
|
||||||
|
r = rpc.do(o)
|
||||||
|
tx_token_value = Faucet.parse_token_amount(r)
|
||||||
|
logg.debug('matched giveto transaction {} sender {} recipient {} value {}'.format(tx['hash'], tx['from'], tx_address, tx_token_value))
|
||||||
|
return (tx_address, tx_token_value)
|
||||||
|
|
||||||
|
except RequestMismatchException:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
# TODO: Make this method easier to read
|
# TODO: Make this method easier to read
|
||||||
@celery_app.task(bind=True, base=BaseTask)
|
@celery_app.task(bind=True, base=BaseTask)
|
||||||
def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict):
|
def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict):
|
||||||
@ -71,6 +100,7 @@ def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict):
|
|||||||
tx_filter = moolb.Bloom(databitlen, bloomspec['filter_rounds'], default_data=tx_filter_data)
|
tx_filter = moolb.Bloom(databitlen, bloomspec['filter_rounds'], default_data=tx_filter_data)
|
||||||
|
|
||||||
txs = {}
|
txs = {}
|
||||||
|
logg.debug('processing filter with span low {} to high {}'.format(bloomspec['low'], bloomspec['high']))
|
||||||
for block_height in range(bloomspec['low'], bloomspec['high']):
|
for block_height in range(bloomspec['low'], bloomspec['high']):
|
||||||
block_height_bytes = block_height.to_bytes(4, 'big')
|
block_height_bytes = block_height.to_bytes(4, 'big')
|
||||||
if block_filter.check(block_height_bytes):
|
if block_filter.check(block_height_bytes):
|
||||||
@ -80,9 +110,9 @@ def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict):
|
|||||||
logg.debug('block {}'.format(block))
|
logg.debug('block {}'.format(block))
|
||||||
|
|
||||||
for tx_index in range(0, len(block['transactions'])):
|
for tx_index in range(0, len(block['transactions'])):
|
||||||
composite = tx_index + block_height
|
tx_index_bytes = tx_index.to_bytes(4, 'big')
|
||||||
tx_index_bytes = composite.to_bytes(4, 'big')
|
composite = block_height_bytes + tx_index_bytes
|
||||||
if tx_filter.check(tx_index_bytes):
|
if tx_filter.check(composite):
|
||||||
logg.debug('filter matched block {} tx {}'.format(block_height, tx_index))
|
logg.debug('filter matched block {} tx {}'.format(block_height, tx_index))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -91,16 +121,17 @@ def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict):
|
|||||||
tx = rpc.do(o)
|
tx = rpc.do(o)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logg.debug('false positive on block {} tx {} ({})'.format(block_height, tx_index, e))
|
logg.debug('false positive on block {} tx {} ({})'.format(block_height, tx_index, e))
|
||||||
continue
|
|
||||||
|
logg.debug('got tx {}'.format(tx))
|
||||||
tx_address = None
|
tx_address = None
|
||||||
tx_token_value = 0
|
tx_token_value = 0
|
||||||
try:
|
|
||||||
transfer_data = ERC20.parse_transfer_request(tx['data'])
|
transfer_data = parse_transaction(chain_spec, rpc, tx, sender_address=BaseTask.call_address)
|
||||||
|
if transfer_data == None:
|
||||||
|
continue
|
||||||
tx_address = transfer_data[0]
|
tx_address = transfer_data[0]
|
||||||
tx_token_value = transfer_data[1]
|
tx_token_value = transfer_data[1]
|
||||||
except ValueError:
|
|
||||||
logg.debug('not a transfer transaction, skipping {}'.format(tx))
|
|
||||||
continue
|
|
||||||
if address == tx_address:
|
if address == tx_address:
|
||||||
status = StatusEnum.SENT
|
status = StatusEnum.SENT
|
||||||
try:
|
try:
|
||||||
@ -136,6 +167,7 @@ def list_tx_by_bloom(self, bloomspec, address, chain_spec_dict):
|
|||||||
return txs
|
return txs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: Surely it must be possible to optimize this
|
# TODO: Surely it must be possible to optimize this
|
||||||
# TODO: DRY this with callback filter in cic_eth/runnable/manager
|
# TODO: DRY this with callback filter in cic_eth/runnable/manager
|
||||||
# TODO: Remove redundant fields from end representation (timestamp, tx_hash)
|
# TODO: Remove redundant fields from end representation (timestamp, tx_hash)
|
||||||
|
@ -238,7 +238,7 @@ services:
|
|||||||
- |
|
- |
|
||||||
if [[ -f /tmp/cic/config/.env ]]; then source /tmp/cic/config/.env; fi
|
if [[ -f /tmp/cic/config/.env ]]; then source /tmp/cic/config/.env; fi
|
||||||
"/usr/local/bin/uwsgi" \
|
"/usr/local/bin/uwsgi" \
|
||||||
--wsgi-file /usr/src/cic-cache/cic_cache/runnable/daemons/server.py \
|
--wsgi-file /root/cic_cache/runnable/daemons/server.py \
|
||||||
--http :8000 \
|
--http :8000 \
|
||||||
--pyargv "-vv"
|
--pyargv "-vv"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user