您可以通過 cron 作業呼叫合約函式嗎?
我正在嘗試自動呼叫合約函式。每天,我都想在我的合約中呼叫一個函式,讓我的 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、forever和cron。
- 永遠:一個簡單的 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
來呼叫您的合約函式。希望這可以幫助。