iT邦幫忙

2022 iThome 鐵人賽

DAY 5
1

Oracle

Synchronization Link Tree


Intro.

簡單來說 Blockchain Oracle 就是現實世界(Off-Chain Data)和鏈上世界(On-Chain Data)的數據橋梁。它能讓 Smart Contract 去存取現實世界的數據,例如:金融市場資訊和價格、Payments Data(Visa, PayPal)、天氣預報、IoT Sensors 數據,甚至是運動賽事的結果。當然也有其他需要正確無誤、不可被惡意竄改的素材,例如:隨機數。

在區塊鏈上的合約通常只能使用自己 Networks 中的 Data,無法直接與外界的 Data 連接(也無法確認這些資料是否正確無誤)。如果今天沒有 Oracle 存在,那可能會大大的限縮 Dapp 的發展性,甚至某些時候還會影響安全性。舉例來說有的合約會使用 block.timestamp 來做為時間依據或者隨機數種子,但這是有一定危險性的,因為 block.timestamp 並不是真正的 Unix Time,而是該區塊打包的時間,也有可能被惡意礦工影響。

Oracles

Centralised Oracles: Provable

Provable 是一個中心化的節點預言機,可以傳遞鏈下資料至鏈上供智能合約使用,是資料唯一負責的中心化個體,實際上可以在任何鏈上使用這個服務,只是使用者必須承擔一定的風險。優點是便宜和高吞吐量以及適用性廣,缺點是可能會有單點錯誤,有被攻擊的可能。

Decentralized Oracles: Chainlink

Chainlink 是一個去中心化的預言機,一樣是傳遞鏈下資訊至鏈上。有多個節點可以以安全的方式向區塊鏈提供資料,使用 Blockchain Oracle 並不是依賴單一的 Data 來源,而是同時索取多個 Oracles 來決定資料的正確性和準確度。由於裡面還有各種獎勵及處罰機制,讓 Chainlink 有一個更安全及更有效率的生態系。

我們在智能合約中最常使用的 Decentralized Oracle 就是 Chainlink,優點是難以動手腳、沒有單點錯誤、去中心化。缺點是比較貴,也需要支付 gas fee。

Link 代幣是 Chainklink 中的支付代幣,用於觸發資訊取得,屬於 ERC-677 代幣。

延伸閱讀

On-Chain Oracles: Augur

Augur 是一個能夠判斷事實與否的鏈上預測市場,由一連串的事件與投票組成,這類的預言機使用人們的共識基礎來當作資料來源。。優點是有賽局機制、鏈上不可竄改姓、容易參照。缺點是低吞吐量、昂貴、獨立於以太坊。

Referenceing On-Chain Contracts: Uniswap

Uniswap 同樣也有價格預言機的功能,可以直接反應以太坊之中代幣於 DEX 中的價格,其他智能合約可以透過 Uniswap 的價格預言機來 fetch 代幣價格。優點是易於使用、便宜、易於聚合,缺點是流動性可能會影響價格(包含惡意),且以太坊之外的系統無法使用這個預言機。

Implementation

上面簡單介紹了幾個預言機,接下來我們可以嘗試做看看怎麼使用預言機。最主要有兩種方法,一是使用套件,二是直接呼叫 API。

一、套件

Hardhat

  1. Chainlink Hardhat Starter Kit
  2. Chainlink Developers Starter Kit Showcase

Truffle

  1. Truffle Chainlink Box
  2. truffle unbox smartcontractkit/box
  3. Creates simple boilerplate code that can be used to build on top of

Chainlink npm package

  1. Directly use Chainlink npm package
  2. npm install @chainlink/contracts
  3. Allows easy integration into existing projects

二、API call

Example 1

我們可以在合約中引入 library 來取得 Chainlink 的服務:

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

當我們擁有 AggregatorV3Interface 時就可以直接 fetch 我們需要的資料,假設是 Kovan 測試網上的 ETH/USD 價格,其地址位在 0x9326BFA02ADD2366b30bacB125260Af641031331,就可以在合約中宣告一個物件:

priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);

並且 fetch 預言機的資料:

function getLatestPrice() public view returns (int) {
    (
        uint80 roundID, 
        int price,
        uint startedAt,
        uint timeStamp,
        uint80 answeredInRound
    ) = priceFeed.latestRoundData();
    return price;
}

明天我們可以使用預言機的功能來取得隨機數!


Closing

Reference


最後歡迎大家拍打餵食大學生0x2b83c71A59b926137D3E1f37EF20394d0495d72d


上一篇
Day 4 - Wrapped Token
下一篇
Day 6 - Random Numbers & Bitwise
系列文
Smart Contract Development Breakdown30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言