Anzahl der Transaktionen des Vertrags in einem bestimmten Zeitraum

Ich möchte die Anzahl der Transaktionen eines Kontrakts in einem bestimmten Zeitraum ermitteln. Meine Frage ist, dass in der Transaktionsquittung, wenn wir sagen wollen, dass Vertrag A x Transaktionen hat, dies nur die Transaktionen sind, die von diesem Vertrag gesendet werden, oder sie werden auch die an ihn gesendeten sein, dh die Summe der Transaktionsnummern mit diese Vertragsadresse in die Felder „An“ und „Von“ des Transaktionsbelegs eintragen.

Sie können Etherscan io api verwenden
Ich möchte nicht die Gesamtzahl der Transaktionen eines Vertrags finden, sondern sie in einem bestimmten Zeitraum finden, für den ich das Abrufen von Transaktionsinformationen aus einzelnen Blöcken verwende.
Sie können Nonce dafür verwenden
Ich glaube du verstehst meine Frage nicht
Sie möchten die Anzahl der Transaktionen „vom“ Vertrag oder „zum“ Vertrag?
zum Vertrag
Ich denke, ich bin verwirrt bei der Entscheidung, ob "to" die Transaktionen des Vertrags oder "from" bestimmt.
Wenn eine Transaktion von einer bestimmten Adresse kam, sagen wir B, wird diese Transaktion sowohl in den Transaktionen von B als auch in den Transaktionen des Empfängers zählen, das frage ich
Machen wir es uns einfach, möchten Sie die Transaktionen, bei denen der Empfänger der Transaktion der Vertrag ist?

Antworten (3)

Wenn der Vertrag Protokolle für jede empfangene Transaktion ausgibt, müssen Sie nur nach den vom Vertrag ausgegebenen Protokollen suchen.

Sie können dies mit etherescan tun: https://etherscan.io/apis#logs

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

gibt eine Liste aller vom Vertrag generierten Protokolle zurück (vorausgesetzt, ein einzelnes Ereignis pro Transaktion)

Beachten Sie, dass Sie entscheiden können, ab welchem ​​Intervall (in Blöcken) gesucht werden soll.

Die einzigen möglichen Vorbehalte sind:

  1. Der Vertrag generiert nicht für jede Transaktion ein Ereignis.
  2. Der Vertrag generiert mehr als ein Ereignis pro Transaktion.

Dies hängt davon ab, was Sie unter „Transaktion“ und was unter „Vertragsabschluss“ verstehen.

Für Transaktion könnte es mindestens zwei Bedeutungen geben:

  1. Echte Ethereum-Transaktion in einem Block mit separatem Hash, Quittung usw. enthalten.
  2. Sogenannte „interne“ Transaktion, initiiert durch einen Smart Contract, der weder Hash noch Quittung hat.

Mögliche Bedeutungen für „Abschluss eines Vertrages“ sind:

  1. An diesen Vertrag gesendete Transaktion.
  2. Von diesem Vertrag gesendete Transaktion (interne Transaktion).
  3. Transaktion, die diesen Vertrag erstellt hat.
  4. Transaktion, die diesen Vertrag zerstört hat.
  5. Transaktion, die einige andere Kontrakte zerstört hat, indem verbleibender Ether aus dem Saldo des zerstörten Kontrakts an diesen Kontrakt gesendet wurde, ohne den Bytecode dieses Kontrakts auszuführen.
  6. Transaktion, die auf diesen Vertrag zugegriffen hat, ohne ihren Bytecode auszuführen, dh den Ether-Saldo dieses Vertrags oder seinen Bytecode gelesen hat.
  7. Transaktion, die einen Delegiertenaufruf für diesen Vertrag ausgeführt hat.

Sie müssen verschiedene Ansätze verwenden, um verschiedene Arten von Transaktionen im Zusammenhang mit dem Vertrag auf unterschiedliche Weise zu erkennen und zu zählen. In einigen Fällen reicht die Web3-API aus, aber in den anderen Fällen müssen Sie Transaktionen nachverfolgen, die alle die etherescan.io-API verwenden.

Wenn Sie einen Geth-Knoten ausführen; Sie können dieses Skript verwenden, um die Anzahl der Transaktionen eines Vertrags in einem bestimmten Blockbereich zu berechnen.

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)
}

Fügen Sie diese Funktion einfach in die Geth-Konsole ein und rufen Sie sie wie eine normale Vertragsfunktion auf. Der letzte Parameter ist optional und das Skript prüft nur auf erfolgreiche Übertragungen.countNumberOfContractTxs(<contractAddress>, startBlock, endBlock)