Contract-Design

合約如何在以後自行執行?

  • February 26, 2022

在我的區塊鏈應用程序中,我希望在應用程序最近收到使用者的交易後的某個時間、幾小時甚至幾天后觸發一個事件。如何創建一個在經過一定時間後觸發的“事件”?

懶惰與急切的執行

有兩種設計合約以供稍後呼叫的基本方法:惰性評估急切評估

惰性評估意味著合約的狀態只會在需要時更新。這對於自然激勵使用者在未來日期致電他們的契約通常是有意義的。

這方面的一個例子可能是信託基金契約,該契約將一直鎖定到某人 18 歲生日。這個人當時會被激勵去執行這些資金的分散。

一個更複雜的例子是計息契約。假設我存入 1 ETH,每個月我都會得到 1% 的利息,複利。

有兩種方法可以解決這個問題:

  1. 懶惰的方式:當我想提款時,我呼叫合約,它會根據利率、我最後一次知道的餘額和經過的時間來計算我的餘額。
  2. 急切的方法:我使用乙太坊鬧鐘或一些類似的服務來呼叫claimInterest()合約的功能,它計算當月的利息並藉記我的餘額。

在這種情況下,惰性求值是有意義的,因為很容易根據過去的狀態和經過的時間計算目前狀態。

當狀態轉換是急切的評估 是有用的

  1. 計算成本高
  • 處理大型儲存集、對大型列表進行排序等。
  1. 非確定性
  1. 缺乏激勵
  • 數據對賬,各種非貨幣合約。
  1. 依賴另一份契約
  • 如果合約需要接受來自另一個合約的輸入或向另一個合約發送交易

使用乙太坊鬧鐘進行呼叫調度

乙太坊鬧鐘服務支持安排合約在未來指定區塊被呼叫。底層機製本質上是上述基於激勵的解決方案的抽象,它允許任意基於私鑰的賬戶有激勵來執行任意合約的呼叫。

該協議已經過審核並部署在主網上。它現在功能齊全。

可以使用以下程式碼完成呼叫調度:

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- 執行者存款,當它試圖執行預定的交易時

費用

警報服務嘗試為呼叫調度創建公開市場。調度程序可以為BountyFee值指定任意數量,並且那些執行呼叫可以自由選擇他們願意執行的呼叫。

在安排時間時,必須提供足夠的乙太幣來支付 gas 成本以及相關的付款和費用。執行後,任何剩餘的乙太幣都會自動返回給呼叫的調度程序。

測試

警報服務可用於在 Kovan 和 Ropsten 等測試網路上進行測試。有執行在這些網路上的事務的時間節點。

保證

警報服務是一個呼叫安排市場,不能保證安排的呼叫將被執行。為了使服務執行,它需要人們啟動執行預定呼叫的事務。

保護

作為函式呼叫的調度程序,您可以依賴以下內容:

  • 您的合約將使用其配置的確切呼叫數據進行呼叫。
  • 在目標區塊和寬限期指定的區塊數之間的區塊視窗之前或之後,您的合約將不會被呼叫。

不信任

報警服務不授予任何一方任何特殊權限,並且是 100% 開源的。

文件和其他連結

引用自:https://ethereum.stackexchange.com/questions/42