Chainlink外部介面卡的開發和應用

買賣虛擬貨幣
背景在以太坊原生語言solidity中呼叫API可以將鏈下資料傳輸至鏈上智慧合約應用。世界各地的開發者可以利用Chainlink的去中心化區塊鏈預言機將鏈下真實世界的資料和事件接入區塊鏈環境。Chainlink內建的核心介面卡可以輕鬆配置並驗證來自任何開放API的資料。然而,Chainlink核心介面卡往往在靈活性和功能性上無法滿足開發者所有的需求,比如· API介面認證(保護API秘鑰隱私)· 保障隱私,降低延遲,並實現高吞吐量的鏈下計算,以降低gas費用· 將資料傳輸至其他區塊鏈(互操作性)
· 其他核心介面卡無法滿足的功能外部介面卡可以訪問優質資料並使智慧合約能夠非常靈活地連線至付費web API。目前眾多安全可靠的預言機網路都已接入外部介面卡,其中包括超過35個價格參考資料,總共保障了30多億美元的DeFi資產。本文將探討以下問題:· 什麼是外部介面卡?· 如何開發外部介面卡?· 如何執行外部介面卡?· 如何使用外部介面卡?
什麼是外部介面卡?介面卡通常分成兩類:· 核心介面卡· 外部介面卡核心介面卡是Chainlink核心節點客戶端內建的功能。Httpget、Copy和Jsonparse都屬於核心介面卡。而外部介面卡則是指開發者根據具體要求基於Chainlink預言機網路定製化的功能。本文不會深入探討接入其他區塊鏈的技術細節,但是Chainlink外部介面卡和外部啟動器實現定製化,將使Chainlink能夠與任何區塊鏈相容,因此能極大豐富其功能,這是Chainlink兩大關鍵價值的其中一個。這裡順便提一句,如果想要智慧合約在端到端保持去中心化,就必須允許其他預言機節點也執行外部介面卡。可以把外部介面卡想象成Chainlink節點的開源軟體包。也就是說,你可以選擇不親自執行節點,但同時也能夠在智慧合約中使用節點的定製化功能。你可以讓其他節點幫你執行外部介面卡,現在有許多專案整合了Chainlink但不親自執行節點。這樣,智慧合約開發者就可以專注於去中心化應用的商業邏輯,並將節點執行工作交給專業的節點運營商處理。你可以在market.link等第三方節點分類資訊平臺上掛出你的外部介面卡,也可以委託節點運營商執行你的外部介面卡,你只需要負責測試和開發工作。
當然,如果你想要自己執行節點,也完全可以這麼做!如何開發外部介面卡快速啟動開發外部介面卡最簡單的方式就是把它做成一個API介面。這樣一來,就可以靈活定製鏈下計算方式,使用任何程式語言,並且呼叫API傳輸並接收資料。關於如何開發API介面有許多教學資料,接下來我們將在nodejs中看一個簡單的Chainlink介面卡模板。另外還有python版本的示例 ,如果你感興趣也可以檢視。我們會基於下面這個程式碼庫進行開發,這是一個功能完整的外部介面卡,你可以輕鬆定製所需的資料。你也可以從零開始開發,不過用這個程式碼庫開發會簡單很多。接下來,你需要使用yarn和nodejs。首先,將程式碼庫克隆到本地,使用cd命令進入到專案中。git clone https://github.com/thodges-gh/CL-EA-NodeJS-Template.git ExternalAdapterTemplate
cd ExternalAdapterTemplate然後,安裝依賴並啟動API伺服器。yarnyarn startAPI/外部介面卡的伺服器會被啟動,並等待被呼叫。admin@chaindaily:[~/code/ExternalAdapterTemplate -  (master)] $ yarn start
yarn run v1.22.4$ node app.jsListening on port 8080!要注意,Chainlink節點會掃描所有介面卡,一旦發現了在它介面卡/任務清單中的外部介面卡,就會進行呼叫。我們可以自己呼叫一次,模擬Chainlink節點請求的過程。這是一個curl命令,向我們剛開始執行的API伺服器傳送HTTP post請求。你可以在本地終端視窗嘗試一下。curl -X POST -H "content-type:application/json" "http://localhost:8080/" --data '{ "id":0, "data":{ "from":"ETH", "to":"USD" } }'
http://localhost:8080/是API伺服器等待響應的地址,--data後面的引數是我們為了讓Chainlink節點看懂資料請求而傳送的引數。Chainlink節點傳送的json請求包括:一個id一個data object格式如下: {"id":"0", "data":{}}在data object中,可以清楚地看到from和to引數。這些是我們設定的定製化引數,讓外部介面卡能夠獲得各種不同的價格資料。可以看到,當執行curl指令碼時,會返回以下結果:{"jobRunID":0,"data":{"USD":441.49,"result":441.49},"result":441.49,"statusCode":200}
注:由於以太幣價格一直在變動,因此這裡的數字可能會發生變化!所有外部介面卡都會返回一個json物件,其中至少包含:jobRunIDdata object最好還能包含status和result欄位,這樣可以輕鬆處理並改正錯誤。在這個示例中,返回的結果是441.49,即當前以太幣價格。我們之所以會獲得這個資料,是因為我們的外部介面卡也呼叫了一個API,那就是:https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD
這個外部介面卡實際上裡面包裹著一個API介面,這也是外部介面卡的常見框架。以上就是外部介面卡的功能,那麼我們接下來看一下它的執行原理。獲取天氣資料在PatrickAlphaC模板程式碼庫中的weather-api分支中可以檢視。我們先來修改一下程式碼,以便從一個新的API介面(OpenWeatherMap)獲取天氣資料。為了方便教學,我們先在這裡免費註冊,獲得一個免費的API秘鑰。賬號透過驗證後,我們就可以在這裡看到API秘鑰,以及城市當前天氣資料API文件。注:你註冊後大概需要等待十分鐘秘鑰才會完全生效。我們現在要把這個外部介面卡稍作修改,本來它獲取的是以太幣價格,現在要改為獲取城市天氣資料。
我們要修改index.js檔案(如果要上線則需修改test/index_test.js測試檔案)。app.js定義了外部介面卡/API伺服器響應請求的方式,我們現在先不用管。在之前示例裡的data object中,我們使用了兩個引數,即from和to引數。我們可以透過更新customParams來定製化引數:更新前的customParams:const customParams = {base:['base', 'from', 'coin'],quote:['quote', 'to', 'market'],endpoint: false
}更新後的customParams:const customParams = {city:['q', 'city', 'town'],endpoint: false}
這樣,我們無論輸入city、town還是q ,都表示city。createReqeust常量是最關鍵的一個環節,因為這裡需要連線到URL。如果檢視天氣資料文件,可以看到這樣的一個示例地址:https://api.openweathermap.org/data/2.5/weather?q=&appid=可以輸入API秘鑰和城市名boston,對API進行測試,然後將URL複製到瀏覽器(如果返回錯誤說API秘鑰無效,可以等幾分鐘再試一次)用這個URL就可以知道需要做哪些更新:更改前:
const endpoint = validator.validated.data.endpoint || 'price'更改後:const endpoint = validator.validated.data.endpoint || 'weather'更改前:const url = 'https://min-api.cryptocompare.com/data/${endpoint}'更改後:
const url = 'https://api.openweathermap.org/data/2.5/${endpoint}'現在我們要新增引數。我們的兩個引數是城市(文件裡的城市是q)和API秘鑰(`appid`)城市可以在原來的程式碼上進行修改:const fsym = validator.validated.data.base.toUpperCase()改成:const q = validator.validated.data.city.toUpperCase()
然而,我們不能將API秘鑰寫死在程式碼中。API認證我們應該編輯這行程式碼:const tsyms = validator.validated.data.quote.toUpperCase()將它改成:const appid = process.env.API_KEY;
要將API秘鑰放到.envrc檔案中,而不是放到原始碼中,因此要新建這樣一個.envrc檔案:export API_KEY=<YOUR_KEY-HERE>別忘了要新增到.gitignore中!如果你在執行curl命令測試時遇到任何問題,也可以在終端執行 export API_KEY=<API_KEY>注:點選這裡瞭解關更多環境變數然後需要將引數從:const params = {
fsym,tsyms}改成:const params = {q,
appid}將結果從:response.data.result = Requester.validateResultNumber(response.data, [tsyms])改成:response.data.result = Requester.validateResultNumber(response.data, ['main','temp'])
然後就搞定了!現在,main object的temp值就等於天氣API輸出的氣溫了,因此我們的response.data.result引數如上所示。現在你已經成功開發出了API秘鑰認證的外部介面卡!我們來呼叫一下API。curl -X POST -H "content-type:application/json" "http://localhost:8080/" --data '{ "id": 0, "data": { "city":"Boston"} }示例返回值:{"jobRunID":0,"data":{"coord":{"lon":-71.06,"lat":42.36},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04d"}],"base":"stations","main":{"temp":296.81,"feels_like":298.49,"temp_min":295.15,"temp_max":297.59,"pressure":1008,"humidity":78},"visibility":10000,"wind":{"speed":2.6,"deg":360},"clouds":{"all":90},"dt":1599162213,"sys":{"type":1,"id":3486,"country":"US","sunrise":1599127933,"sunset":1599174905},"timezone":-14400,"id":4930956,"name":"Boston","cod":200,"result":296.81},"result":296.81,"statusCode":200}
很好!現在就能完美執行了!我們建立了關鍵內容,讓Chainlink節點能夠理解資料請求。你可以清楚地看到在鏈下展開運算的好處,智慧合約可以將大量計算工作放到鏈下執行,然後再將計算結果返回至鏈上。現在已經做出了外部介面卡,接下來的問題就是如何讓Chainlink節點執行外部介面卡?如何呼叫外部介面卡?我們這裡先暫時跳過親自執行外部介面卡的部分,因為實際上我們不需要親自執行。在index.js的底部有一些wrapper,可以讓節點運營商採用無伺服器的方式部署程式碼。所以我們可以這麼做:1. 將介面卡新增至第三方節點分類資訊平臺,比如market.link2. 讓節點運營商執行我們的介面卡(#ask-a-node-operator discord)3. 親自執行節點(不必要)你可以發現,你甚至都不用親自執行節點就可以使用自己的外部介面卡。這是最理想的情況,因為我們希望自己的介面卡可以被其他預言機節點使用,這樣就可以有許多節點訪問資料,並使Chainlink網路保持極高的去中心化水平。
我們將在之後的影片或部落格文章中詳細探討如何執行外部介面卡。如果你已經開發出了新的介面卡,可以先暫時讓節點幫你執行,並加入我們的社羣!使用外部介面卡

假設現在有一個節點幫你執行外部介面卡,那麼你就可以透過這個節點將資料傳輸至你的智慧合約。在這個示例中,我們開發出了一個叫做Alpha Vantage的外部介面卡。Alpha Vantage是一個股票和加密貨幣價格資料API,需要API秘鑰才能訪問。我們來看看如何透過Linkpool kovan節點執行的外部介面卡獲取特斯拉股票價格資料。首先要找到這個外部介面卡,我們需要在外部介面卡的網頁中尋找。將頁面一直往下拉,直到找到我們想要的Alpha Vantage外部介面卡。

圖中描述了外部介面卡的所有功能。我們可以點選“supported nodes”按鈕,檢視可以執行這個介面卡的節點。我們發現有一個節點可以支援它,然後可以在任務頁面檢視這個節點的具體資訊。你可以看到Alpha Vantage介面卡在這個節點的介面卡清單中。

接下來就是如何使用介面卡。我們先像往常一樣將job ID和預言機ID新增至程式碼中。然後新增Alpha Vantage文件中的所有引數。

bytes32 jobId =  “802ec94e00184b789a016b8e71ae9fb4”;
address oracle =  0x56dd6586DB0D08c6Ce7B2f2805af28616E082455;
   function requestTSLAPrice() public {
       Chainlink.Request memory req = buildChainlinkRequest(jobId, address(this), this.fulfillEthereumPrice.selector);
       req.add("function", "GLOBAL_QUOTE");
       req.add("symbol", "TSLA");
       string[] memory copyPath = new string[](2);
       copyPath[0] = "Global Quote";
       copyPath[1] = "05. price";
       req.addStringArray("copyPath", copyPath);
       req.addInt("times", 100000000);
       sendChainlinkRequestTo(oracle, req, fee);
}

以上是完整版程式碼,你可以嘗試使用。你也可以使用任何API的文件進行嘗試,因為現在你應該已經發現其實套路都是一樣的!

總結

正如你所看到的,外部介面卡是非常強大的工具,開發者可以用來豐富智慧合約的功能並提升其連通性。另外,還可以使用API認證和鏈下計算等layer2解決方案來提升外部介面卡的靈活性。如果這篇文章對你有任何啟發,歡迎參加Chainlink駭客松,嘗試應用你新學到的技能!這次駭客松的獎金超過4萬美元,希望大家能踴躍參加!

如果當你讀到這篇文章時駭客松已經結束了,那麼也歡迎加入我們在Twitter、Discord或Reddit上的社羣,轉發並加上#chainlink和#ChainlinkEA標籤,瞭解Chainlink最新活動訊息,並嘗試應用你的技能!

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;