ValueError: The future belongs to a different loop than the one specified as the loop argument
Происходит гонка двух или более потоков. Ошибка:
raise ValueError('The future belongs to a different loop than '
ValueError: The future belongs to a different loop than the one specified as the loop argument
Есть функция, которая ловит события, и их два, тех, которые по while:
from web3 import Web3
from application import db
import json
import asyncio
from application.models.BscBridge import BscBrigde
import logging
from application.services.etherium_send_service import EtheriumBridgeService
class BinanceBridgeListener:
BSC_URL = "wss://bsc.getblock.io/testnet/?api_key=27278800-db49-4ed1-bf58-b64a6d244f2d"
BSC_ADDRESS = '123'
HEX = '123'
def __init__(self):
# bsc contract
self.bsc_web3 = Web3(Web3.WebsocketProvider(self.BSC_URL))
print("Connection BSC", self.bsc_web3.isConnected())
self.abibsc = json.loads(
'[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"date","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"type_sign","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"validator_sign","type":"bytes32"}],"name":"ConvertTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"VALIDATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","constant":true},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_convertProcess","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function","constant":true},{"inputs":[],"name":"_token","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function","constant":true},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","constant":true},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"validator","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getUnlockedTokensAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","constant":true},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lockToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"string","name":"validator","type":"string"}],"name":"unlockToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"changeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"validator","type":"string"}],"name":"changeValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"pause","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"}]')
self.bsc_address = self.bsc_web3.toChecksumAddress(self.BSC_ADDRESS)
self.bsc_contract = self.bsc_web3.eth.contract(address=self.bsc_address, abi=self.abibsc)
self.bsc_contract_event_catcher()
def bsc_contract_event_catcher(self):
event_bsc_filter = self.bsc_contract.events.ConvertTransfer.createFilter(fromBlock='latest')
loop1 = asyncio.get_event_loop()
loop1.run_until_complete(asyncio.gather(self.log_loop(event_bsc_filter)))
print("EVENT", event_bsc_filter)
def log_loop(self, event_filter):
while True:
for transaction in event_filter.get_new_entries():
tx_hash = transaction['transactionHash']
tx_from = transaction['args']['from']
tx_sign = transaction['args']["type_sign"]
tx_amount = transaction['args']["amount"]
tx_validator_sign = transaction['args']["validator_sign"]
tx_bsc_addr = transaction["address"]
print("transaction hash OF BSC BRIGDE", self.bsc_web3.toHex(tx_hash))
print("type_sign111", self.bsc_web3.toHex(tx_sign))
print("to address", tx_bsc_addr)
print("from address", tx_from)
print("from sign", self.bsc_web3.toHex(tx_sign))
print("Amount " + str(tx_amount))
print("Validator_sign " + self.bsc_web3.toHex(tx_validator_sign))
bsc_model = BscBrigde()
bsc_model.balance = tx_amount
bsc_model.transaction_hash = tx_hash
bsc_model.address = tx_from
db.session.add(bsc_model)
db.session.commit()
send_transaction = EtheriumBridgeService()
transaction_hash = BscBrigde.query.filter_by(transaction_hash=self.bsc_web3.toHex(tx_hash))
if self.bsc_web3.toHex(tx_sign) == self.HEX and tx_hash != transaction_hash:
send_transaction.eth_brigde(bsc_model.id, bsc_model.address, bsc_model.balance)
else:
print("Type sign not equal to LOCK method")
if __name__ == '__main__':
try:
logger.info(f'start first thread')
t1 = threading.Thread(target=runApp).start()
logger.info(f'start second thread')
t2 = threading.Thread(target=BinanceBridgeListener).start()
t3 = threading.Thread(target=EtheriumBridgeListener).start()
except Exception as e:
logger.error("Unexpected error:" + str(e))