寄付窓口はこちら

Smart Contracts & Off Chain Data #BCJ2020

twitter.com

f:id:niwatako:20201024145251p:plain

Chainlink、スマートコントラクトをオフチェーン(ブロックチェーンの外部の情報)に繋ぐ方法、API、従来型の支払い方法についてお話します。

その前に、一言言わせてください。歴史がまさに作られようとしているのです。

誰かがパイオニアとなり、第四次産業革命を進めていきます。たくさんのツールが有り、第四次産業革命を推し進めているのです。

それでは本日の概要です。

f:id:niwatako:20201024145522p:plain

スマートコントラクトの接続性の問題についてお話します。ChainlinkがどのようにDeFi(分散型金融)エコシステムの成長を後押ししているか、まだ実現していない可能性について触れます。それから時間次第ですが、たくさんのツールがあるので、Chainlinkを使ってスマートコントラクトを作成してみます。

それではスマートコントラクトの接続性の問題について

f:id:niwatako:20201024145706p:plain

Chainlinkをしっかり理解するために、まず、スマートコントラクトは、外部データやオフチェーンとはつながっていません。つまり、現在できることはトークンの譲渡のみに限られるのです。

でもエンジニアとしては疑問に思うのは、それならAPIコールを行えば?ということですよね。いつもやっているようにAPIコールすれば、と。

これは重要なポイントです。

答えは簡単で、ブロックチェーンは決定論的(Deterministic)、または一意的であるので、ブロックチェーンの全ノードによって検証されなければいけません。

APIコールの検証が一部だとすると、APIコールの1つがその間にアップデートされると、2つの違うノードがこのAPIコールを行うことになります。実際の値に関して合意が形成されません。

ノードAは「値は7」と言い、ノードBは「8だった」と言うでしょう。コンセンサスが得られないのです。すべての取引を最初から最後まで見たときに、同じ結果になっていないといけません。

それではどうやってオフチェーンのデータを組み合わせるのでしょうか。

f:id:niwatako:20201024150203p:plain

答えとして、外部とつながるためには、オラクルと呼ばれるものが必要になります。

外部とつながり、スマートコントラクトにデータを提供するデバイスをオラクルと呼びます。

このやり方だとデータの結果をオンチェーン上でレポートするので、ブロックチェーンの一意性を担保できるのです。

ここでChainlinkが必要となります。アプリケーションに必要なデータを提供しているAPIがすでに数千もあります。

ChainlinkはAPIとスマートコントラクトを簡単につなげることができます。

ウェブで使われているAPIを使って分散型アプリケーションを作ることができるのです。

Chainlinkのノードの一つがChainlinkオラクルです。後で実際に使ってみますね。

f:id:niwatako:20201024150503p:plain

データを入手できるということだけでなく、ブロックチェーン自体、そして送金が暗号資産であることも知らない人がまだまだたくさんいます。チェーンリンクで簡単にフィアット通貨を送金することもできます。外部アダプターを使ってです。

このようなChainlinkの素晴らしい機能を使って、思い通りにカスタマイズできるのです。

例えば、スマートコントラクトの指示がボブに$100、フィアット通貨で送るように、とあるとします。アプリケーション上の外部アダプターに作ってしまえばいいのです。外部アダプターはどんな言語にも対応しています。VyperやSolidityのことをすべて理解する必要はありません。

ここで重要な点です。

f:id:niwatako:20201024150908p:plain

集中型オラクルがスマートコントラクト全てにおける単一障害点になりうるのです。

なので、分散型オラクルを作成したいのです。

スマートコントラクトを作成する理由は、まず第一にその分散性からです。

例えば、一つの場所からデータを取得して、単独の機関を信用する場合、スマートコントラクトはその価値を失います。そのデータの元となっている単独の機関を信用する点において、従来型の契約書となんら変わりないからです。

つまり、たった1つのチェーンリンクノードからデータを得ただけでは、全体像を掴むことはできないのです。木を見て森を見ずの状態です。

単独の機関では不十分です。アプリケーションの作成に、単独の機関だけに頼ってはいけないのです。

chainlinkノードのネットワークを設定する必要があります。

この分散性が非常に重要なのは、プロジェクトが攻撃されて、実際、数百万ドルも損失が出ているからなのです。

f:id:niwatako:20201024153805p:plain

Chainlinkはモジュラー型インフラストラクチャで、ここで独自の分散型ネットワークを作ったりオフラインのデータにアクセスしたり、スマートコントラクトに用いたりすることができます。

f:id:niwatako:20201024153905p:plain

それか、その逆だったり、実際にアップデートすることもできます。

本当に面白くてパワフルな機能ですよね。

f:id:niwatako:20201024154020p:plain

Chainlinkのプロジェクトは進んでいて、素晴らしいブロックチェーンオペレーターもたくさんいます。その力を合わせることに寄ってプライスフィードとなるのです。これらが分散型オンチェーンの参照ポイントとなり、例えばETH/USDのような様々な通貨ペアに対する信憑性のあるソースを提供することができます。

f:id:niwatako:20201024154152p:plain

feeds.chain.link にいってみてください。価格参照をここで見ることができます。

各ノードは個別にデータをオフチェーン上で取得し、それをオンチェーンでレポートします。それらを集めて、ここにあるような応答を実行します。すべて独立したオペレーターです。ここですべての応答を見ることができます。全てにおいて、透明性を確保しているのです。

この良いところは、自分のものを使っても良いという点です。この点に触れているのは、これが素晴らしい点で、DeFiプロジェクトの多くの基幹となっているからです。

これらのプライスフィードは多くのトッププロジェクトでも使用されています。ここにあるようにです。(一番右、隠れているのは Asset Management)

f:id:niwatako:20201024154455p:plain

合成資産、貸し借り、取引、資産管理の分野で使われています。

数週間前のDeFiパルスのスクリーンショットです。

f:id:niwatako:20201024154608p:plain

トッププロジェクトを表示しています。トップ5のうち、3つがプライスフィードを用いて、数十億ドルを保護しているのです。ロックしている資産額を見てください。プライスフィードが強固なものだということがわかると思います。

Aave、Synthetics、Yearn.Financeがその3つですが、プライスフィードを使ってプロトコルを保護しているのです。

f:id:niwatako:20201024154906p:plain

Syntheticsは9億ドル、Loopringは2000万、SetProtocolも2000万、Aaveはなんと15億です。本当に強力なんです。

Chainlinkには、Chainlink VRFというツールもあります。

f:id:niwatako:20201024155018p:plain

今まで、ランダムな数値を出すには、正直なマイナーに頼らなければなりませんでした。

それは避けたいところです。誰かの信用に頼ることなくスマートコントラクトの独立性を確保したいのです。

だからChainlink VRFというツールが有り、そこで証明可能安全性を有するランダムな数値を取得することができます。面白いですよね。しかも前例がないのです。

ゲーム、機器等に対して、ランダムな数値を求めたいのなら、Chainlink VRFを使ってください。

まだご覧になっていない方は、44ideasというブログを読んでください。

f:id:niwatako:20201024155409p:plain

それではお気に入りのDeFiを紹介したいと思います。

f:id:niwatako:20201024155443p:plain

DeFiの動きが活発になっているのはご存知ですよね。

DeFiをまだよく知らない方は、DeFi Pulseを触ってみることをおすすめします。

これはファンタジースポーツや他のゲーム用に作られたものです。

f:id:niwatako:20201024155624p:plain

もっと沢山の種類が出ていて、Chainlink VRFを使うことでより強力になります。

f:id:niwatako:20201024155645p:plain

車や土地などトークン化した資産など

f:id:niwatako:20201024155739p:plain

すべて分散型オラクルからのものなので、だれもいじることができないのです。ここがスマートコントラクトを使う肝となるところです。

たとえば農作物が全部だめになってしまい、保険会社が支払いに応じてくれないとします。

f:id:niwatako:20201024155832p:plain

既存の条件ゆえです。そして、泥沼の法廷闘争の最中だとします。

スマートコントラクトを使えば、保険会社には支払うか、支払わないかと言った有無を言わせずに済みます。

データが閲覧可能になったら、天候不良だったことがわかり、自動的に保険が支払われるのです。そして、既存の条件を気にする必要もありません。とても強力です。

分散型スマートコントラクト、Chainlinkのデータが有れば、保険会社が正しいことをするかどうか信用する必要はありません。正しいものこそが、構造なのです。面白いですよね。

ここで例をお見せします。

f:id:niwatako:20201024160144p:plain

まずお見せするのがChainlink Documentsです。ここに全てあります。

f:id:niwatako:20201024160238p:plain

実際にAPIをコールしてみましょう。Remixを起動するボタンもあります。

f:id:niwatako:20201024160349p:plain

ボタン一つでデプロイされます。

f:id:niwatako:20201024160414p:plain

試しに色々やってみました。gistがあります。Solidityファイルを起動します。

重要なのは requestVolumeData 関数です。ここからChainlinkのリクエストを実行します。

f:id:niwatako:20201024160520p:plain

ジョブIDとデータを戻す先のアドレス、fulfillセレクタを与えます。非同期になっています。イベントを発行しリクエストを実行します。

これをオフチェーンのChainlink Nodeが見つけてくれます。ジョブIDとオラクルを指定したからです。すぐ見つけてくれます。後でお見せします。

APIコールを実行し、データを取得し、オンチェーン上に載せます。載せるのは、fulfillファンクションで行います。

f:id:niwatako:20201024161112p:plain

どうなるかすぐに分かると思います。

Chainlink リクエストを実行するときにジョブとオラクルが必要になります。実行の際にはジョブだけ定義します。

Market.linkなどのノード一覧サービスから多くのジョブとノードを見つけることができます。

f:id:niwatako:20201024161244p:plain

例えばUInt256を返すジョブを見つけたかったとします。

f:id:niwatako:20201024161424p:plain

Kovan(Ethereumのテストネット)を選んで...すべてのジョブを見つけることができます。

f:id:niwatako:20201024161351p:plain

JobsタブでUInt256を探すことができます。

f:id:niwatako:20201024161510p:plain

これがNode Job IDで、UInt256を返す際に使うものになります。

f:id:niwatako:20201024161531p:plain

これを使ってみましょう。APIコールではJSON PathのようなPathを追加します

f:id:niwatako:20201024161641p:plain

Raw, ETH, USD, Volumeです

f:id:niwatako:20201024161712p:plain

f:id:niwatako:20201024161800p:plain

コントラクトにVolumeデータを挿入するにはfullfillの実装を変えてください。ここでは何も変えません。

デプロイして実行してみます。Gasが必要です。

f:id:niwatako:20201024161952p:plain

また、オラクルに対するfeeも必要になります。LINKを送りました。多いかもしれませんがテスト用なので大丈夫です。

f:id:niwatako:20201024162047p:plain

requestVolumeを実行します。volumeDataに値が出てくるはずです。

トランザクションはEtherscanで確認できます。成功したようです。

f:id:niwatako:20201024162302p:plain

ValumeDataを確認できるようになったはずです

f:id:niwatako:20201024162344p:plain

プライスフィードを取得してみます。

f:id:niwatako:20201024162527p:plain

基本的にアグリゲーターのアドレスを選択するだけです。

f:id:niwatako:20201024162551p:plain

例えばKovanで探して、ETH/USDを使います。使うのはこれだけです。

f:id:niwatako:20201024162631p:plain

実行してみます。

feeds.chain.link上ですべてのプライスフィードのデータを見ることができます。たくさんのノードが応答していて、ハートビートも見られます。順調です。

f:id:niwatako:20201024162805p:plain

リアルタムでノードが応答しているのが見られます。z

f:id:niwatako:20201024162943p:plain

有効で信用できるプライスフィードとは何かを見て、最新の価格を出していきました。

f:id:niwatako:20201024163014p:plain

これらはほんの一部の機能です。

価格データの取得とスマートコントラクトのに信用できる分散型の価格データを取り込むことができる本当にパワフルな方法です。

あと数分あるのでこちらのTruffleの実装も見ていただきたいと思います。

Remix IDE以外でスマートコントラクトを作成するのに、Truffleは非常に強力なツールです。

f:id:niwatako:20201024163204p:plain

多くのデータを取得し、これと全く同じコードをNode.jsで使いたいのであれば、truffleをインストールすることができます。

npm install truffle

Truffleを沢たことがないのであれば、ぜひ触ってみてください。素晴らしいツールだし、従来型の環境のようなもので、ユーザーコードをテスト、デプロイできます。

truffle migrate --network koven live とします。

重要なのは環境変数にexportしなければならない点です。

f:id:niwatako:20201024164100p:plain

12単語のMNEMONIC、InfuraなどのRPC_URLをexportします。このURLを使ってブロックチェーンに接続します。これでコントラクトをデプロイできます。

コマンドラインでデプロイが行われます。デプロイされたアドレスを確認できます。

f:id:niwatako:20201024164429p:plain

詳しくやり方を説明しているブログらあるのでぜひ確認してみてください。

パワフルなスマートコントラクトを作成できる素晴らしいツールがたくさんあります。創造性だけが阻害要因なのです。

f:id:niwatako:20201024164511p:plain

皆さん本当にユニークで面白いものを作ってみてください。質問があればエンジニアが集まるdiscordで聞いてみてください。TwitterやRedditといったソーシャルメディアで素晴らしいスマートコントラクトのエンジニアとつながってください。

またお会いできるのを楽しみにしております。ありがとうございました。