簡單來說 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,而是該區塊打包的時間,也有可能被惡意礦工影響。
Provable 是一個中心化的節點預言機,可以傳遞鏈下資料至鏈上供智能合約使用,是資料唯一負責的中心化個體,實際上可以在任何鏈上使用這個服務,只是使用者必須承擔一定的風險。優點是便宜和高吞吐量以及適用性廣,缺點是可能會有單點錯誤,有被攻擊的可能。
Chainlink 是一個去中心化的預言機,一樣是傳遞鏈下資訊至鏈上。有多個節點可以以安全的方式向區塊鏈提供資料,使用 Blockchain Oracle 並不是依賴單一的 Data 來源,而是同時索取多個 Oracles 來決定資料的正確性和準確度。由於裡面還有各種獎勵及處罰機制,讓 Chainlink 有一個更安全及更有效率的生態系。
我們在智能合約中最常使用的 Decentralized Oracle 就是 Chainlink,優點是難以動手腳、沒有單點錯誤、去中心化。缺點是比較貴,也需要支付 gas fee。
Link 代幣是 Chainklink 中的支付代幣,用於觸發資訊取得,屬於 ERC-677 代幣。
Augur 是一個能夠判斷事實與否的鏈上預測市場,由一連串的事件與投票組成,這類的預言機使用人們的共識基礎來當作資料來源。。優點是有賽局機制、鏈上不可竄改姓、容易參照。缺點是低吞吐量、昂貴、獨立於以太坊。
Uniswap 同樣也有價格預言機的功能,可以直接反應以太坊之中代幣於 DEX 中的價格,其他智能合約可以透過 Uniswap 的價格預言機來 fetch 代幣價格。優點是易於使用、便宜、易於聚合,缺點是流動性可能會影響價格(包含惡意),且以太坊之外的系統無法使用這個預言機。
上面簡單介紹了幾個預言機,接下來我們可以嘗試做看看怎麼使用預言機。最主要有兩種方法,一是使用套件,二是直接呼叫 API。
Hardhat
Truffle
Chainlink npm package
我們可以在合約中引入 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;
}
明天我們可以使用預言機的功能來取得隨機數!
最後歡迎大家拍打餵食大學生
0x2b83c71A59b926137D3E1f37EF20394d0495d72d