Chainlink節點部署教程
本文主要參考Chainlink官方文檔(https://docs.chain.link/docs/running-a-chainlink-node)編寫,如果您可以閱讀英文,推薦您直接閱讀官方文檔。
安裝必須組件
服務器環境Ubuntu1804,我們以Ropsten測試網為例,以太坊主網的搭建只需修改相關配置選項即可。
Docker 安裝參考文檔
https://docs.docker.com/engine/install/ubuntu/
將當前用戶添加至docker用戶組
sudo usermod -aG docker $USER
exit
# 重新登錄
PostgresSQL
Chainlink Node在0.8版本之後將PostgresSQL作為唯一的存儲選項。PostgresSQL數據庫可以是自己搭建的,也可以是雲服務商提供的,只要可以提供數據庫的訪問接口即可。
本地安裝參考:
https://www.postgresql.org/download/linux/ubuntu/
以太坊客戶端
Chainlink節點通過與以太坊客戶端節點連接,通過連接的以太坊客戶端來獲取鏈上的用戶預言機請求,通過提交交易將獲取到的數據寫入到鏈上。所以Chainlink節點必須要依靠一個以太坊客戶端節點才能發揮作用。您可以自己搭建以太坊客戶端節點,也可以選擇以太坊RPC服務提供方的服務,只需要一個WebSocket鏈接提供給Chainlink節點即可。
Chainlink的文檔中(https://docs.chain.link/docs/run-an-ethereum-client)提供了搭建本地以太坊客戶端節點的方法,也提供了幾個外部以太坊API服務供您選擇。由於以太坊客戶端節點對硬件要求比較高,本文中我們選擇infura提供的免費API來作為Chainlink節點的以太坊客戶端選擇。
部署Chainlink節點
創建Chainlink目錄
Ropsten: mkdir ~/.chainlink-ropsten
配置環境變量
Ropsten:
echo "ROOT=/chainlink
LOG_LEVEL=debug
ETH_CHAIN_ID=3
MIN_OUTGOING_CONFIRMATIONS=2
LINK_CONTRACT_ADDRESS=0x20fE562d797A42Dcb3399062AE9546cd06f63280
CHAINLINK_TLS_PORT=0
SECURE_COOKIES=false
GAS_UPDATER_ENABLED=true
ALLOW_ORIGINS=*
ETH_URL=wss://ropsten.infura.io/ws/v3/<your-api-key>
DATABASE_URL=postgresql://postgres:password@localhost:5432/postgres
DATABASE_TIMEOUT=0" > ~/.chainlink-ropsten/.env
MIN_OUTGOING_CONFIRMATIONS
: 節點發出交易所需要的最小確認塊數,在達到最小確認塊數之前,同一個run不會開始下一個任務。如果不設置,默認值為12。
LINK_CONTRACT_ADDRESS
: LINK token的發行地址,這裡有測試網和主網的LINK發行地址,您可以根據自己的網絡進行配置。如果不進行配置,默認是主網的LINK發行地址。
GAS_UPDATER_ENABLED
: 如果設置為true,節點會在提交事務失敗時提高gas費用重新提交。默認為false。
ETH_URL
: 以太坊客戶端WebSocket RPC接口地址。您可以選擇自建以太坊客戶端,也可以選擇第三方服務,只要提供WebSocket協議的RPC接口地址即可。
DATABASE_URL
: Chainlink節點需要使用PostgresSQL數據庫來進行一些數據的持久化存儲。同樣您可以選擇自建數據庫或使用第三方數據庫服務,只需要提供數據庫地址可以讓節點讀寫數據即可。
DATABASE_TIMEOUT
:數據庫連接超時等待時間。默認500ms。
啟動節點
cd ~/.chainlink-ropsten && docker run -p 6688:6688 -v ~/.chainlink-ropsten:/chainlink -it --env-file=.env smartcontract/chainlink local n
首次啟動會首先要求管理員輸入一個密碼,這個密碼是節點賬戶的keystore密碼,這個密碼必須牢記,丟失的話沒有辦法找回,並且私鑰所管理的資金也會丟失。每次啟動都會要求管理員輸入這個密碼,以解鎖keystore。節點需要通過keystore的私鑰來簽署交易,提交到區塊鏈上。
接下來還會要求節點管理員輸入一對郵箱賬戶和密碼,用於登錄節點管理頁面。
測試節點
登錄瀏覽器管理頁面
瀏覽器中打開ip:6688地址,就能看到Chainlink節點管理頁面的登錄入口。用我們在啟動節點時填入的郵箱賬戶和密碼,就可以登錄到管理界面中了。
我們先去到**Configuration
** 標籤頁,會發現有一個ACCOUNT_ADDRESS
字段,這個address就是我們在首次啟動節點時候設置keystore密碼的私鑰所對應的地址,在節點提供服務之前,需要向這個地址轉入ETH,用於提交交易。
由於我們使用的是Ropsten測試網絡,所以我們可以把這個地址複製到Ropsten faucet中,獲取測試ETH。如果您是服務於以太主網上的應用,需要您想這個賬戶地址手動轉入ETH。
創建oracle合約
Oracle合約是Chainlink節點在區塊鏈上的橋頭堡,它與用戶合約直接進行溝通,接收用戶的預言機請求,將請求結果通過用戶註冊的回調函數,寫入到用戶的合約中。
Oracle合約無需自己編寫,我們直接部署Chainlink開源的Oracle合約代碼即可。如果用remix部署,只需新建一個包含下面兩行代碼的文件即可:
pragma solidity 0.6.6;
import "https://github.com/smartcontractkit/chainlink/evm-contracts/src/v0.6/Oracle.sol";
需要注意的是,oracle合約會暫時接受用戶發起Chainlink請求是所支付的LINK費用,所以請務必妥善保存合約owner的私鑰。
部署好Oracle合約之後,需要將開放權限給節點的地址,允許節點可以提交事務。
創建Jobs
按照文檔中的例子,在節點中添加Job(作業)。
打開節點管理界面的Jobs標籤頁,點擊New Job添加新的Job,將每個類型的Job的JSON拷貝到文本框中,用剛剛部署好的Oracle合約地址,替換JSON中的YOUR_ORACLE_CONTRACT_ADDRESS
字段。每創建成功一個Job,都會生成一個Job ID,在Jobs標籤頁可以找到所有的Jobs。
測試節點可用性
接下來我們測試一下我們部署的Chainlink服務的可用性。
pragma solidity ^0.6.0;
import "https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/evm-contracts/src/v0.6/ChainlinkClient.sol";
contract APIConsumer is ChainlinkClient {
uint256 public ethereumPrice;
address private oracle;
bytes32 private jobId;
uint256 private fee;
constructor() public {
setPublicChainlinkToken();
// 填入我們剛剛部署好的oracle地址
oracle = 0x5F66a231a29CE1513dc6c16407fDCe9D0aEE2cB0;
// 填入我們剛剛創建的地址
jobId = "4b9b6e7d89154a8d855affed3985aafd";
// 支付給Oracle的最小費用,可用在Configuration頁面MINIMUM_CONTRACT_PAYMENT字段查看到
fee = 1 * 10 ** 18; // 1 LINK
}
function requestEthereumPrice() public returns (bytes32 requestId)
{
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
// 設置所要請求的API地址
request.add("get", "https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD");
// API返回結果的解析路徑
request.add("path", "USD");
// 為去除小數點將結果乘以的倍數
request.addInt("times", 100);
// 發送請求
return sendChainlinkRequestTo(oracle, request, fee);
}
function fulfill(bytes32 _requestId, uint256 _price) public recordChainlinkFulfillment(_requestId)
{
ethereumPrice = _price;
}
}
部署好用戶合約之後,向用戶合約轉入LINK,調用requestEthereumPrice
方法,就可以測試我們的Chainlink預言機節點是否可以正常工作啦。