Solidity Smart Contract automatische Auszahlung (ETH)

Ich bin ein bisschen neu in Smart Contracts, habe viel gesucht, aber hoffe, dass mir hier jemand helfen kann.

Ich werde versuchen, es so gut wie möglich zu erklären. Ich baue Ethereum mit ein paar Rigs ab.

Jedes einzelne Rig sendet die ETH automatisch über einen Pool an eine bestimmte ETH-Adresse. Jetzt habe ich also mehrere (30+) ETH-Adressen, die ETH empfangen. Sehr frustrierend, jede Adresse zu überprüfen und die ETH per Hand an mein Hauptkonto zu senden.

Gibt es eine Möglichkeit, ETH mit einem Smart Contract (Solidity) automatisch von jedem Konto an mein MAIN-Konto zu senden?

Sagen wir; Adresse 1 empfängt 0,1 ETH, automatisches Senden (sofort nach Eingang der Transaktion) 0,1 ETH an MAIN ETH-Adresse.

Die Adressen erhalten unterschiedliche Beträge an ETH, einige 0,1 ETH, einige 0,05 ETH usw. Egal welcher Betrag an die Mining-Adresse gesendet wird, er muss auf das Hauptkonto überwiesen werden.

Ich hoffe jemand kann mir dabei weiterhelfen.

Bearbeiten: Beispiel

0x0000ADRESSE1: 0.1ETH

0x0000ADRESSE2: 0.3ETH

0x0000ADRESSE3: 0.2ETH

0x0000ADRESSE4: 0.1ETH

(Schreiben Sie einen Smart Contract für jede obige Adresse, wenn ETH in den obigen Adressen ist, übertragen Sie ETH an MAIN)

0x0000HAUPTANDRESS: 0.7ETH

function () public payable { mainAccount.transfer(msg.value); }
Danke @smart für deine Antworten. Aber könnten Sie ein bisschen mehr erklären, was Sie mit der obigen Zeile meinen? Wie gesagt, ich bin ein bisschen neu in Sachen Smart Contracts.

Antworten (2)

Es funktioniert nicht ganz so, wie Sie zu denken scheinen, und das macht es irgendwie schwierig, direkt mit Ratschlägen zu antworten, die nicht zu einer langen Lernkurve führen.

In Ethereum haben Sie externe Konten (EOA) (Wallets) und Verträge, die beide durch Adressen dargestellt werden und in der Sprache der Smart Contracts kaum zu unterscheiden sind. In der Kette passiert niemals etwas, es sei denn, jemand signiert eine Transaktion von einem EOA. Verträge führen Code aus, wenn sie eine Nachricht erhalten.

Insbesondere kann kein EOA oder Vertrag Geld vom Konto eines anderen ausgeben. Verträge empfangen Geld und senden es wie eine Brieftasche. Wir können also nicht wirklich einen Vertrag machen, der das Geld aus den Adressen saugt. Wir könnten umgekehrt Verträge unter der Kontrolle der verschiedenen Konten bereitstellen und die verschiedenen Konten könnten Transaktionen unterzeichnen, um die Dinge in Gang zu bringen, aber wie würde das Ihr Ziel erreichen? Sehen Sie das Problem?

Ihr Ziel kann mit einem relativ einfachen Hub-and-Spoke-Design erreicht werden, wobei die Pool-Zahlungen an Verträge gehen, die Spokes sind. Spokes leitet alle erhaltenen Gelder an einen Hub weiter. Mit Hub kann ein privilegierter Benutzer (Sie) Geld abheben, und mit Hub können Sie neue Spokes generieren, die Liste der Spokes überprüfen und so weiter.

Ich glaube, dieser Beispielcode könnte Sie nur in ein Projekt von unerwarteter Komplexität führen, weil Sie sich an etwas Fremdes gewöhnen müssten, verglichen mit der derzeitigen Funktionsweise.

Ich hoffe es hilft.

Hallo Rob, vielen Dank für deine sehr detaillierten Informationen. Das erklärt einiges. Ich verstehe jetzt, dass dies nicht der Weg ist. Gibt es eine Möglichkeit, dass ich eine Problemumgehung bekomme, indem ich eine Art Skript direkt auf dem Mining-Rig erstelle, sagen wir, dass ich ein Skript erstelle, das, wenn eine Zahlung eingeht, das Skript automatisch eine Transaktion an mein Main signiert Konto? (ohne die Verwendung eines Smart Contracts, meine ich)
Das ist nicht unmöglich. Sie könnten wahrscheinlich etwas einrichten, das regelmäßig ausgeführt wird, und prüfen, ob das Coinbase-Konto einen Kontostand > 0 hat, und das Geld weiterleiten. Sie könnten auch in Betracht ziehen, die Schlüssel aus dem keystoreOrdner zu kopieren (wenn Sie Geth verwenden) und einfach alle diese Konten in eine Brieftasche auf einer Workstation zu importieren. Das könnte noch besser sein - kein Code.

Ich verstehe, dass wir in einem Vertrag erhaltene Ether nicht einfach weiterleiten können:

Um Ether in einem Vertrag zu erhalten, benötigen Sie eine Funktion ohne Parameter und Rückgabewert, dh eine als zahlbar gekennzeichnete Fallback-Funktion. Aber (wie in der Dokumentation http://solidity.readthedocs.io/en/v0.4.21/contracts.html angegeben) wenn Ether gesendet werden, ist eine solche Fallback-Funktion durch 2300 Gaseinheiten begrenzt, und der Vorgang des Sendens von Ethern verbraucht nur mehr Gas (ebd.).

Daher müssen gesendete Ether in Verträgen bleiben, die sie erhalten. Sie benötigen einen Betreuungsvertrag, der eine Liste der Empfängerverträge enthält. Sie benötigen eine Funktion (wie transferEthersUp()) in den empfangenden Verträgen, die Ether an den Überwachungsvertrag überträgt. Außerdem benötigen Sie eine Funktion im Überwachungsvertrag (wie collectEthers()), die alle empfangenden Verträge iteriert und die Funktion transferEthersUp() aufruft.

Um Ether zu sammeln, rufen Sie einfach regelmäßig collectEthers() auf.

Natürlich müssen einige wichtige Sicherheitsaspekte implementiert werden: um zu überprüfen, dass nur der Überwachungsvertrag transferEthersUp() aufrufen darf, um zu überprüfen, dass nur der Vertragsinhaber collectEthers() aufrufen darf.

Und leider kostet Sie dieser Abholservice etwas zusätzliches Benzin.