合約如何在以後自行執行?
在我的區塊鏈應用程序中,我希望在應用程序最近收到使用者的交易後的某個時間、幾小時甚至幾天后觸發一個事件。如何創建一個在經過一定時間後觸發的“事件”?
懶惰與急切的執行
有兩種設計合約以供稍後呼叫的基本方法:惰性評估或急切評估。
惰性評估意味著合約的狀態只會在需要時更新。這對於自然激勵使用者在未來日期致電他們的契約通常是有意義的。
這方面的一個例子可能是信託基金契約,該契約將一直鎖定到某人 18 歲生日。這個人當時會被激勵去執行這些資金的分散。
一個更複雜的例子是計息契約。假設我存入 1 ETH,每個月我都會得到 1% 的利息,複利。
有兩種方法可以解決這個問題:
- 懶惰的方式:當我想提款時,我呼叫合約,它會根據利率、我最後一次知道的餘額和經過的時間來計算我的餘額。
- 急切的方法:我使用乙太坊鬧鐘或一些類似的服務來呼叫
claimInterest()
合約的功能,它計算當月的利息並藉記我的餘額。在這種情況下,惰性求值是有意義的,因為很容易根據過去的狀態和經過的時間計算目前狀態。
當狀態轉換是急切的評估 是有用的
- 計算成本高
- 處理大型儲存集、對大型列表進行排序等。
- 非確定性
- 依賴外部輸入,例如呼叫Oraclize.it
- 缺乏激勵
- 數據對賬,各種非貨幣合約。
- 依賴另一份契約
- 如果合約需要接受來自另一個合約的輸入或向另一個合約發送交易
使用乙太坊鬧鐘進行呼叫調度
乙太坊鬧鐘服務支持安排合約在未來指定區塊被呼叫。底層機製本質上是上述基於激勵的解決方案的抽象,它允許任意基於私鑰的賬戶有激勵來執行任意合約的呼叫。
該協議已經過審核並部署在主網上。它現在功能齊全。
可以使用以下程式碼完成呼叫調度:
const { EAC, Util } = require('@ethereum-alarm-clock/lib'); const moment = require('moment'); const web3 = Util.getWeb3FromProviderUrl('ws://localhost:8545'); const eac = new EAC(web3); async function scheduleTransaction() { const receipt = await eac.schedule({ toAddress: '0xe87529A6123a74320e13A6Dabf3606630683C029', windowStart: moment().add('1', 'day').unix() // 1 day from now }); console.log(receipt); } scheduleTransaction();
上面的範例使用@ethereum-alarm-clock/lib。這是使用乙太坊鬧鐘協議的最小庫。
安排呼叫的一部分是提供足夠的乙太幣來支付未來執行呼叫的 gas 費用,以及支付給呼叫執行者的付款和協議創建者的費用(如果指定)。
安排此呼叫時,將部署一個新合約來管理呼叫執行的所有細節。
執行
警報服務需要一個基於私鑰的乙太坊帳戶才能在指定時間執行呼叫。這種行為是由與每個預定呼叫相關聯的支付價值推動的。當目標塊發生時,呼叫的執行者將全額報銷他們的 gas 費用,並從他們的服務的指定支付金額中支付。
可以使用TimeNode來完成監視警報服務以獲取即將到來的呼叫並執行它們的過程。任何人都可以成為 TimeNode,這裡是如何成為 TimeNode 的綜合教程和影片:如何執行 TimeNode。
預定呼叫的可配置選項
toAddress
- 收件人地址callData
- 交易數據callGas
- 未來交易執行的 Gas 限制callValue
- Wei的未來交易價值windowSize
- 執行時間視窗的大小,以塊或秒為單位windowStart
- 執行視窗應打開時的塊號/UNIX 時間戳gasPrice
- 執行的未來 gas 價格fee
- 支付給乙太坊鬧鍾維護者使用調度的費用(以 Wei 為單位)bounty
- 為交易執行者付款requiredDeposit
- 執行者存款,當它試圖執行預定的交易時費用
警報服務嘗試為呼叫調度創建公開市場。調度程序可以為Bounty和Fee值指定任意數量,並且那些執行呼叫可以自由選擇他們願意執行的呼叫。
在安排時間時,必須提供足夠的乙太幣來支付 gas 成本以及相關的付款和費用。執行後,任何剩餘的乙太幣都會自動返回給呼叫的調度程序。
測試
警報服務可用於在 Kovan 和 Ropsten 等測試網路上進行測試。有執行在這些網路上的事務的時間節點。
保證
警報服務是一個呼叫安排市場,不能保證安排的呼叫將被執行。為了使服務執行,它需要人們啟動執行預定呼叫的事務。
保護
作為函式呼叫的調度程序,您可以依賴以下內容:
- 您的合約將使用其配置的確切呼叫數據進行呼叫。
- 在目標區塊和寬限期指定的區塊數之間的區塊視窗之前或之後,您的合約將不會被呼叫。
不信任
報警服務不授予任何一方任何特殊權限,並且是 100% 開源的。
文件和其他連結
- 有關服務各個方面的完整文件可在此處獲得: http: //docs.ethereum-alarm-clock.com/en/latest/
- 發布服務更新的部落格:https ://blog.chronologic.network/
- 主要網站,包含有關目前部署的服務的資訊以及有關如何驗證原始碼的說明:https ://www.ethereum-alarm-clock.com/
- 說明如何使用 MyCrypto 界面進行調度:https ://blog.chronologic.network/how-to-schedule-transactions-on-mycrypto-com-f9c631dfa8dc