es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo enviar transacciones con múltiples carteras en un solo disparo web3.py

No sé si esto es posible, pero me gustaría poder operar con múltiples carteras y la única forma en que podría intentarlo (según mis conocimientos limitados) es mediante el bucle de cada dirección y clave. Me preguntaba si hay alguna forma de enviar cada transacción en un hilo separado para que todas se ejecuten al mismo tiempo en lugar de una tras otra.
P.D. Si tienes una mejor idea para lograr esto, por favor compártela. ¡Gracias!

Esto es lo que tengo hasta ahora para el bucle

direcciones = ["dirección1", "dirección2", "dirección3"]
claves = ["clave1", "clave2", "clave3"]

for direccion, clave in zip(direcciones, claves):
    txn = contrato_router.functions.swapExactTokensForTokensSupportingFeeOnTransferTokens(monto, 0, [tokenEntrada, tokenSalida], direccion, int(time.time() + 10000))
    swap_txn = txn.buildTransaction({
        'from': direccion,
        'gas': 2500000,
        'gasPrice': web3.toWei('5','gwei'),
        'nonce': web3.eth.getTransactionCount(direccion)
    })
    signed_txn = web3.eth.account.signTransaction(swap_txn, clave)
    tx_receipt = web3.eth.sendRawTransaction(signed_txn.rawTransaction)
    txHash = str(web3.toHex(tx_receipt))
    print(txHash)
Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible enviar cada transacción en un hilo separado utilizando el módulo de threading de Python. Aquí tienes un ejemplo de cómo puedes modificar tu código existente para lograr esto:

    import threading
    
    addresses = ["dirección1", "dirección2", "dirección3"]
    keys = ["clave1", "clave2", "clave3"] 
    
    def process_transaction(addr, key):
        txn = router_contract.functions.swapExactTokensForTokensSupportingFeeOnTransferTokens(cantidadEnviada, 0, [tokenEntrada, tokenSalida], addr, int(time.time() + 10000))
        swap_txn = txn.buildTransaction({
            'from': addr,
            'gas': 2500000,
            'gasPrice': web3.toWei('5','gwei'),
            'nonce': web3.eth.get_transaction_count(addr)})  
        signed_txn = web3.eth.account.sign_transaction(swap_txn, key)
        tx_receipt = web3.eth.send_raw_transaction(signed_txn.rawTransaction)
        txHash = str(web3.toHex(tx_receipt))
        print(txHash)
    
    threads = []
    for addr, key in zip(addresses, keys):
        t = threading.Thread(target=process_transaction, args=(addr, key))
        threads.append(t)
        t.start()
    
    for t in threads:
        t.join()
    

    En este código modificado, se define la función process_transaction para tomar dos argumentos, la dirección de la billetera y la clave privada. Esta función contiene el mismo código que antes, excepto que ya no imprime el hash de la transacción.

    Antes del bucle, se crea una lista vacía llamada threads para contener los objetos de hilo que se generan. Dentro del bucle, se crea un nuevo hilo para cada par dirección-clave, y se inicia el hilo llamando a start() en él. Cada hilo ejecuta la función process_transaction con su dirección y clave correspondientes.

    Después de iniciar todos los hilos, utilizamos join() en un bucle para esperar a que cada hilo termine de ejecutarse. Esto asegura que todas las transacciones se hayan procesado antes de que el programa finalice.

    Ten en cuenta que el número exacto de hilos que se pueden crear al mismo tiempo depende de los recursos de hardware y red disponibles. Es posible que desees experimentar con el número de hilos para encontrar el valor óptimo para tu caso de uso específico.

Comments are closed.