¿Puedo hacer llamadas recursivas usando Ethereum Alarm Clock Scheduler? [duplicar]

La respuesta dada aquí no proporciona una solución completa.

¿Puede alguien sugerirme si es prácticamente factible ejecutar un método en mi contrato inteligente cada 24 horas usando Ethereum Alarm Clock? Puede consultar el ejemplo dado en la publicación vinculada anteriormente.

De acuerdo con este documento, no es posible volver a ejecutar la misma llamada después de 255 bloques de tiempo (consulte el parámetro gracePeriod )

Por favor verifique si mi comprensión es correcta.

Respondí esta pregunta aquí: ethereum.stackexchange.com/questions/11199/… Eche un vistazo. Hay una respuesta detallada allí con un ejemplo de código.

Respuestas (2)

Puede ejecutar llamadas recurrentes usando el despertador Ethereum. Lo gracePeriodque se describe en los enlaces que proporcionas indica cuántos bloques permitirás que se retrase el ejecutor (máximo). Es decir, suponga que desea que algo se ejecute en el bloque x, gracePeriodindica que está de acuerdo con que su llamada se ejecute en cualquier bloque entre xy x + gracePeriod. Después x + gracePeriodse considera tarde y la llamada no se ejecutará.

Entonces funcionará.

Por otro lado, tiene alternativas a EAC, que son menos costosas en gas (una transacción de ether es de aproximadamente 500K de gas en EAC, que ahora está reconstruida por Chronologic) y también Aion tiene tarifas fijas. El sistema de programación de Aion tiene tarifas de alrededor de 10 centavos de dólar por llamada, la primera llamada que haces cuesta alrededor de 250Kgas y después de eso, el costo de una llamada baja a 70K (5 veces menos que EAC). Esto se debe a que el sistema crea cuentas para los usuarios. Puedes probarlo en ropsten.

Este código muestra cómo configurar una llamada recurrente (todos los días) utilizando el sistema de programación de Aion :

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 {}

}

Puedes encontrar más detalles aquí y aquí

Espero que esto ayude.

Cuando intenté implementar este contrato en Ropsten Network, ¡falló! Obtuve "Falló el límite de estimación de gas" en el momento de la implementación.
@Gagan, arreglé el código. Faltaba la palabra pagable en el constructor y este código requiere que envíe ether al implementar, ya que programa inmediatamente la próxima llamada. Puede enviar tan solo 0,01 éter al implementar y esto mantendrá este contrato en ejecución durante mucho tiempo. Avísame si tienes otros problemas. Implementé este contrato en ropsten y se está ejecutando, por lo que no debería encontrar ningún otro problema. Hágamelo saber.
¡Gracias! Pude implementar el contrato con éxito. Creé una variable global de tipo uint256 y la incrementé cada vez que se llama a myfunction(). No puedo ver nuevas transacciones ni la variable establecida en un valor incrementado. No estoy seguro si mi llamada programada es cada llamada. ¿Puedes por favor ayudarme a averiguar qué está pasando?
Además, ¿qué hace el parámetro constructor "número" en este código?
Sería genial si echas un vistazo a esta publicación aquí .
El número de parámetro está ahí solo como un ejemplo para mostrar que puede pasar cualquier parámetro a su función con la programación, esto significa que puede programar funciones que toman datos de entrada. le echare un vistazo al enlace que pusiste

El "reloj de alarma Ethereum" no está realmente destinado a dispararse varias veces. Está destinado a un trabajo: 1 llamada.

Sin embargo, puede vincular "recursivamente" múltiples ejecuciones automáticamente, haciendo que el "contrato de reloj" ejecute un método en uno de sus contratos que "hace el trabajo que necesita" y luego "consulta el reloj y pone en cola otro trabajo" hasta que se agote " gas".

Pero, sinceramente, esa no es realmente la mejor solución para ello.

Por ejemplo, podría hacerlo mucho más simple (y menos costoso), "poniendo en cola los trabajos, con unos días/meses de anticipación, cuando el precio de la gasolina es bajo".

Hay otro truco que puede usar, que es "almacenar gasolina por adelantado, que luego puede usar para obtener un descuento". Consulte https://gastoken.io/ para obtener más detalles.

Pero lo más simple y económico que puede hacer es tener un demonio / cron que consulte el precio actual del gas, cree una transacción y ejecute lo que necesita cuando lo necesita. (agregue gastoken en la mezcla para obtener un costo diario más barato)