Recuento de transacciones del contrato en un período determinado

Quiero determinar el número de transacciones de un contrato en un período determinado. Mi pregunta es que en el recibo de la transacción, si queremos decir que el contrato A tiene x número de transacciones, estas serán solo las transacciones enviadas desde este contrato o serán también las que se envían a él, es decir, la suma de los números de transacciones que tienen esta dirección de contrato en los campos de origen y destino del recibo de la transacción.

puedes usar etherscan io api
No quiero encontrar el número total de transacciones de un contrato, más bien quiero encontrarlas en un período determinado para el cual estoy utilizando para obtener información de transacciones de bloques individuales.
puedes usar nonce para eso
no creo que entiendas mi pregunta
¿Quiere el número de transacciones 'desde' el contrato o 'hacia' el contrato?
al contrato
Supongo que estoy confundido al decidir si 'a' determina las transacciones del contrato o 'desde'
Si una transacción provino de una determinada dirección, digamos B, ¿esta transacción contará en las transacciones de B, así como en las transacciones del receptor? Eso es lo que estoy preguntando.
Hagamos esto simple, ¿quieres las transacciones donde el receptor de la transacción es el contrato?

Respuestas (3)

Si el contrato emite registros para cada transacción recibida, solo necesita buscar los registros emitidos por el contrato.

Puede hacer esto con etherescan: https://etherscan.io/apis#logs

Por ejemplo: https://api.etherscan.io/api?module=logs&action=getLogs &fromBlock=379224 &toBlock=latest &address=0x33990122638b9132ca29c723bdf037f1a891a70c &apikey=YourApiKeyToken

devolverá una lista de todos los registros generados por el contrato (suponga un solo evento por transacción)

Tenga en cuenta que puede decidir a partir de qué intervalo (en bloques) buscar.

Las únicas advertencias posibles son:

  1. El contrato no genera un evento para cada transacción.
  2. El contrato genera más de un evento por transacción.

Esto depende de qué entienda por "transacción" y qué entienda por "transacción de un contrato".

Para transacción podría haber al menos dos significados:

  1. Transacción real de Ethereum incluida en un bloque con hash separado, recibo, etc.
  2. La llamada transacción "interna", iniciada por un contrato inteligente, que no tiene hash ni recibo.

Los posibles significados de “transacción de un contrato” son:

  1. Transacción enviada a este contrato.
  2. Transacción enviada por este contrato (transacción interna).
  3. Transacción que creó este contrato.
  4. Transacción que destruyó este contrato.
  5. Transacción que destruyó algunos otros contratos enviando el éter restante del saldo del contrato destruido a este contrato sin ejecutar el código de bytes de este contrato.
  6. Transacción que accedió a este contrato sin ejecutar su código de bytes, es decir, leer el saldo de éter de este contrato o el código de bytes del mismo.
  7. Transacción que realizó llamada delegada a este contrato.

Debe usar diferentes enfoques para detectar y contar diferentes tipos de transacciones relacionadas con el contrato de diferentes maneras. En algunos casos, la API Web3 será suficiente, pero en otros casos, deberá rastrear las transacciones, todas usan la API etherescan.io.

Si tiene un nodo geth en ejecución; puede usar este script para calcular el número de transacciones de un contrato en un rango de bloque dado.

function countNumberOfContractTxs(contractAddress, blockStart, blockEnd) {
  var incominngCount = 0;
  var outgoingCount = 0;
  contractAddress = contractAddress.toLowerCase()
  if(!blockEnd) blockEnd = eth.getBlock('latest').number
  for(var blockNum=blockStart; blockNum<blockEnd; blockNum++) {
    var txs = eth.getBlock(blockNum).transactions;
    if(!txs.length) continue;
    for(var j=0; j<txs.length; j++) {
      var tx = txs[j]
      var txDetail = eth.getTransactionReceipt(tx)
      if(txDetail.status == '0x0') continue;
      if(txDetail.from.toLowerCase() == contractAddress) outgoingCount++
      if(txDetail.to.toLowerCase() == contractAddress) incominngCount++
    }
  }
  console.log(incominngCount, outgoingCount)
}

Simplemente pegue esta función en la consola geth y llámela como una función de contrato normal. El último parámetro es opcional y la secuencia de comandos verifica solo los txs exitosos.countNumberOfContractTxs(<contractAddress>, startBlock, endBlock)