Kann ich mit dem Ethereum Alarm Clock Scheduler rekursive Anrufe tätigen? [Duplikat]

Die hier gegebene Antwort bietet keine vollständige Lösung.

Kann mir bitte jemand vorschlagen, ob es praktisch machbar ist, eine Methode in meinem Smart Contract alle 24 Stunden mit Ethereum Alarm Clock auszuführen? Sie können auf das Beispiel in dem oben verlinkten Beitrag verweisen.

Laut diesem Dokument ist es nicht möglich, denselben Aufruf nach 255 Blockzeiten erneut auszuführen (siehe Parameter GracePeriod ).

Bitte überprüfen Sie, ob mein Verständnis richtig ist.

Ich habe diese Frage hier beantwortet: ethereum.stackexchange.com/questions/11199/… Schauen Sie mal rein. Dort gibt es eine detaillierte Antwort mit Codebeispiel.

Antworten (2)

Sie können wiederkehrende Anrufe mit dem Ethereum-Wecker ausführen. Das gracePeriod, was in den von Ihnen bereitgestellten Links beschrieben ist, gibt an, wie viele Blöcke Sie zulassen, dass der Executor verzögert wird (maximal). Angenommen, Sie möchten, dass etwas in Block ausgeführt wird x, gracePeriodzeigt das an, dass Sie damit einverstanden sind, dass Ihr Aufruf in einem beliebigen Block zwischen xund ausgeführt wird x + gracePeriod. Danach x + gracePeriodgilt dies als zu spät und der Anruf wird nicht ausgeführt.

Es wird also funktionieren.

Auf der anderen Seite haben Sie Alternativen zu EAC, die weniger Gas kosten (eine Ether-Transaktion kostet etwa 500.000 Gas in EAC, die jetzt von Chronologic umgebaut wird) und auch Aion hs feste Gebühren. Das Aion-Planungssystem hat Gebühren von etwa 10 Cent oder Dollar pro Anruf, der erste Anruf, den Sie tätigen, kostet etwa 250.000 Gas und danach betragen die Kosten für einen Anruf nur 70.000 (5x weniger als EAC). Dies liegt daran, dass das System Konten für die Benutzer erstellt. Sie können es auf ropsten testen.

Dieser Code zeigt, wie Sie einen wiederkehrenden Anruf (jeden Tag) mit dem Aion Scheduling- System einrichten :

pragma solidity ^0.4.24; 

// interface Aion
contract Aion {
    uint256 public serviceFee;
    function ScheduleCall(uint256 blocknumber, address to, uint256 value, uint256 gaslimit, uint256 gasprice, bytes data, bool schedType) public payable returns (uint,address);

}

// Main contract
contract MyContract{
    uint256 public sqrtValue;
    Aion aion;

    constructor(uint256 number) public payable{
        scheduleMyfucntion(number);
    }

    function scheduleMyfucntion(uint256 number) public {
        aion = Aion(0xFcFB45679539667f7ed55FA59A15c8Cad73d9a4E);
        bytes memory data = abi.encodeWithSelector(bytes4(keccak256('myfucntion(uint256)')),number); 
        uint callCost = 200000*1e9 + aion.serviceFee();
        aion.ScheduleCall.value(callCost)( block.timestamp + 1 days, address(this), 0, 200000, 1e9, data, true);
    }

    function myfucntion(uint256 number) public {
        // do your task here and call again the function to schedule
        scheduleMyfucntion(number);
    } 

    function () public payable {}

}

Weitere Details finden Sie hier und hier

Hoffe das hilft.

Als ich versuchte, diesen Vertrag auf Ropsten Network bereitzustellen, schlug dies fehl! Ich habe zum Zeitpunkt der Bereitstellung die Meldung „Grenze für Gasschätzung fehlgeschlagen“ erhalten.
@Gagan, ich habe den Code korrigiert. Das Wort zahlbar im Konstruktor fehlte und dieser Code erfordert, dass Sie beim Deployment Ether senden, da es sofort den nächsten Anruf plant. Sie können beim Deployment nur 0,01 Ether senden, wodurch dieser Vertrag lange läuft. Lassen Sie mich wissen, wenn Sie andere Probleme haben. Ich habe diesen Vertrag auf Ropsten bereitgestellt und läuft, sodass Sie keine anderen Probleme finden sollten. Gib mir Bescheid.
Danke! Ich konnte den Vertrag erfolgreich bereitstellen. Ich habe eine globale Variable vom Typ uint256 erstellt und jedes Mal erhöht, wenn myfunction() aufgerufen wird. Ich kann weder neue Transaktionen noch die auf einen inkrementierten Wert gesetzte Variable sehen. Ich bin mir nicht sicher, ob mein geplanter Anruf immer angerufen wird. Können Sie mir bitte helfen, herauszufinden, was los ist?
Und was macht der Konstruktorparameter "number" in diesem Code?
Die Parameternummer dient nur als Beispiel, um zu zeigen, dass Sie mit der Planung jeden Parameter an Ihre Funktion übergeben können, dh Sie können Funktionen planen, die Eingabedaten übernehmen. Den von dir geposteten Link schaue ich mir mal an

Der „Ethereum-Wecker“ ist nicht wirklich dazu gedacht, mehrmals zu feuern. Es ist für einen Job gedacht - 1 Anruf.

Sie können jedoch mehrere Ausführungen automatisch "rekursiv" verknüpfen, indem Sie den "Uhrenvertrag" eine Methode in einem Ihrer Verträge ausführen lassen, die "den Job erledigt, den Sie brauchen", dann "die Uhr abfragt und einen anderen Job in die Warteschlange stellt", bis ihr " Gas".

Aber ehrlich gesagt ist das nicht wirklich die beste Lösung dafür.

Sie könnten es zum Beispiel viel einfacher (und weniger teuer) machen, indem Sie "Jobs für ein paar Tage / Monate im Voraus anstehen, wenn der Benzinpreis niedrig ist".

Es gibt einen weiteren Trick, den Sie verwenden können, nämlich „Gas im Voraus speichern, das Sie später für einen Rabatt verwenden können“, siehe https://gastoken.io/ für Details.

Aber das Einfachste und Billigste, was Sie tun können, ist, einen Daemon / Cron zu haben, der den aktuellen Benzinpreis abfragt, eine Transaktion erstellt und das ausführt, was Sie brauchen, wenn Sie es brauchen. (Fügen Sie Gastoken in die Mischung für günstigere Tageskosten ein)