Consultando asíncronamente la cadena de bloques

Esta pregunta está relacionada con esta o esta . Aquí hay un tutorial que muestra algunos ejemplos de filtrado, pero no entra en la granularidad del nivel de transacción. ¿Podemos consultar la cadena de bloques por transacción y procesar transacciones específicas de forma asíncrona?

Por ejemplo, este código pasa por bloques que comienzan y terminan con un número de bloque determinado y muestra cada transacción hacia o desde una dirección determinada:

function getTransactionsByAccounts(myaccount, startBlockNumber, endBlockNumber) {

  console.log("Searching for transactions to/from account \"" + myaccount + "\" within blocks "  + startBlockNumber + " and " + endBlockNumber + "\"");

  for (var i = startBlockNumber; i <= endBlockNumber; i++) {

    var block = eth.getBlock(i, true);
    if (block != null && block.transactions != null) {
      block.transactions.forEach( function(e) {
        if (myaccount == "*" || myaccount == e.from || myaccount == e.to) {
          console.log("  tx hash          : " + e.hash + "\n"
            + "   nonce           : " + e.nonce + "\n"
            + "   blockHash       : " + e.blockHash + "\n"
            + "   blockNumber     : " + e.blockNumber + "\n"
            + "   transactionIndex: " + e.transactionIndex + "\n"
            + "   from            : " + e.from + "\n" 
            + "   to              : " + e.to + "\n"
            + "   value           : " + e.value + "\n"
            + "   gasPrice        : " + e.gasPrice + "\n"
            + "   gas             : " + e.gas + "\n"
            + "   input           : " + e.input);

            // Do something asynchronously with the transaction:
            call_async_method(e); // <== HOW CAN WE ADD THIS AS A PROMISE?
        }
      })
    }
  }
}

¿Cómo podemos procesar una transacción de forma asíncrona (como se muestra en el código)? posiblemente usando promesas y los filtros definidos en web3.js.

¿Qué quieres decir exactamente con 'como una promesa'? Si su método es, por ejemplo, guardar la transacción en una base de datos o llamar a un servicio web con datos de transacción, no veo la necesidad de prometerlo, por lo que entiendo bien, promete, pero lo dudo como 10 veces al día: - )-.
Llamar a una función para confirmar que el filtro encontró una transacción (planeo iterar a través de la cadena de bloques y procesar un conjunto de transacciones al mismo tiempo. El código anterior funciona en serie, pero necesito una forma de paralelismo ya que cada transacción puede tomar una cantidad posiblemente larga de tiempo).

Respuestas (1)

Desafortunadamente, no se proporciona ningún filtro para analizar las transacciones confirmadas sin pasar primero por un bloque, es decir, puede activar un filtro (y ejecutar call_async_method() ) siempre que haya un bloque más reciente: eth.getBlock("latest"), pero no existe tal función para una transacción.

Dicho esto, si está operando en una cadena de bloques privada (confía en todos los nodos) y cree que todas las transacciones iniciadas se agregarán con éxito a la cadena de bloques, puede crear filtros para reaccionar de modo que eth.pendingTransactionsacciones como call_async_method() realizarse de inmediato sin esperar a que las transacciones se confirmen y se agreguen a la cadena de bloques. Sin embargo, en un momento posterior, siempre debe verificar si estas transacciones están realmente confirmadas.

Esta no es una solución ideal o recomendada y contradice los principios fundamentales de blockchain, pero puede probar y verificar si es adecuado para su caso de uso.

Editar: forma rápida de escanear bloques para transacciones en una cuenta. Este es un escáner asíncrono con 200 subprocesos: https://ethereum.stackexchange.com/a/7184/2460

Código fuente aquí .

No he usado el nodo js. Por lo que entiendo, es un módulo de back-end (más o menos como php) que ejecuta javascript. Esto es excelente para la programación asincrónica y basada en eventos, ya que se abstrae de tratar con subprocesos múltiples. No sé con qué facilidad se puede poner en una biblioteca y distribuir en un proyecto de software. Y también, qué sucede cuando una determinada llamada (call_async_method()) tarda "demasiado" (según tengo entendido, el nodo tiene un solo subproceso: stackoverflow.com/questions/1884724/what-is-node-js )
No estoy seguro, pero ¿todas las funciones se ejecutan en el nodo js de forma asíncrona? Así parece de gist.github.com/ross-p/bd5d4258ac23319f363dc75c2b722dd9
Incluso yo no soy un experto en node.js. ¿Quizás puedas publicarlas como preguntas separadas en stackoverflow? Puede intentar usar la Date().getTime()función para determinar cuánto tiempo lleva la llamada.
La cuestión es que Javascript, que yo sepa, se ejecuta secuencialmente en el navegador, necesito una funcionalidad similar a un servidor de un nodo que verifique el bloque para transacciones en paralelo usando Javascript. Estoy leyendo sobre nodejs, ya que parece ejecutar todo de manera pseudo paralela (usando programación determinista).
Por favor publique sus hallazgos/pensamientos.
Ahora estoy usando un enfoque basado en contratos para almacenar datos en la cadena de bloques (usando arreglos de estructuras de manera similar a las tablas en una base de datos). El problema con el enfoque basado en transacciones es que no puede sincronizar con los datos en el campo de entrada de transacciones ( puede leer bloques simultáneamente pero no sincronizar con el campo de datos de transacción de ellos).