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.
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
, gracePeriod
zeigt das an, dass Sie damit einverstanden sind, dass Ihr Aufruf in einem beliebigen Block zwischen x
und ausgeführt wird x + gracePeriod
. Danach x + gracePeriod
gilt 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.
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)
Daniel Kmak