Adding utility fns for reorg
Adding functions for auto-rollback on blockchain reorg
This commit is contained in:
parent
8b873f364e
commit
8464d48b0a
@ -22,6 +22,7 @@ import asyncio
|
|||||||
import websockets
|
import websockets
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
import pdb
|
import pdb
|
||||||
|
from util_rollback import rollback_to_block
|
||||||
|
|
||||||
|
|
||||||
def newMultiRequest(apicall):
|
def newMultiRequest(apicall):
|
||||||
@ -954,6 +955,40 @@ def checkLocal_expiry_trigger_deposit(blockinfo):
|
|||||||
updateLatestTransaction(transaction_data, parsed_data, f"{query.contractName}-{query.contractAddress}")
|
updateLatestTransaction(transaction_data, parsed_data, f"{query.contractName}-{query.contractAddress}")
|
||||||
|
|
||||||
|
|
||||||
|
def check_reorg():
|
||||||
|
connection = create_database_connection('system_dbs')
|
||||||
|
blockbook_api_url = 'https://blockbook.ranchimall.net/'
|
||||||
|
BACK_TRACK_BLOCKS = 1000
|
||||||
|
|
||||||
|
# find latest block number in local database
|
||||||
|
latest_block = list(connection.execute("SELECT max(blockNumber) from latestBlocks").fetchone())[0]
|
||||||
|
block_number = latest_block
|
||||||
|
|
||||||
|
while block_number > 0:
|
||||||
|
# get the block hash
|
||||||
|
block_hash = list(connection.execute(f"SELECT blockHash from latestBlocks WHERE blockNumber = {block_number}").fetchone())[0]
|
||||||
|
|
||||||
|
# Check if the block is in blockbook (i.e, not dropped in reorg)
|
||||||
|
response = requests.get(f'{blockbook_api_url}api/block/{block_number}', verify=API_VERIFY)
|
||||||
|
if response.status_code == 200:
|
||||||
|
response = response.json()
|
||||||
|
if response['hash'] == block_hash: # local blockhash matches with blockbook hash
|
||||||
|
break
|
||||||
|
else: # check for older blocks to trace where reorg has happened
|
||||||
|
block_number -= BACK_TRACK_BLOCKS
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
logger.info('Response from the Blockbook API failed')
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
connection.close()
|
||||||
|
|
||||||
|
# rollback if needed
|
||||||
|
if block_number != latest_block:
|
||||||
|
rollback_to_block(block_number)
|
||||||
|
|
||||||
|
return block_number
|
||||||
|
|
||||||
def extract_contractStructure(contractName, contractAddress):
|
def extract_contractStructure(contractName, contractAddress):
|
||||||
connection = create_database_connection('smart_contract', {'contract_name':f"{contractName}", 'contract_address':f"{contractAddress}"})
|
connection = create_database_connection('smart_contract', {'contract_name':f"{contractName}", 'contract_address':f"{contractAddress}"})
|
||||||
attributevaluepair = connection.execute("SELECT attribute, value FROM contractstructure WHERE attribute != 'flodata'").fetchall()
|
attributevaluepair = connection.execute("SELECT attribute, value FROM contractstructure WHERE attribute != 'flodata'").fetchall()
|
||||||
|
|||||||
@ -465,12 +465,19 @@ def initiate_rollback_process():
|
|||||||
systemdb_session.commit()
|
systemdb_session.commit()
|
||||||
systemdb_session.close()
|
systemdb_session.close()
|
||||||
|
|
||||||
|
def rollback_to_block(block_number):
|
||||||
|
global rollback_block
|
||||||
|
rollback_block = block_number
|
||||||
|
start_rollback_process()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
def start_rollback_process():
|
||||||
systemdb_session = create_database_session_orm('system_dbs', {'db_name': 'system'}, SystemBase)
|
systemdb_session = create_database_session_orm('system_dbs', {'db_name': 'system'}, SystemBase)
|
||||||
lastblockscanned_query = systemdb_session.query(SystemData).filter(SystemData.attribute=='lastblockscanned').first()
|
lastblockscanned_query = systemdb_session.query(SystemData).filter(SystemData.attribute=='lastblockscanned').first()
|
||||||
if(rollback_block > int(lastblockscanned_query.value)):
|
if(rollback_block > int(lastblockscanned_query.value)):
|
||||||
print('Rollback block is greater than the last scanned block\n Exiting ....')
|
print('Rollback block is greater than the last scanned block\n Exiting ....')
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
else:
|
else:
|
||||||
initiate_rollback_process()
|
initiate_rollback_process()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
start_rollback_process()
|
||||||
Loading…
Reference in New Issue
Block a user