開發與維運

Chainlink節點部署教程

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合約之後,需要將開放權限給節點的地址,允許節點可以提交事務。

Untitled.png

創建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預言機節點是否可以正常工作啦。

加入Chainlink開發者社區

image.png

Leave a Reply

Your email address will not be published. Required fields are marked *