MakerDAOのオラクルってどうなってるの? その1

HashHubインターンの藤田です。インターンとしてはこの記事が実は最後の仕事になります。4月からはHashHubでエンジニアとして働きながら自分個人でも色々とモノを作っていきます。今後ともよろしくお願いしまっす!

4月からのふじた

先日、Twitterの方で 「DAI(MakerDAOが発行するステーブルコイン)発行のためにも、集権型取引所のAPIが利用されている訳で、原理主義にこりず、うまいところ納得のいく落とし所を探って行く必要がある。」 とか偉そうなことを呟いたところ、Sgさん(@_sgtn)から、「繰り返しゲームが今後それを解決する手立てとなるかもしれない。また、ビタリクがMakerの価格決定システムに使えそうな、そこらの問題について言及してるよ!」と教えていただいたので、これをきっかけに改めてオラクルがどうなってるかを調べてみることにしました。Sgさんからのリプは背筋が伸びます。この前GBECのLTで「Twitterのバケモノ」とか言ってすいませんでした!!

てなことで、今回はまず、先にあげたMakerDAOの価格取得のオラクルの仕組みをコードベースで見ていきます。

MakerDAOってなんぞや

まず、MakerDAO&DAIをそもそもよくわからないよって方のために簡単に説明すると、MakerDAOのDAIとは、「ETHを担保として1ドル=1DAIとさせるステーブルコイン」のことです。直接、ドルにペグさせるわけではなく、ETHのドル換算での価格を集権型取引所のAPIからとってきて、その価格を基に、担保とするETHがドル換算でどれくらい必要かを常にコントラクトが監視する仕組みとなっています。つまり、ETHとドルのレートの情報を外部からDAI発行のスマートコントラクトに取り組んでいるということですね。

仮説

どうオラクルを実現させているのかの仮説として、MakerDAO側が立てているサーバーで一定期間ごとに各取引所のAPIから為替レートの情報を取得し、その情報をサーバー側で処理して適正とするレートを、コントラクトのオーナー権限で書き込んで反映させるか、レートの情報を取引所の数だけオーナー権限でコントラクトに渡して、コントラクト上で適正なレートを算出していると考えています。この仮説通りだと、コントラクトのオーナーが嘘ついたらDAIのバランスなんて簡単に壊すことができるのでかなり運営へトラストフルな仕組みとなってしまいます。実際のところどうなのでしょうか。

market-maker-keeper

Githubを覗くと、取引所の名前だらけのmarket-maker-keeperというレポジトリを見つけました。ここが怪しいです。中身をみていきましょう。

coinbase、ddex、etherdeltaと集権型、分散型問わず取引所の名前が付いたmarket_maker_keepr.pyが並んでいるのがわかると思います。market-makingというのが「値付け業務, 金融機関が債権や株式の売買希望価格を市場に提示すること」らしいです。また1つ賢くなりました。そして、market_maker_keeperとは、取引所に従って円滑にmarket-makingを行うための番人達とのことになります。ほうほう、やっぱりここっぽい。

それぞれのmarket_maker_keeperを見てみると、どれもpymakerとpyexchangeというモジュールを読み込んでいるのがわかりました。名前と読み込んでる内容からして、pyexchangeは各取引所のAPIをうまく解釈するためのモジュールみたいですね。pymaker、君は何者だ。

pymaker

「Python API for Maker contracts.」とあるので、どうやら集めた取引所の情報をうまくMakerDAOのコントラクトに伝えるための部分な気がします。今の所、仮説通りっぽい展開。このAPIを使うことで、DAIを送金したり、DSValueをアップデート、DAIの現在の状況を取得&更新などができると書いてあります。DSValueをアップデートのサンプルコードは以下のようになっています。

import json
import urllib.request

from web3 import HTTPProvider, Web3

from pymaker import Address
from pymaker.feed import DSValue
from pymaker.numeric import Wad


def cryptocompare_rate() -> Wad:
    with urllib.request.urlopen("https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD") as url:
        data = json.loads(url.read().decode())
        return Wad.from_number(data['USD'])


web3 = Web3(HTTPProvider(endpoint_uri="http://localhost:8545"))

dsvalue = DSValue(web3=web3, address=Address('0x038b3d8288df582d57db9be2106a27be796b0daf'))
dsvalue.poke_with_int(cryptocompare_rate().value).transact()

cryptocompareという通貨レートのサイトのAPIからETH/USDのレートを取得してきて、その後コントラクトのアドレスを指定し、そのレートの値をpoke_with_intという関数で渡しています。pokeというのは「突きつける」という意味らしいです。レートをコントラクトに突きつけるということかな。 今回のコードではendpoint_uriがlocalhostになっているため、ローカルのチェーンに投げていることがわかります。

DSValue

ここまで来ると、DSValueを追いたいですね。pymakerモジュール内で検索をかけてみます。pymaker/pymaker/feed.py にDSValueというクラスがありました。DSValueに関する説明も以下のようにコメントされています。

前提知識が足りてないものを英語で読むと解釈に間違いがありそうで不安です。。とりあえずDSValueのホワイトリストのアドレスでないと値の更新ができないらしい。というかそもそもそういう限られた権限保持者だけでコントラクト上の値を管理する仕組みをDSValueコントラクトと言っているみたい。MakerDAOもそのDSValueという仕組みを使っていると。

急ですが分量が長くなりそうなので今回はここまでとします!

まとめ

ほとんど僕が学んでいる過程を書いているだけで、知見がはっきりと示せてはいない気がするのですが、手探りで理解していく際にどんな風にやってみるものかは伝わるのではないでしょうか笑

今回は、ミドルウェアプロトコルに関することなのに一切solidityのコードが出てこないので、スマートコントラクトの外もかなり重要だとわかるいい機会になりました。

Solidityだけでミドルウェアプロトコルが成り立っている訳ではない

大事なので大きな字で書いておこう。アホっぽい。 続きでは、実際にDSValueが具体的にどう使われているのかというところから再度MakerDAOのオラクルの仕組みを追っていきます。

これを読んでいる方で、「こういう風にコード読む癖つけるといいよ」などあれば是非アドバイスやコメント頂きたいです。4月からの新人エンジニアに救いの手を!!Twitterの方のDMでもいいので待ってます!!

お知らせ

■HashHubでは入居者募集中です! HashHubは、ブロックチェーン業界で働いている人のためのコワーキングスペースを運営しています。ご利用をご検討の方は、下記のWEBサイトからお問い合わせください。また、最新情報はTwitterで発信中です。

HashHub:https://hashhub.tokyo/ Twitter:https://twitter.com/HashHub_Tokyo

■ブロックチェーンエンジニア集中講座開講中! HashHubではブロックチェーンエンジニアを育成するための短期集中講座を開講しています。お申込み、詳細は下記のページをご覧ください。

ブロックチェーンエンジニア集中講座:https://www.blockchain-edu.jp/

■HashHubでは下記のポジションを積極採用中です! ・コミュニティマネージャー ・ブロックチェーン技術者・開発者 ・ビジネスディベロップメント

詳細は下記Wantedlyのページをご覧ください。

Wantedly:https://www.wantedly.com/companies/hashhub/projects

Blockchain Engineer Blog

This Blog is for all Blockchain Engineer

    Takuya Fujita

    Written by

    Blockchain Engineer Blog

    This Blog is for all Blockchain Engineer