ブロックチェーン上に外部情報を取り込むOraclize(前半)

まねきねこ
KYUZAN
Published in
10 min readSep 24, 2018
From Oraclize webpage

本連載では2本に分けてブロックチェーンに外部データを取り込むOraclizeについて解説します。前半では以下のトピックに触れます。

  1. 外部データの必要性
  2. Oracle, Oraclizeとは?
  3. Oraclizeの仕組み
  4. 利用可能な外部データ
  5. 信頼性検証
  6. データ取得コスト

1. 外部データの必要性

現在Ethereumブロックチェーン上に記録したスマートコントラクトを利用して様々なDappsが開発されています。

多くのDappsでは、何かしらの情報をブロックチェーン上に反映させ、それらの情報を元にして様々なスマートコントラクトで書かれたロジックが動作していくことで、ギャンブルやサプライチェーン、予測市場などの様々なサービスが実現します。

Kyuzanでは以前にワールドカップの結果予想ゲームEthoccerを作りました。

このゲームでは今回紹介するOraclizeは使っていないものの、やはりサッカーの試合結果をインターネット上から取得し、ブロックチェーン上に反映、この情報をコントラクトが参照することで、賞金分配を行うシステムになっています。

サッカーの試合結果をブロックチェーン上に反映させる

これをDapps上で実現するのは少し厄介です。というのも、Ethereum仮想マシン(EVM)には、外部の情報を取り込む仕組みは備わっていません。そのため、開発者はサーバを立て、このサーバにWebなどの外部からデータを取得し、ブロックチェーン上のコントラクトに対してトランザクションとしてデータを送信する機能を実装しなければなりません。

また、もう一点厄介なことがあります。それは取得したデータの信頼性(正しさ)の検証です。インターネット上からデータを取得する際には経路のどこかでデータの内容が改ざんされる可能性が潜んでいます。

ブロックチェーン上に様々な価値を載せることができるDappsだからこそ、それらの価値を移動させる元になる外部データが正しいかどうか、常に検証する必要があります。

2. Oracle, Oraclizeとは?

自前のサーバに変わって外部からの情報を取得し、ブロックチェーン上に反映させ、データの検証を行うサービスを一般的にオラクルと言います。

Oraclizeはオラクルの代表的なプロジェクトです。(オラクルはサービスの概念、Oraclizeは具体的なサービス名。ちょっとややこしいですね。)

Oraclizeが提供するライブラリを利用することによって、簡単にWeb上のデータを取得し、信頼性を検証し。ブロックチェーン上に取り込むことが可能になります。

この連載記事では、Oraclizeが提供している基本的な機能や、信頼性を確認する仕組み(基本となっているセキュリティモデル)、使用コスト、そして、実装例について解説していきます。

3. Oraclizeの仕組み

今回は最もポピュラーな利用例として、Oraclizeを使ってWebからデータを取得し、Ethereum上のスマートコントラクトに返すパターンを考えます。この一連の流れを図で見てみましょう。

OraclizeでWebからデータを取得するまで

Oraclizeを利用するためには、Oraclizeサーバとやり取りを行うスマートコントラクトが必要です。以下にコントラクトの例を示します。

利用者はOraclizeを利用するためにスマートコントラクト内のPayableな関数updatePrice( )をサービスの利用料(後述)に対して十分なETHを添えて呼び出します。(①)

この関数が呼び出されると、内部のイベントLogNewOraclizeQuery( )が発火され、データ呼び出しのリクエストを行う関数oraclize_query( )が実行されます。

oraclize_query( )の内部にもまたpayableな関数があり、Oraclizeを使用する際の手数料が呼び出された時に計算され、その金額がOraclize側のアカウントにTransferされます。(図中②)

Oraclizeサーバは常にイベントを監視しており、データ取得を要求するイベントを検知すると、Web上からデータを取得し、要求に応じてデータの信頼性検証を行った上でイベントを発火させたコントラクトに取得したデータを返します。(図中③~⑥)このとき、サーバはcallback関数を呼び出し、(__callback)に結果を引数として与えることでデータを返します。

4. 利用可能な外部データ

Oraclizeを使って取得できる外部データは現在5種類あります。おそらく多くのDappsで利用するのはURLになるかとは思います。

  • URL: WebページやWeb APIから得られるデータ
  • Random: Ledger Nano S(Oraclize側サーバに存在)に実装されている疑似乱数生成器によるランダムビットデータ
  • WolframAlpha: 数式処理システムMathmaticaを用いたオンライン計算サービス。複雑な計算処理結果を出力。
  • IPFS: 分散型ファイルストレージ上のデータ
  • Computation: 任意の計算処理の結果

5. 信頼性検証

Authenticity Proof: 信頼性検証は、データが途中で改ざんされていないかを検証するサービスであり、Oraclizeの最も重要な機能の一つです。現在Oraclizeから提供されている検証方法はTLSNotaryとAndroidの2種類があり、それぞれは元になっているセキュリティモデルとサービスを担保している第三者が異なりますが、どちらのサービスを利用しても、同じ利用料で取得したデータの信頼性を検証することができます。2つの検証方法が用意されているのは、ブロックチェーンの単一障害点が無い考え方に習って、検証を頼るサービスが単一障害点にならないようにするためです。

これらのサービスはOraclizeではない第三者から提供される鍵を用いることによってOraclize自体を信頼しなくとも信頼できる検証ができる点も特筆するべきポイントです。

TLSNotaryはTLS (1.1)と呼ばれるインターネット上の通信暗号化プロトコルに準拠したオープンソースの改ざん検出プロトコルです。TLSでは認証局と呼ばれる厳重に暗号鍵の管理をしている機関が存在し、この機関を介して取得したデータが改ざんされていないことを証明します。TLSNotaryでは、Amazon AWSに実装された認証局を利用しています。つまり、OraclizeのTLSNotary機能を使用する際に信頼しなければいけないのはAmazon AWSということになります。

Android Proofは最新のAndroid OS上のセキュリティモデルを利用した検証サービスです。Googleが提供するAndorid OSのセキュリティがベースになっており、この検証を実行する際はGoogleから提供されているAndroidのセキュリティモデルを信頼することになります。

6. データ取得コスト

ここでOraclizeを利用してデータを取得する際に必要なコストについて解説します。コストの支払い方法は、冒頭の図で示した流れの①に示したPayable関数のCall時にETHを添えることで行います。必要なETHは以下の2つの項目の合計になります。

  • Oraclizeサービスの利用料
  • __callback関数を実行するために必要なgas相当額

前者のサービス利用料は、Oraclizeが呼び出された時のUSD/ETHレートを基準に利用する外部データと検証の種類に応じて計算されます。

Oraclize Documentationより

後者のgas相当額は、Oraclizeが取得するデータのサイズに依存するため一概に決定することはできません。そのためこの相当額は__callbackの呼び出しを行う際に使用できる最大ガス量のgaslimitと、gaspriceを掛けて計算されることになっています。

Oraclizeとやり取りをするスマートコントラクトに明記することで__callbackを呼び出す際のgas limitやgas priceをカスタムに設定することができます。しかし、何も指定しないと2つの値はデフォルト値(gaslimit: 200, 000, gasprice: 20GWei)になり、これは0.004ETHに相当します。

このデフォルト値はgas量も非常に大きく、gaspriceも高額です。したがって、Oraclizeを頻繁に利用する場合、この設定をいかに最適化できるかが運用コストを決める重要な要素になります。

(参考までに、上に示したETH/USDのレートを返す場合に掛かったgasはたった95,132でした。また、gaspriceも7GWeiもあれば、2018/09/22時点ではすぐにトランザクションをブロックに取り込むことができ、これは0.001ETHに満たない少額です。)

前半のまとめ、後半について

前半の記事をここまでにします。本記事では、外部データをブロックチェーン上に取り込むOraclizeについて、概要や信頼性検証、コストなど基本的な部分に触れました。

後半の記事では、Oraclizeを利用する際のgas周りのコストに関する部分やOraclizeから提供されている幾つかの機能について実装を通して紹介します。

--

--