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.
Puede ejecutar llamadas recurrentes usando el despertador Ethereum. Lo gracePeriod
que 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
, gracePeriod
indica que está de acuerdo con que su llamada se ejecute en cualquier bloque entre x
y x + gracePeriod
. Después x + gracePeriod
se 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.
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)
Daniel Kmak