Zum Inhalt springen

Lohnt sich das aufsetzen einer Ethereum Full Archival Node?


GhostTyper

Empfohlene Beiträge

Cool, der Befehl klappt.

Als Buch, eventuell Mastering Ethereum von Antonopolous. Weiß aber nicht, wie gut das ist.

Hast du mal versucht, MetaMask an deinen Node anzuschließen?

Eventuell könntest du so was wie einen Contract-Checker bauen, so dass man seine Smart Contracts bei deinem Node überprüfen kann und die Historie der vergangenen Ereignisse bekommt.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 30.11.2019 um 18:43 schrieb skunk:

Versuch mal folgendes Skript.

Ich hab' das jetzt mit .NET nachprogrammiert. Das Ergebnis [343 MB, knappe 1,4 Mio Transaktionen] gibt in Reihenfolge den Block, den Hash des Blocks, die Transaktion, Von-Adresse, Zu-Adresse und die STORJ-Tokens an. Mir sind trotzdem noch einige Dinge unklar. Z.B. wie kann ich ermitteln wo bei der Währung der Dezimal-Punkt ist oder wie die Einheit anfürsich heißt? Oder was das Purpose/der Name einer Adresse ist? Ich vermute letztes ist Community-Arbeit?

vor 18 Stunden schrieb Christoph Bergmann:

Eventuell könntest du so was wie einen Contract-Checker bauen, so dass man seine Smart Contracts bei deinem Node überprüfen kann und die Historie der vergangenen Ereignisse bekommt.

Also ich könnte natürlich verschiedene Events anzeigen. Allerdings muss man bei manchen Nicht-Standard-Events irgendwie die Event-Signatur (Welche Felder es gibt) herausfinden. Das ist noch etwas unübersichtlich für mich. Muss ich dazu den SmartContract decompilieren? Ich hoffe das oben genannte Buch bringt dort Licht ins Dunkel.

Ich kann mir vorstellen, dass ich irgendwann in zwei Monaten oder so Zeit finde einen kleinen Blockchain-Explorer für Ethereum und ERC20 Token zu schreiben. Etwas, dass einem zu einer Adresse einen Kontoauszug über alle ERC20 Token für einen bestimmten Zeitraum macht und auch zu dem entsprechenden Zeitpunkt den historischen Wert in EUR oder USD ermittelt. Die Wert-Berechnung geht dann halt nur mit Token, die auf ein oder zwei Exchanges geführt werden, wo ich historische Daten abfragen kann.

Ansonsten bin ich mir nicht sicher, ob das Datenbank-Layout der Archive-Node Super Optimal ist oder ob es sich nicht doch lohnen würde alle interessanten Informationen in eine eigene Datenbank zu schreiben. Konsolidiert mit anderen Informationen, die man mit der web3 API nur durch mehrere Calls bekommt - für schnellere Abfragen. Das Abfragen der 1,4 Mio Transaktionen von skunks Beispiel hat doch gute 4 Minuten gedauert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Stunden schrieb GhostTyper:

Ich hab' das jetzt mit .NET nachprogrammiert. Das Ergebnis [343 MB, knappe 1,4 Mio Transaktionen] gibt in Reihenfolge den Block, den Hash des Blocks, die Transaktion, Von-Adresse, Zu-Adresse und die STORJ-Tokens an.

Laut etherscan: A total of 1,381,915 transactions found

Damit hast du jetzt die Gewissheit wirklich alle Transaktionen zu sehen. Eine normale Full Node hätte deutlich weniger Transaktionen zurück gegeben.

vor 4 Stunden schrieb GhostTyper:

Mir sind trotzdem noch einige Dinge unklar. Z.B. wie kann ich ermitteln wo bei der Währung der Dezimal-Punkt ist oder wie die Einheit anfürsich heißt? Oder was das Purpose/der Name einer Adresse ist? Ich vermute letztes ist Community-Arbeit?

Anzahl der Dezimal Stellen und die kurz Schreibweise kannst du dem Contract entnehmen. Beides ist im ERC-20 Standard definiert. Kannst du mit dem Begriff Polymorphie etwas anfangen? Das sollte hoffentlich erklären wie du an die Informationen kommst ohne den Contract decodieren zu müssen.

Der Contract kann noch weitere Informationen enthalten. Eine Ausführliche Projekt Beschreibung oder sogar die Homepage gehören nicht dazu. Das wird von der Community beigesteuert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Stunden schrieb GhostTyper:

Also ich könnte natürlich verschiedene Events anzeigen. Allerdings muss man bei manchen Nicht-Standard-Events irgendwie die Event-Signatur (Welche Felder es gibt) herausfinden. Das ist noch etwas unübersichtlich für mich. Muss ich dazu den SmartContract decompilieren?

Sagen wir mal nicht zwingend. Auch unbekannte Events werden wie alle anderen Events von der Ethereum Node registriert. Es sollte möglich sein sich einfach alle Events geben zu lassen ohne dabei zu filtern. Das Event selber enthält im ersten Feld immer den Namen des Events. Das kannst du hier ganz gut erkennen: https://etherscan.io/address/0xb64ef51c888972c908cfacf59b47c1afbc0ab8ac#events

Die Event Liste kannst du einfach nach Namen gruppieren dann hast du alle möglichen Events ohne diese Decodieren zu müssen. Für die Bedeutung der anderen Felder musst du aber vermutlich den Contract befragen. Ich habe die .NET Implementierung selber nicht ausprobiert daher kann ich dir dabei nicht weiter helfen.

vor 5 Stunden schrieb GhostTyper:

Ansonsten bin ich mir nicht sicher, ob das Datenbank-Layout der Archive-Node Super Optimal ist oder ob es sich nicht doch lohnen würde alle interessanten Informationen in eine eigene Datenbank zu schreiben. Konsolidiert mit anderen Informationen, die man mit der web3 API nur durch mehrere Calls bekommt - für schnellere Abfragen. Das Abfragen der 1,4 Mio Transaktionen von skunks Beispiel hat doch gute 4 Minuten gedauert.

Damit hast du des Pudels Kern getroffen. Block Explorer wie Etherscan schreiben die Daten in eine eigene Datenbank und erlauben keine Abfragen der kompletten Historie. Damit bleibt die Last im Rahmen. Ethereum ist garnicht mal so Klasse wenn man etwas genauer hinschaut was dort passiert....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 2.12.2019 um 11:47 schrieb skunk:

Die Event Liste kannst du einfach nach Namen gruppieren dann hast du alle möglichen Events ohne diese Decodieren zu müssen.

Also, ich hab' jetzt Mal ein bisschen recherchiert. Die ganze Sache gut zu machen ist leider sehr aufwändig:

  1. Die Balance eines ERC20 Token kann durch mehr als einen Transfer beeinflusst werden. Z.B. durch Code im Contract.
  2. Das führt dazu, dass ich für einen "ordentlichen Kontoauszug" jedes ERC20 Token für jeden Vertrag und jeden Block "Querien" (ausführen von getBalance()) müsste.
  3. Ich muss die Funktionalität also entweder auf Token, die idr. nur durch Transfers geändert werden können beschränken oder ich werde nur wenige zeitgleiche Anfragen bearbeiten können. XD
  4. Eine Quick & Dirty-Lösung wäre es nach jedem Transfer das Token zu Querien und die Differenz zu der Balance davor und der Balance danach +- Transfer wäre dann, was der SmartContract halt durch den Transfer wegnimmt oder dazu gibt. Würde aber trotzdem keine Sinde-Chain oder -Channel-Token abdecken können, etc.

Maeh...

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 7 Stunden schrieb GhostTyper:
  1. Die Balance eines ERC20 Token kann durch mehr als einen Transfer beeinflusst werden. Z.B. durch Code im Contract.

Unwahrscheinlich. Der Entwickler kann das Transfer Event oder auch jedes andere Event überall feuern. Wenn er der Meinung ist einen komplizierten Contract zu schreiben, dann soll er das tun. Die Events sind dabei sein kleinstes Problem. Auf die kannst du dich in der Regel verlassen. Er muss die Events auch ordentlich implementieren sonst wird sein Contract später nicht richtig funktionieren.

Der ERC-20 Token ist selber ein Contract mit Privat und Public Variablen und Methoden. Der Kontostand ist Private. Die Transfer Funktion ist Public. Versuch doch zum Spaß mal einen Contract zu schreiben, der STORJ Tokens bewegt ohne das Transfer Event zu feuern. Das dürfe unmöglich sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 8 Stunden schrieb skunk:

Versuch doch zum Spaß mal einen Contract zu schreiben, der STORJ Tokens bewegt ohne das Transfer Event zu feuern. Das dürfe unmöglich sein.

Schon klar. Das bezweifelt auch niemand.

Es könnte aber jemand Beispielsweise einen Öko-Coin machen, der pro Überweisung zusätzliche 0,5% von dem was überwiesen wurde vom Konto abzieht. Der Contract-Ersteller verspricht dann pro Überweisung für diese 0,5% Bäume zu pflanzen - oder what ever.

Es gibt wohl Beispiele für Token, die Transfers machen, ohne einen Transfer zu callen? Z.B.: Chai.sol?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Minuten schrieb GhostTyper:

Es gibt wohl Beispiele für Token, die Transfers machen, ohne einen Transfer zu callen? Z.B.: Chai.sol?

Damit schneiden sie sich aber in das eigene Fleisch. Du kannst auch einen Token erstellen bei dem das Total Supply auf Coinmarket Cap falsch ist. Du gibst 1 Million Coins zu 10 cent raus. Das geringe Market Cap lässt sich recht gut an potentielle Investoren verkaufen. Stellt euch vor da steigt jemand ein und möchte Coins im Wert von 10K kaufen. Bei dem geringen Market Cap wird der Preis sehr schnell steigen.
In den Contract schreibst du außerdem eine Funktion mit der du jederzeit Coins aus dem Nichts erschaffen und auf dein Wallet senden kannst. Dabei feuerst du keine Events und passt auch nicht den Total Supply an. Damit kannst du alle eine Zeit lang hinters Licht führen. Irgendwann fällt es aber auf und dann wird es lustig.

Vom Standard abzuweichen hat den Nachteil, dass man es schwer haben wird auf einer Börse gelistet zu werden. Hält man sich an den Standard, hat man dagegen Zugriff auf diverse Börsen und Tools.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 5.12.2019 um 19:30 schrieb skunk:

Vom Standard abzuweichen hat den Nachteil, dass man es schwer haben wird auf einer Börse gelistet zu werden. Hält man sich an den Standard, hat man dagegen Zugriff auf diverse Börsen und Tools.

Es gibt noch einen weiteren Fall bei Ethereum selbst. Vielleicht hast Du da eine Idee:

Wenn jemand einen Block mined bekommt er ETH dafür. Und zwar ohne Transfer-Event:

  1. Den Block Reward.
  2. Das darin verbrauchte GAS.
  3. Zusätzliche ETH für ein einbauen von bis zu 2 Uncles. <- Hier beginnt das Problem.

Ich kann an einem Block ablesen, wer ihn gemined hat und dann halt davor und danach getBalance für ETH ausführen.

Allerdings:

Wenn jemand einen Block mined, der es nicht in die Blockchain schafft (einen Uncle) hat dieser Block die Chance in einem der 6 folgenden Blöcken als einer von zwei Blöcken pro Sieger-Block mit aufgenommen zu werden. In diesem Fall bekommt der nicht erfolgreiche Miner 7/8 der ETHs eines normalen Block-Rewards.

Weißt Du vielleicht, wie ich mit web3.js (ich versuche das dann in Nethereum zu übersetzen) abfragen kann, welche Uncles in einem Block mit eingebaut wurden und wer deren Miner gewesen wären?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb GhostTyper:

Wenn jemand einen Block mined bekommt er ETH dafür. Und zwar ohne Transfer-Event:

Ich glaube die Ethereum Transaktionen sind grundsätzlich ohne Transfer Event. Das Transfer Event gibt es nur in Verbindung mit einem Smart Contract.

vor einer Stunde schrieb GhostTyper:

Weißt Du vielleicht, wie ich mit web3.js (ich versuche das dann in Nethereum zu übersetzen) abfragen kann, welche Uncles in einem Block mit eingebaut wurden und wer deren Miner gewesen wären?

Da ich nicht mine, habe ich das Problem selber nicht. Das interessante ist aber, dass es selbst für den Standardfall keine fertige Funktion gibt. Versuch doch erstmal die ETH Historie ohne die Sonderfälle zu erstellen. Das ist bereits eine kleine Herausforderung. Ich habe bei mir nie geprüft ob er dabei die Block Rewards nicht schon automatisch mit auflöst. Falls nicht, dann solltest du trotzdem bereits alle Daten haben die du brauchst um dir eine Fiktive Transaktion zu erstellen.

Ich habe folgende Lösung bei mir im Einsatz: https://ethereum.stackexchange.com/questions/8900/how-to-get-transactions-by-account-using-web3-js

Edit: Falls er das nicht automatisch auflöst, bekommst du so die Rewards und Uncles: https://ethereum.stackexchange.com/questions/5958/how-to-query-the-amount-of-mining-reward-from-a-certain-block

Bearbeitet von skunk
Link zu diesem Kommentar
Auf anderen Seiten teilen

Also, ich habe Code geschrieben, der alle ERC20 Transactions/Transfers ausliest und auch alle ETH Transactions, incl. Transactions zum Erstellen von SmartContracts. Das GAS jeder Transaction kann ich ebenfalls auslesen, wie auch das gesamte GAS aus dem Block, den Miner, etc. Ich kann sogar wie schon geschrieben die Balances eines jeden SmartContracts zu jedem Block auslesen.

Bevor ich das aber in eine Webseite klatsche muss ich ein gutes Datenbank-Design herausfinden und dazu muss ich alle Möglichkeiten, wie ETH noch bewegt oder Erzeugt werden können wissen. Z.B. soll man ja auch sehen, wieso man jetzt mehr ETH "bekommen" hat. Ich würde also in meine Transfer Tabelle auch Mining-Ergebnisse, etc. mit einem Flag eintragen, so dass ich diese dann später anzeigen kann.

Dein 2. Link hat mir vermutlich aber die Antwort beschert:

web3.eth.getBlock(<block>).uncles

Komisch, dass ich das in Nethereum übersehen habe. Ich hoffe uncles enthält auch deren "Miner" und von welchem Block dieser ein Uncle ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 14 Minuten schrieb GhostTyper:

Bevor ich das aber in eine Webseite klatsche muss ich ein gutes Datenbank-Design herausfinden und dazu muss ich alle Möglichkeiten, wie ETH noch bewegt oder Erzeugt werden können wissen.

Meine Scripte habe ich mir ursprünglich geschrieben um meine Steuererklärung zu automatisieren. Vorne meine Adresse Liste rein und hinten kommen alle Transaktionen raus. Soweit ich das noch dunkel in Erinnerung habe, nutzen einige Börsen einen Smart Contract für einen ETH Multisend. Prüfe mal nach ob du diesen Sonderfall schon abgedeckt hast.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 8 Minuten schrieb skunk:

Soweit ich das noch dunkel in Erinnerung habe, nutzen einige Börsen einen Smart Contract für einen ETH Multisend.

Ich muss das leider in der Blockchain "sehen", damit ich eine Ahnung habe, um was es dort geht. Hast Du mir vielleicht einen Block, wo so etwas passiert oder eine Adresse mit der so etwas passiert ist?

Das Abfragen der Uncles liefert mir übrigens leider einen Block Hash. Ich weiß aber nicht, ob ich diesen noch abfragen kann, da dieser ja leider nicht Teil der Blockchain ist. 😢

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...

Wichtige Information

Wir haben Cookies auf Deinem Gerät platziert. Das hilft uns diese Webseite zu verbessern. Du kannst die Cookie-Einstellungen anpassen, andernfalls gehen wir davon aus, dass Du damit einverstanden bist, weiterzumachen.