Соединение через веб-сокет закрывается. An error occurred: object of type 'NoneType' has no len()

Я пытаюсь получить ожидающие транзакции от узла eth mempool, для чего использую wss соединение с узлом.

Проблема в том, что при нормальном получении сообщений от узла ошибок не возникает и цикл не прерывается.

однако, если я добавляю проверку транзакций через web3, то через пару минут работы программы возникает ошибка.

я пробовал использовать как websocket, так и websockets но проблема остается.

В websocket:

ERROR:root:An error occurred: object of type 'NoneType' has no len()

в websockets:

Future exception was never retrieved future: <Future finished exception=ConnectionClosedError(None, None, None)> websockets.exceptions.ConnectionClosedError: no close frame received or sent

код websocket:

def on_message(ws, message):
    timing = time.perf_counter()
    try:
        if 'eth_subscription' in message:
            tx = json.loads(message)
            try:
                tx = web3.eth.get_transaction(tx['params']['result'])
                print(tx)
            except TransactionNotFound:
                pass
            #Thread(target=get_tx, args=(tx_hash,)).start()
    except Exception as err:
        print(err)
    finally:
        print(colored(str(time.perf_counter() - timing), 'magenta'))


def on_error(ws, error):
    print(error)

def on_close(ws, close_status_code, close_msg):
    print("### closed ###")

def on_open(ws):
    print("Opened connection")



def main():
    try:
        websocket.enableTrace(True, level='INFO')
        ws = websocket.WebSocketApp("ws://localhost:7546", on_open=on_open, on_message=on_message, on_error=on_error,
                                    on_close=on_close,)

        subscribe_request = {
                        "id": 1,
                        "method": "eth_subscribe",
                        "params": [
                            "newPendingTransactions"
                        ],
                        "jsonrpc": "2.0"
                    }
        ws.run_forever(dispatcher=rel, reconnect=5, sslopt={"cert_reqs": ssl.CERT_NONE})
        ws.send(json.dumps(subscribe_request))
        rel.signal(2, rel.abort)
        rel.dispatch()
    except Exception as err:
        logging.error(f"An error occurred: {err}")



if __name__ == '__main__':
    main()

код websockets:

async def get_event():
    async with websockets.connect(node_ws_url, ping_timeout=None) as ws:

            await ws.send('{"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newPendingTransactions"]}')
            subscription_response = await ws.recv()
            print(subscription_response)

            while True:
                try:
                    message = await asyncio.wait_for(ws.recv(), timeout=60)
                    #print("Received message:", message)
                    response = json.loads(message)
                    txHash = response['params']['result']
                    tx = web3.eth.get_transaction(txHash)
                    print(tx)
                except TransactionNotFound:
                    pass
                except websockets.exceptions.ConnectionClosed as e:
                    logging.error(f"Connection closed: {e}")
                    break
                except Exception as e:
                    logging.error(f"An error occurred: {e}")



if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    while True:
        loop.run_until_complete(get_event())

Ответы (0 шт):