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.
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.pendingTransactions
acciones 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í .
Date().getTime()
función para determinar cuánto tiempo lleva la llamada.
Sergeon
Sebí