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

前回まで

その1 https://link.medium.com/oRes6NPB0V
前回の記事から、コードベースでMakerDAOの価格取得のオラクルがどのようになっているのかを辿っていこうということで、makerdaoのGithubからmarket-maker-keeperというリポジトリをみていきました。今回は続き、DSvalueの中身をみていきます。

value.sol

コメントの中身を読んでると、他のリポジトリのURLが貼ってありました。
どうやらリンク先にコントラクトのsolidityコードがあり、そのコントラクトに対応して、コントラクトの外から操作するコードが今みていたPyhtonのclass DSValueのようです。

コントラクトのコードを把握した上で、外からどう操作するか把握した方が理解が早いので、先にそちらをのぞいてみましょう。

コード短っ!DSValueはDSThingというコントラクトを継承しており、DSThingはDSauth,DSnote,DSMathというコントラクトを継承しています。
そういえばDSMathはMakerDAOのDAI発行のコントラクトにも使われていました。ここと繋がってくるのか。
別の記事ですが、こちらも何かと参考になるかもしれません。こっちもその2を早く書かないと。

話を戻します。

その1で話をしましたが、DSValueはコントラクト中の変数を、ホワイトリストに入れられているアドレスからのみ変更できるというものでした。
中にはpeek(),read(),poke(),void()の4つの関数がありますね。

peek()はコントラクトにそもそも何かしらの値が登録されているのかどうか、されていればtrueを返し、何もなければfalseを返します。
peekは英語で「ちらっと見る」なので、中身の値を確認せずとも登録されてるかだけ確認したいという意味なのでしょう。なるほどなるほど。

read()は登録している値を返す関数です。この二つはpubicかつview関数なので誰もがコントラクトを直接叩けば値を教えてくれます。

次にpoke()です。前回pymakerのリポジトリで「ETH/USDのレートを外からコントラクトに対してpokeしてる(突きつける)」というのを確認しました。
その時使ってるのがこの関数になります。wutというbyte32の変数にレート情報を突きつけ、値を保持しているのかどうかのhasという値をtrueに変えています。
このhasを先ほどのpeek()では確認していたわけですね。

最後にvoid()。これはDSValueがレート情報を保持していない状態、クリアな状態にする関数です。
wutの値を消すのではなく、hasをfalseにするだけでこのコントラクトは値を保持していないことになります。
このようにしているのは、わざわざwutの値を消す(0にする)というgasを消費してしまう作業を省くためです。
solidityの実装には随所にこういうgas節約のための工夫が見られて面白いです。

poke()とvoid()はホワイトリストに登録しているアドレスのみが扱えるように、authという修飾子が用いられています。
これはDSauthの方で実装がなされていました。関数実行者がホワイトリストに入っている人かどうかを確認するための修飾子で、簡単な実装でした。
今回は省きますが、一応リンクを貼っておきます。パッとよくわからない人はコントラクトでマルチシグを実装してみたりするとスッキリするかも。

class DSValue

コントラクトの中身を確認したところで、前回の続きに戻ってきます。

コントラクトのABIとaddressを指定してあげることで、特定のDSValueコントラクトに対して操作を行うことができます。

ざっと見た所、本当にコントラクトをPythonから叩いてるだけなので特別言及できそうなところはありませんでした。
しいて言えば取ってきた値の型を変換しているくらい。

賢い人ならPythonからどうやってコントラクトを叩くのか、どうAPIを取得するのかを参照しながらDAI周りで勝手にアビトラやってくれるプログラムとか作れるかもしれないですね。賢い人なら….!!

次回 -君が働いてるとこ見てみたいな-

今回でオラクルがどう取得され、どうEthereumのコントラクトに取り込まれているかをみてきました。
次回は具体的にこのDSValueに記録された値がどうやってDAI発行のために利用されているのかをみていきます。
Githubだけみて、へぇ〜で終わるのも面白くないので、実際にレートがどれくらいの頻度で更新されていて、どういうアドレスがホワイトリストに入れられているのかも、Etherscanに潜ってみることにしましょう!

お知らせ

■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