Wie gebe ich das vollständige Konto auf dem Knoten aus?

http://etherscan.io/accounts/ eine Liste aller normalen Konten auf dem Knoten.
http://etherscan.io/accounts/c Liste aller Kontaktkonten auf dem Knoten.

Wie haben Sie diese Informationen erhalten? Woher kamen diese Informationen? (json rpc? java api?)
Ist es in der Go-Ethereum-Geth-Konsole möglich ? oder cpp oder ethereumj ?

Alles, was ich will, ist totale Kontotransparenz. Ich erwarte Transparenz in meinem privaten Knoten.
Bitte hilf mir!

Was meinst du mit Konto der Knoten? Derjenige, auf dem die erste Transaktion an den Knoten weitergeleitet wurde? Andernfalls kann ich nicht herausfinden, was Sie fragen.
Bitte bearbeiten Sie, um nur Ihre erste Frage zu stellen, und bearbeiten Sie den Titel. (Wenn Sie eine unmögliche Antwort erhalten, können Sie eine separate Frage dazu stellen und sie mit dieser verknüpfen.)
Frage behoben. Ich möchte die gesamte Rechnung ausdrucken. Ich hoffe, dass diese Angelegenheit gelöst wird.

Antworten (1)

EtherScan würde die Blockchain Block für Block scannen und die Daten in einer SQL/NoSQL-Datenbank speichern.

Es folgt etwas geth consoleJavaScript-Code, um die Konto- und Vertragsadressen aus der in jedem Block ausgeführten Transaktion zu extrahieren.

Verarbeiten Sie die Blöcke von Block 0 bis eth.blockNumberund führen Sie diesen Code weiter aus, wenn neue Blöcke produziert werden. Sammeln Sie die Kontoinformationen in Ihrer SQL/NoSQL-Datenbank für einen einfachen Zugriff auf die Daten.

Hier ist der Code:

function getAccounts(startBlockNumber, endBlockNumber) {
  if (endBlockNumber == null) {
    endBlockNumber = eth.blockNumber;
    console.log("Using endBlockNumber: " + endBlockNumber);
  }
  if (startBlockNumber == null) {
    startBlockNumber = endBlockNumber - 1000;
    console.log("Using startBlockNumber: " + startBlockNumber);
  }
  console.log("Searching for accounts within blocks "  + startBlockNumber + " and " + endBlockNumber + "\"");

  for (var i = startBlockNumber; i <= endBlockNumber; i++) {
    if (i % 1000 == 0) {
      console.log("Searching block " + i);
    }
    var block = eth.getBlock(i, true);
    if (block != null && block.transactions != null) {
      block.transactions.forEach( function(e) {
        console.log("Block: " + e.blockNumber + "\n" 
          + "  Tx#: " + e.transactionIndex + "\n"
          + "  From: " + e.from + "\n"
          + "  To: " + e.to);
        if (e.to == null) {
          var txReceipt = eth.getTransactionReceipt(e.hash);
          if (txReceipt != null && txReceipt.contractAddress != null) {
            console.log("  Contract created: " + txReceipt.contractAddress);
          }
        }
        var status = debug.traceTransaction(e.hash);
        if (status.structLogs.length > 0) {
          console.log("  Status: " + status.structLogs[status.structLogs.length-1].error);
        }
      })
    }
  }
}


Das Ausführen des Skripts für den Block vor und den Block nach dem Block, in dem das DAO (Vertragsadresse 0xbb9bc244d798123fde783fcc1c72d3bb8c189413) erstellt wurde, führt zu folgendem Ergebnis:

// TheDAO created in block 1428757
getAccounts(1428756, 1428758)
Searching for accounts within blocks 1428756 and 1428758"
Block: 1428756
  Tx#: 0
  From: 0xfb95c8d03f91bf3daede239963cc3f6392af8b89
  To: 0x31911ed12996ce70d0322dc38316123d639a72c2
Block: 1428756
  Tx#: 1
  From: 0xf713234526d4d2c94ed45d4b9aa2c65bba235bd4
  To: 0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98
Block: 1428757
  Tx#: 0
  From: 0x793ea9692ada1900fbd0b80fffec6e431fe8b391
  To: null
  Contract created: 0xbb9bc244d798123fde783fcc1c72d3bb8c189413
  Status: 
Block: 1428758
  Tx#: 0
  From: 0xfb95c8d03f91bf3daede239963cc3f6392af8b89
  To: 0x31911ed12996ce70d0322dc38316123d639a72c2
Block: 1428758
  Tx#: 1
  From: 0x936a394441d6b6baf033d2f1a0d01e0237670d50
  To: 0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98
Block: 1428758
  Tx#: 2
  From: 0x8ec8b1d38b74dece7847e3a025ae53699f08aa1f
  To: 0x91337a300e0361bddb2e377dd4e88ccb7796663d
undefined


Das Ausführen des Skripts mit der Blocknummer einer Transaktion des Angreifers von The DAO vom 17.06.2016 mit einem Fehler zeigt den Fehlerstatus:

// TheDAO Attack 17/06/2016 had an error in block 1720426
getAccounts(1720426, 1720426)
Searching for accounts within blocks 1720426 and 1720426"
Block: 1720426
  Tx#: 0
  From: 0x969837498944ae1dc0dcac2d0c65634c88729b2d
  To: 0xc0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89
  Status: invalid jump destination (PUSH1) 2
Block: 1720426
  Tx#: 1
  From: 0xed059bc543141c8c93031d545079b3da0233b27f
  To: 0x8b3b3b624c3c0397d3da8fd861512393d51dcbac
  Status: 
Block: 1720426
  Tx#: 2
  From: 0xed059bc543141c8c93031d545079b3da0233b27f
  To: 0x8b3b3b624c3c0397d3da8fd861512393d51dcbac
  Status: 
Block: 1720426
  Tx#: 3
  From: 0xfbb1b73c4f0bda4f67dca266ce6ef42f520fbb98
  To: 0x3b80cb7ecb50760fff3d6dec17a43857eb2661e3
Block: 1720426
  Tx#: 4
  From: 0x91337a300e0361bddb2e377dd4e88ccb7796663d
  To: 0x797d1f2d60538013574734dbd6e4ef70fd81e695
Block: 1720426
  Tx#: 5
  From: 0x91337a300e0361bddb2e377dd4e88ccb7796663d
  To: 0xf565de1874479a51d46dde81d6e9b060540e54f6
Block: 1720426
  Tx#: 6
  From: 0xea674fdde714fd979de3edf0f56aa9716b898ec8
  To: 0x92e4596507168a736c9df4da3af5a6c52e64e54e
Block: 1720426
  Tx#: 7
  From: 0x011b575ec44f36950f84d3711e3eb39059351324
  To: 0xbb9bc244d798123fde783fcc1c72d3bb8c189413
  Status: 
Block: 1720426
  Tx#: 8
  From: 0xe782e8ebe804cf9192cfe0e31302da03082f9164
  To: 0xbb9bc244d798123fde783fcc1c72d3bb8c189413
  Status: 
undefined    


Das Codebit, das den Status der Transaktion überprüft, wird in beschrieben Wie kann der Transaktionsstatus von einem ausgelösten Fehler erkannt werden, wenn Gas genau das gleiche sein kann wie das Gas, das für eine erfolgreiche Transaktion verwendet wird? .

Beeindruckend! Bokky PooBah absolut wunderbar!!!!!!