Contract-Development
我可以使用乙太坊鬧鐘調度程序進行遞歸呼叫嗎?
此處給出的答案並未提供完整的解決方案。
如果使用乙太坊鬧鐘每 24 小時在我的智能合約中執行一種方法實際上可行,有人可以建議我嗎?您可以參考上面連結的文章中給出的範例。
根據此文件,在 255 塊時間後無法再次執行相同的呼叫(請參閱gracePeriod參數)
請驗證我的理解是否正確。
您可以使用乙太坊鬧鐘執行重複呼叫。您提供的
gracePeriod
連結中描述的內容表明您將允許執行程序延遲多少塊(最大)。也就是說,假設您希望在 block 中執行某些內容x
,這gracePeriod
表明您可以在x
and之間的任何塊中執行呼叫x + gracePeriod
。Afterx + gracePeriod
被認為是遲到了,呼叫將不會被執行。所以它會起作用。
另一方面,您有 EAC 的替代品,它們的 gas 成本更低(乙太交易在 EAC 中約為 500K gas,現在由 Chronologic 重建)以及 Aion 的固定費用。Aion 調度系統每次通話的費用約為 10 美分,第一次通話費用約為 250Kgas,之後,通話費用低至 70K(比 EAC 少 5 倍)。這是因為系統會為使用者創建帳戶。您可以在 ropsten 上進行測試。
這段程式碼展示瞭如何使用Aion Scheduling系統設置一個循環呼叫(每天) :
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 {} }
您可以在此處和此處找到更多詳細資訊
希望這可以幫助。