ソフトウェアエンジニアがChainlinkを導入するメリットとサンプルコード
さて、今回は「smartcontractkit/chainlink」について、ソフトウェアエンジニアの視点から、どういうときに役に立つのか、どうやって使うのか、といったことを、キャンプのコントを演じているつもりで、分かりやすく解説していきますね。
ベテランキャンパー(私)
Chainlinkを使いこなす、頼れるエンジニア。
初心者キャンパー(あなた)
ブロックチェーンは知ってるけど、Chainlinkはよく知らないエンジニア。
ベテランキャンパー(私)
よう!今日のキャンプ、いい感じだな!
初心者キャンパー(あなた)
はい!でも、ちょっと聞きたいことがあって...。スマートコントラクトって、ブロックチェーンの外にある情報を使えないんですよね?例えば、今日の天気とか、株価とか...。
ベテランキャンパー(私)
お、いいところに気づいたな!そうなんだ。ブロックチェーンは閉鎖的な世界だから、外の情報は直接持ってこれない。まるで、このキャンプ場の中にいる俺たちが、外のスーパーの今日の特売情報を直接知ることができないのと同じだ。
初心者キャンパー(あなた)
えー、じゃあ、スマートコントラクトで「今日の天気予報が晴れだったら、キャンプ参加者にボーナスを配る」みたいなことはできないんですか?
ベテランキャンパー(私)
普通はできない。でも、それを可能にする「橋」があるんだ。それが、この「Chainlink」ってやつさ!
「smartcontractkit/chainlink」は、分散型オラクルネットワークのノードを動かすためのソフトウェアなんだ。
オラクルっていうのは、スマートコントラクトに外部の情報(オフチェーンデータ)を安全に提供する役割を持つ、いわば「情報伝達役」だ。
Chainlinkは、このオラクルを単一の信頼点(Single Point of Failure)にしないように、複数のオラクルが協力して情報を検証・提供する仕組みになっている。だから、誰かが不正な情報を送ろうとしても、他のノードがそれを検知して、正しい情報をブロックチェーンに届けられる。
例えるなら、このキャンプ場(ブロックチェーン)の「村長さん」(スマートコントラクト)に、外の天気予報(外部データ)を伝えるために、何人もの「メッセンジャー」(オラクルノード)を派遣するようなものだ。一人が嘘を言っても、他のメッセンジャーが「いや、本当は晴れだよ!」と教えてくれるから、村長さんは正しい情報を受け取れる、ってわけ。
この「橋」があることで、これまでブロックチェーン単体では実現できなかった、たくさんの面白いアプリケーションが作れるようになるんだ。
金融アプリケーション
デリバティブや先物取引
株価や仮想通貨の価格データをChainlink経由で取得して、契約を自動で実行できる。
分散型保険
飛行機の遅延情報や、作物の収穫量データを取得して、保険金を自動で支払うスマートコントラクトを作れる。
ゲーム
NFTゲーム
ゲーム内アイテムの価格を外部の市場価格と連動させたり、乱数を生成して希少なアイテムを公平にドロップさせたりできる。
サプライチェーン管理
商品の出荷状況や、温度・湿度データなどを取得して、契約条件が満たされたら自動で決済を行うスマートコントラクトを組める。
初心者キャンパー(あなた)
なるほど!じゃあ、さっきの「天気予報が晴れだったらボーナス」も、Chainlinkを使えば作れるんですね!すごい!
ベテランキャンパー(私)
そうだ!そして、この「smartcontractkit/chainlink」は、そのためのノードを立てるためのソフトウェアなんだ。Golangで書かれているから、Golangに慣れているエンジニアなら、わりと簡単に触れると思うぞ。
実際にChainlinkノードを立てて、データを提供してみるぞ。準備はいいか?
Golangの実行環境
Docker(コンテナ環境)
イーサリアムテストネットのノード(Goerliなど)に接続できる環境
ウォレット(MetaMaskなど)
Chainlinkのノードは、Dockerコンテナで動かすのが一般的で簡単だ。
まず、設定ファイル config.toml を用意する。
# config.toml
# イーサリアムテストネットのURLを設定
ETH_URL = "wss://goerli.infura.io/ws/v3/<あなたのInfura APIキー>"
# ウォレットの秘密鍵を設定
EVM_CHAIN_ID = 5 # GoerliテストネットのChain ID
EVM_CHAIN_ID_5_ETH_KEY_STORE_PASSWORD = "your_password"
# Chainlinkのウォレットパスワードファイル
KEY_STORE_PASSWORD = "your_password"
次に、Docker Composeファイル docker-compose.yml を作成する。
# docker-compose.yml
version: "3.7"
services:
chainlink:
image: smartcontractkit/chainlink:latest
container_name: chainlink_node
env_file:
- .env
volumes:
- ./chainlink:/chainlink
ports:
- "6688:6688"
command: chainlink node start -p /chainlink/.password -a /chainlink/.api
そして、以下のコマンドで起動!
# Dockerコンテナの起動
$ docker-compose up -d
これで、あなたのPCでChainlinkノードが動き始めた!まるで、キャンプの道具を組み立てるみたいだな!
次は、このChainlinkノードを使って、実際に外部のデータ(ここではBitcoinの価格)を取得するスマートコントラクトを書いてみよう。
このコントラクトは、ChainlinkのAggregatorV3Interfaceというインターフェースを使って、価格フィードにアクセスする。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract PriceConsumerV3 {
// Chainlinkの価格フィードコントラクトのアドレスを定義
// ここでは、GoerliテストネットのBTC/USDフィードアドレスを使用
// 実際のアドレスはChainlinkの公式ドキュメントで確認
AggregatorV3Interface internal priceFeed;
/**
* @dev コンストラクタで、Chainlinkの価格フィードコントラクトを初期化
*/
constructor() {
// GoerliテストネットのBTC/USD価格フィードのアドレスを指定
priceFeed = AggregatorV3Interface(0x6A6bE49c3A5a4A3C4A5A4A3C4A5A4A3C4A5A4A3C); // 仮のアドレスです!
}
/**
* @dev 最新の価格情報を取得する関数
*/
function getLatestPrice() public view returns (int256) {
// Chainlinkから最新の価格データを取得
(
/*uint80 roundID*/,
int256 price,
/*uint256 startedAt*/,
/*uint256 timeStamp*/,
/*uint80 answeredInRound*/
) = priceFeed.latestRoundData();
return price;
}
}
このコントラクトをデプロイすれば、ブロックチェーンの外にある最新のBitcoin価格を、スマートコントラクトから安全に取得できる!
初心者キャンパー(あなた)
わあ!これなら、これまでできなかったことが、どんどん作れそうですね!
ベテランキャンパー(私)
そうだろ?Chainlinkは、ブロックチェーンの世界を、もっと広くて、現実世界と繋がった場所に変えてくれるんだ。まるで、このキャンプ場にインターネットを引いたようなものさ!
何に役立つか
スマートコントラクトに外部(オフチェーン)の情報を安全に取り込むための「橋渡し」役。
導入方法
Dockerを使って、Chainlinkノードを簡単に立てられる。
サンプルコード
スマートコントラクトから、Chainlinkの価格フィードにアクセスして、最新の価格情報を取得できる。
ベテランキャンパー(私)
さあ、これで君もChainlink使いの仲間入りだ。一緒に、もっと面白いスマートコントラクトの世界を冒険しようじゃないか!
初心者キャンパー(あなた)
はい!ありがとうございます!キャンプ飯でも作りながら、もっと色々教えてください!