Contract-Invocation

您可以通過 cron 作業呼叫合約函式嗎?

  • February 11, 2021

我正在嘗試自動呼叫合約函式。每天,我都想在我的合約中呼叫一個函式,讓我的 DApp 的使用者可以使用數據。我想自動化這個,這樣我就不必手動呼叫我自己的函式。是否可以在具有 cron 作業的網路伺服器上自動執行此過程?如果沒有,是否有更好的方法來做到這一點(最好不必執行 vps)

是的,您可以自動執行此操作。有許多不同的方法。出於範例的目的,我將假設您需要發出與您的契約互動的交易。

您正在嘗試建構的系統有幾個關鍵部分。每個部分都有很多選擇,這意味著建構選項的組合爆炸。如果您指定更多關於以下內容的資訊會有所幫助:

  • 節點:您是否已經在執行乙太坊節點,例如 geth 或 parity?
  • Web3 連接器:從 javascript、java、C#、ruby、python等中選擇…
  • Core Logic:您更喜歡哪種連接器語言?
  • 調度器:你已經選擇了 cron,太好了

在我們得到這些答案之前,我將舉例說明我的首選選項:

  • 節點:geth有一個資金充足的未鎖定賬戶。*
  • Web3 連接器:web3.py,通過 IPC 連接(預設)。
  • 核心邏輯:載入數據並發出交易的python腳本
  • 調度器:cron

*有資金的、未鎖定的帳戶意味著您電腦上執行的任何程序都可以耗盡您的帳戶。您可以通過將餘額保持在足夠低的水平來最小化風險,以免被盜時您不會錯過它。您只需要支付汽油費即可。

您可以自動執行此任務,正如 carver 所說,堆棧將很重要,因為它將定義您使用的調度程序/cron 作業包。

我做過類似的事情,將分享我的堆棧和方法:我使用了 geth 客戶端、Nodejs、Web3js、forevercron

  • 永遠:一個簡單的 CLI 工具,用於確保給定腳本連續執行(即永遠)。
  • NPM cron 包(上面提到過)非常好,我非常喜歡它,因為它提供了很多自定義選項。

以下方法可以幫助您獲取函式十六進制並傳遞參數以呼叫函式:

使用有助於做同樣事情的 web3.js 庫。只需使用 NPM(或其他任何地方)下載 web3.js 並獲取任務所需的模組,方法是:

const_ = require('lodash');
const SolidityFunction = require('web3/lib/web3/function');

您可以使用 web3.js 庫和 ABI 來查找函式定義,使用以下程式碼:

var ABI = JSON.parse(<your_ABI>);
var functionDef = new SolidityFunction('', _.find(ABI, { name: '<your_function_name>' }), '');

在此之後,您可以呼叫 toPayload 方法,該方法將幫助您將要傳遞給函式的值轉換為 HEX 數據。

var payloadData = functionDef.toPayload([<value_for_var_1>, <value_for_var_2>, <value_for_var_3>, <value_for_var_4>]).data;

payloadData可用作 DATA 屬性的值。

例子:

var rawTx = {
to: <to_address>,
data: payloadData,
value: '0x0',
from: <from_address>,
nonce: nonce,
gasLimit: gasLimit,
gasPrice: gasPrice
}

您有一個原始交易對象,您可以使用它ethereumjs-tx來簽署您的交易並使用它web3.sendRawTransaction來呼叫您的合約函式。

希望這可以幫助。

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