クラウド同上

【blockchain】分散型Oracle(Chainlink)を GKE x CloudSQL で構築してみる【GCP】

Author
Toru
Lv:25 Exp:96596

クラウドエースの IoT 大好きなテニスプレイヤー

はじめに

Google Cloud Platform Advent Calendar 2019 on 13th Dec の記事です。
Ethereum Advent Calendar 2019 on 13th Dec の記事です。

今、日本では Bitcoin(BTC) / Ethereum(ETH)などの暗号資産(暗号通貨 / 仮想通貨)に興味を持っている方は非常に多く、blockchain を活用したサービスを提供するスタートアップ企業が日本に続々と誕生しています。

私が Bitcoin を知ったのは2012年頃で、本格的な研究を始めたのは2015年11月からです。NEM(XEM)/ MonaCoin(MONA)/ IOTA(MIOTA) など多くの暗号通貨プロジェクトに参加しました。

本記事では blockchain を活用するために必要不可欠な Oracle を開発および提供している Chainlink のノード(Node)を GCP のサービスで構築する方法を紹介します。具体的には GKECloudSQL(PostgreSQL)を活用します。

さて、本記事を読むにあたって以下について簡単に説明します。これを理解すると興味が湧いてくると思います。その後に GKE と CloudSQL を用いて Chainlink のノード(Node)を構築する方法を説明します。

  1. Chainlink って何?
  2. Oracle は RDBMS のオラクルと違うの?
  3. Chainlink と Google(GCP)について

Chainlink って何?

サンフランシスコに拠点がある SmartContract.com 社のプロジェクトで、彼らが開発している分散型 Oracle のミドルウェアです。2017年6月に初公開され、9月19日から ERC 667 トークンで ICO を実施しました。ICO の上限(ハードキャップ)である約36億円の資金調達を達成し、Chainlink のトークン名は LINK で、トークンの総発行数は10億 LINK です。

Chainlink は blockchain(P2P Network)の外にあるデータ / Web API / オフチェーンリソースと blockchain のスマートコントラクトの間の橋渡しする機能(Oracle Contract)を開発および提供しています。

図にあるように、左にある分析情報 / セキュリティ情報(識別 ID 等)/ Cloud にあるビッグデータを Chainlink を経由し、中央にある blockchain(Bitcoin / Ethereum / Hyperledger [Linux 財団のプロジェクト] )のスマートコントラクトに記録します。そして、記録された情報を blockchain 以外の組織に提供することが可能です。右にある SWIFT は国際銀行間通信協会の略称、PayPal はオンライン決済サービス、そして Bitcoin もありますね。ここが Oracle を理解する上でイメージしやすいと思いますので注目しておきましょう。

そして、Chainlink は blockchain でありません。誤解している方も多いかもしれませんので強調しました。blockchain でないわけですからマイニング(発掘)もありません。

なお、ステーキングの話はありますが混乱するので本記事では割愛します。

Oracle は RDBMS のオラクルと違うの?

違います(即答)

一般的な blockchain 上のスマートコントラクトは blockchain で保護された情報に基づいているだけで信憑性に欠けると指摘されています。トランザクションデータはマイナー(マイニング者)の合意によるもので、DApps(分散型アプリケーション)は blockchain の外にあるデータ(外部リソース)とは接続できないのです。

これらを可能にする機能である分散型ブロックチェーンミドルウエアを Oracle と呼んでいます。Oracle は外部の API(暗号通貨プロジェクトが提供している公開 API 等)を通して信頼性のあるデータを受け取り、 blockchain 内のスマートコントラクトに受け渡します。

Oracle を用いることで例えば「支払い(送金)」や「blockchain 以外にある IoT データを改ざん不可能なスマートコントラクトに記録および利活用」を実現できます。

また、銀行を始めとする金融業界は DApps 用に新たな blockchain を構築することなく、分散型で信頼のある blockchain の合意形成に準ずることが可能になり、今後、増えてくると予想される DeFi(分散型金融)には欠かせないシステムを Chainlink は提供しています。

実は Oracle は新しいものではなく、他の暗号通貨プロジェクトにおいても Oracle の必要性を把握し、サブプロジェクトとして Oracle を開発しています。しかし、開発者不足などの様々な理由で開発が遅延したり、開発が停止されているケースが散見されます。そこで Chainlink は Oracle に開発に特化し、様々な企業や暗号通貨プロジェクトとパートナーを締結し、異なる blockchain 間を中継するための外部アダプターを開発しています。

ちなみに外部アダプターは GCP の GCF や AWS の Lambda を用いて開発しています。一見、メガクラウド(AWS / GCP / Azure)と関係なさそうに思われがちですが、彼らは良いものはどんどん取り入れます。開発言語も同じく Go / Rust などを適材適所で採用します。

以下にポイントをまとめます。

  • Chainlink は分散型 Oracle のミドルウェア
    (単一障害点 [SPOF] が存在せず、分散型であるため無停止)

  • Chainlink は非常に高い信頼性を備えている
    (信頼性が高くなければ、金融機関や暗号通貨プロジェクトで採用されない)

  • Chainlink は相互運用性(インターオペラビリティ)を重視
    (相互運用性 / 相互接続性が備わっていないと、スマートコントラクトとして機能しない)

  • Chainlink はエコシステムを重視している
    (多くの企業や暗号通貨プロジェクトとパートナーを締結している)

  • Chainlink はプライバシー保護にも取り組んでいる
    (2019年10月8日に DeFi のソリューションである「Mixicles」に関する論文とその内容を発表

Chainlink と Google(GCP)について

2019年6月14日に Google Cloud 公式ブログで Ethereum x Chainlink x GAE x BigQuery の記事を公開しています。

【Google Cloud 公式ブログ内の図】

英文ですが読んでいただければ、Google が blockchain は非常に良く理解していることがわかると思います。私がこの記事を読んだ後の感想は Google は Oracle の重要性を理解している でした。blockchain を熟知していなければ書けるレベルではありません。Chainlink に着目した素晴らしい記事です。

また、BigQuery では一般公開データとして暗号資産(暗号通貨 / 仮想通貨)の情報を活用することができます。

ほか、GCP などの国際資格保有者はご存知かと思われますが、資格保有者は blockchain に識別 ID が記録されます。これは最近の話ではなく、私が知る限り GCP の資格試験制度が始まった段階で w3id.org を活用しています。JSON ファイルをダウンロードし、詳細な情報(チェックポイント、ハッシュ、バリデーション等)を確認することも可能です。

Google が運用しているかどうかは未確認ですので参考程度にしてください。

早速 Coffee Break

「はじめに」が非常に長くなってしまいましたので、ここで Coffee Break をしましょう!

Qiita Advent Calendar 2019 の記事ですから、読者の方には気軽に読んでいただけると嬉しいです。以下に 豆知識を記載しますので「なるほど~」と思っていただければ十分です。

ERC 667 トークンって何?

これまで暗号資産(暗号通貨 / 仮想通貨)で資金調達を行う手段の1つとして ICO(Initial coin offering)がありました。一般的な ICO では Ethereum の ERC 20 トークンを採用していましたが、Chainlink は ERC 20 の欠点を補填した複数トークンの規格(ERC 223、ERC 721 等で ERC 20 に新しい関数を追加した規格)のうち transferAndCall 関数を ERC 20 に導入した規格である ERC 667 トークンを採用しました。もっと詳しく知りたい方は Token ERC Comparison for Fungible Tokens を読んでみてください。図を用いて非常にわかりやすい記事です。Coffee が冷めてしまうほど没頭するかもしれません!

Chainlink が発行した LINK って何に使うの?

Chainlink のトークンである LINK の用途は、Chainlink の使用料として使われます。具体的には Chainlink Node Operator(ノード管理者)に対してデータ検索などで利用した際に LINK を支払います。ただし「LINK で支払わなければならない」ではありません。ここ重要です。「LINK で支払ってもいいよ。他の決済手段もあるよ。」という理解で十分です。

また、Chainlink の Mainnet(本稼働のNetwork)ではなく、Testnet であれば蛇口(Faucet)から 100 LINK を受け取れるので暗号資産(暗号通貨 / 仮想通貨)取引所で LINK を購入する必要はありません。Ethereum も同じですが Testnet で検証するために「Ropsten / Rinkeby」という Endpoints を使えば良いだけです。Testnet は、多くの暗号通貨プロジェクトで提供しています。

Hyperledger Avalon プロジェクト

Chainlink は Bitcoin と Ethereum に加えて、Linux Foundation のプロジェクトの1つである Hyperledger にも対応しています。使うためには申請が必要ですが、2019年10月8日に Chainlink は Hyperledger Avalon プロジェクトに関連した新しいフレームワークを開発及び発表しました。Avalon は Hyperledger プロジェクトの中で最多の協賛がついているプロジェクトで世界の大手 IT 企業の名が連ねています。もっと詳しく知りたい方は以下の記事を読んでみてください。

Driving Demand for Enterprise Smart Contracts Using the Trusted Computation Framework and Attested Oracles via Chainlink

Chainlink をもっと知りたい方へ

Chainlink のチャットに入室するのが最適ですが、チャットを読んでいるだけで「あっ?もう1時間も経過したよ..。」となるので以下の「まとめサイト」を参考にすると良いでしょう。時間は有限です。そして、そろそろ Coffee Break も終わらせないといけませんね!

Awesome Chainlink(GitHub)

Chainlink のコミュニティによる非常に評価が高い GitHub ページです。Chainlink の admin から推奨されているページです。特に Chainlink Developers サイトには面白いサンプルコードがあります。

For example:
Chainlink Developers BigQuery(Testnet)
Chainlink Developers 目覚まし時計(Testnet)

1.Chainlink Node 構築方法(GKE x CloudSQL)

さて、ここから GKE x CloudSQL を用いて Chainlink Node の構築方法を説明します。実は 2019年9月から Chainlink コミュニティで構築方法について意見交換がされており、これを踏まえた構築方法の記事が 2019年10月18日に公開されています。

Running Chainlink Nodes on Kubernetes and the Google Cloud Platform

執筆者はオーストラリアの Secure Data Links 社に所属している Mr.Raymond Mogg です。そして、この記事(チュートリアル)には以下のように丁寧な説明が記載されています。

ノードの最適な稼働時間を確保するため、Secure Data Linksのチームは現在、Google Cloud Platform(GCP)とともに Kubernetes を使用して Chainlink oracle を実行しています。この記事では、GCP で一貫した稼働時間でノードを実行できるように、独自のインフラストラクチャを模倣するインフラストラクチャを設定するプロセスを説明します。
このチュートリアルでは、Kubernetes を使用して、すべて GCP 内の外部データベース(Cloud SQL)に接続する2つの Chainlink ノードをセットアップします。Kubernetes でノードを実行すると、クラッシュした場合にノードが自動的に再起動します。データベースとノードの両方が Google Cloud で内部的に実行されるため、すべてのトラフィックはそれらの間で都合よく内部でルーティングされ、パブリックネットワークに公開されることはありません。

すべてのトラフィックが GCP の内部 Network に流れるため安心です。そのためにも CloudSQL は Public IP を持たせず、Private IP だけを保持させています。

ただし、前提として Ethereum の Node を自分で用意しなければなりません。Ethereum は2019年12月8日にハードフォークを実施し、2020年1月にもハードフォークを実施する予定です。

Ethereum の Node 作成方法から説明すると大変ですし、しかも Ethereum の同期(Sync)に多大な時間を要するので EaaS(Ethereum as a Service)である Fiews.io を活用して、Ethereum の blockchain と Chainlink の Node を接続します。Fiews.io は Chainlink からの推薦で、上述した今後の Ethereum のハードフォークも対応してくれるので、メンテナンスフリーです。

【システムアーキテクチャ図】

ただし、Ethereum の Mainnet を利用するためには最低プラン(Low Plan で $5 / month)が必要ですが、Ethereum のマイニングを目的に Node を稼働するより Low cost で何より楽です。下図が Fiews.io の Plans / Pricing for Chainlink です。また、トライアル期間(2週間)もあるので、それも活用しましょう。

では早速、以下に作業手順を 簡潔 に書きます。その後に 詳細やポイントとなる(私が悩んだ)部分 をできるだけ丁寧に記載してみます。

  1. GitHub から deploy.yaml のダウンロード
  2. GKE のセットアップと起動
  3. CloudSQL のセットアップと起動(Private IP を選択)
  4. GKE のシークレット(secret)の作成
  5. Fiews.io で API key の取得
  6. GKE の configMap の作成
  7. Chainlink Node をデプロイ
  8. Node(Pod) が正常に稼働していることを確認

2.GitHub から deploy.yaml のダウンロード

構築は GCP の Cloud Shell で実施します。

$ git clone https://github.com/securedatalinks/ChainlinkKubernetes.git
$ /cd ./ChainlinkKubernetes/
$ cat deploy.yaml #depoly.yaml の存在を確認
$ cp deploy.yaml ../ #作業ディレクトリにコピー
$ cd ../
$ ls -all
-rw-r--r--  1 name name     1041 Dec 11 11:43 deploy.yaml 
#delpoy.yaml のコピーされたことを確認

3.GKE のセットアップと起動

  • Cluster Name # 任意(例:chainlink)
  • Zone:asia-northeast1-c #CloudSQL も同じ Zone とすること
  • Master version:1.13.12-gke.8 #上述のブログと同じとする
  • default-pool:1 #Pod は1つで良い
  • Machine type:n1-standard-2(2 vCPU, 7.5 GB)
  • Load balancing(Enable HTTP load balancing)は不要なのでチェックを外す
  • ・補足1:Image type はデフォルトの Container-Optimized OS (cos)で良い
    ・補足2:Boot disk type は Standard persistent disk で良い

上記の情報で create をすると GKE のクラスターが作成されます。

【GKE セッティング画面】

【GKE クラスター画面】

4.CloudSQL のセットアップと起動(Private IP)

GKE クラスタが起動完了するまで数分を要するので、その間に CloudSQL をセットアップします。

  • PostgreSQL を選択
  • Instance ID #任意(例:chainlink)
  • Default user password:Generate し、password は後で使うので記録しておくこと(重要)
  • Region:asia-northeast1 #GKE も同じ Region とすること
  • Zone:asia-northeast1-c #GKE も同じ Zone とすること
  • Database version:PostgreSQL 9.6 を選択 #上述のブログと同じとする
  • Configuration options の Connectivity で Private IP を選択。Public IP のチェックは外すこと(重要)
  • Machine type and storage:デフォルト(1 vCPU, 3.75GB)
  • Storage type:デフォルトの SSD

上記の情報で create をすると CloudSQL が作成されます。
次に[データベース]タブに移動し、[データベースの作成]をクリックして、新しいデータベースに「chainlink」という名前を付けます。

・補足:ユーザーとデータベースのデフォルトの postgres で問題ありません。慣れたら任意のユーザーとデータベースを作成しましょう。ただし、ユーザーの password は忘れずに記録しておきましょう。

5.GKE のシークレット(secret)の作成

GKE のダッシュボードに移動して Pod の作成準備にとりかかります。ここは上述のブログのまま Copy and Paste すると将来、公開 API(他の暗号通貨プロジェクトが提供している公開 API)を活用する際にエラーが出力されるので以下のようにしましょう。

Cloud Shell で以下のとおり入力します。

$ echo "user@example.com" > .api 
# メールの送受信が可能なメールアドレスを入力します。

$ vim .api
# 生成済みのメールアドレスの下に password を追加します。password は強固にしましょう。
# 最低16文字以上の大文字/小文字を組み合わせたアルファベットと数字を採用し、記録しておきます。

$ echo "my_wallet_password" > .password 
# 上記と同じく強固な password とし、記録しておきます。

$ ls -all 
# .api / .password / deploy.yaml が作成されていることを確認します。

  
Cloud Shell で kubectl コマンドを用いてシークレットを生成します。作成後に GCP のコンソールでも確認できます[GKE] -> [Configuration] に api-envpassword-env が表示されます。
  

$ kubectl create secret generic api-env --from-file=.api
$ kubectl create secret generic password-env --from-file=.password

  
secrets が生成されているか確認するコマンドです。

$ kubectl get secrets

6.Fiews.io で API key の取得

Fiews.io にアクセスしてアカウントを新規作成します。Plans を low($5 / Month)を選択して、クレジットカード情報と郵便番号を入力するだけで利用できます。その後、Fiews.io のダッシュボードに API key と後述する GKE の configMAP に必要な ETH-URL の情報を入手できます。

7.GKE の configMap の作成

Chainlink Node の環境変数を保持する configMap を作成し、kubectl コマンドを用いて configMap を create します。今回は Ethereum の Mainnet 用の configMap を作成します。

必要な情報は2つです。

【DATABASE_URL】
CloudSQL で作成した際の「ユーザー名、パスワード、Private IP、データベース名」です。

記述例
postgresql://postgres:PASSWORD@IP:5432/chainlink

例えば CloudSQL (PostgreSQL)を作成した際に以下の情報とします。

・ユーザー名:hoge
・パスワード :hogehoge
・Private IP:10.5.66.7
・データベース名:postgres

  
この情報に基づいた DATABASE_URL は以下となります。
postgresql://hoge:hogehoge@10.5.66.7:5432/postgres

【ETH_URL】
Fiews.io のダッシュボードに丁寧に表示されます。
wss://cl-main.fiews.io/v1/API_key

この2つの URL を用いて configMap コマンドを作成します。

$ kubectl create configmap node-env --from-literal ROOT=/chainlink \
--from-literal LOG_LEVEL=debug --from-literal ETH_CHAIN_ID=1 \
--from-literal CHAINLINK_TLS_PORT=0 --from-literal SECURE_COOKIES=false \
--from-literal ALLOW_ORIGINS=* \
--from-literal ETH_URL=wss://cl-main.fiews.io/v1/< API key > \
--from-literal DATABASE_URL=postgresql://hoge:hogehoge@10.5.66.7:5432/postgres \
--from-literal DATABASE_TIMEOUT=0

  
configMaps が生成されているか確認するコマンドです。もちろん、作成後に GCP のコンソールでも確認できます。[GKE] -> [Configuration] に node-env として configMap が表示されます。

$ kubectl get configMaps

8.Chainlink Node をデプロイ

GKE に 2つの Chainlink Node(Pod)をデプロイします。Node は冗長しており、Pod がクラッシュした場合に Node は自動的に再起動します。

さて、ここで最初にダウンロードした deploy.yaml の出番です。中身は一切変更する必要はありません。

$ kubectl apply -f deploy.yaml
$ kubectl get all # Node が正常に動作していることを確認するコマンド

  
出力結果の例:
READY が 1/1 、STATUS が Running になっています。EXTERNAL-IP は none になっています。これは GKE のクラスター作成時にロードバランサーを無効にしているからです。

$ kubectl get all
NAME                                        READY   STATUS    RESTARTS   AGE
pod/chainlink-deployment-6fdcb54997-vh295   1/1     Running   0          20h
pod/chainlink-deployment-6fdcb54997-wtzg7   1/1     Running   0          20h

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   45h

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/chainlink-deployment   2/2     2            2           20h

NAME                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/chainlink-deployment-6fdcb54997   2         2         2       20h

9.Node(Pod) が正常に稼働していることを確認

Chainlink Node が正常に稼働しているのか log を参照してみます。なお、Pod は2つ起動しているので、ログメッセージが出力される Pod と、[INFO] のみが表示される Pod があります。両方の Pod を参照してみてください。下図がログメッセージが出力されている Pod の例です。

まとめ

GKE x CloudSQL を用いて、Chainlink の Node を稼働させました。Ethereum の Mainnet に接続されているので、blockchain 以外のデータを Ethereum のスマートコントラクトに書き込むことが可能となります。

Chainlink は44 のユースケースを掲載しており、また GCF(Google Cloud Founctions)や BigQuery の使い方についても丁寧に記載しています。GCP の様々なサービスを駆使し、企業や他の暗号通貨プロジェクが提供している公開 API を用いることで世の中を豊かにするアイデアが思い浮かぶかもしれません。そのときは以下の URL を参照してください。すぐに実践(検証)ができると思います。私も2019年~2020年のお正月は、いろいろ触ってみたいと思います!

Find Chainlink External Adapters