Mercurial > hg > Papers > 2019 > aka-thesis
view slide/slide.html @ 13:117794d50054
update
author | akahori |
---|---|
date | Tue, 19 Feb 2019 21:49:55 +0900 |
parents | 2e843f65ac5f |
children | 22e7e5667b99 |
line wrap: on
line source
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>Christieによるブロックチェーンの実装</title> <meta name="generator" content="Slide Show (S9) v2.5.0 on Ruby 2.3.7 (2018-03-28) [universal.x86_64-darwin17]"> <meta name="author" content="赤堀 貴一" > <!-- style sheet links --> <link rel="stylesheet" href="s6/themes/projection.css" media="screen,projection"> <link rel="stylesheet" href="s6/themes/screen.css" media="screen"> <link rel="stylesheet" href="s6/themes/print.css" media="print"> <link rel="stylesheet" href="s6/themes/blank.css" media="screen,projection"> <!-- JS --> <script src="s6/js/jquery-1.11.3.min.js"></script> <script src="s6/js/jquery.slideshow.js"></script> <script src="s6/js/jquery.slideshow.counter.js"></script> <script src="s6/js/jquery.slideshow.controls.js"></script> <script src="s6/js/jquery.slideshow.footer.js"></script> <script src="s6/js/jquery.slideshow.autoplay.js"></script> <!-- prettify --> <link rel="stylesheet" href="scripts/prettify.css"> <script src="scripts/prettify.js"></script> <script> $(document).ready( function() { Slideshow.init(); $('code').each(function(_, el) { if (!el.classList.contains('noprettyprint')) { el.classList.add('prettyprint'); } }); prettyPrint(); } ); </script> <!-- Better Browser Banner for Microsoft Internet Explorer (IE) --> <!--[if IE]> <script src="s6/js/jquery.microsoft.js"></script> <![endif]--> </head> <body> <div class="layout"> <div id="header"></div> <div id="footer"> <div align="right"> <img src="s6/images/logo.svg" width="200px"> </div> </div> </div> <div class="presentation"> <div class='slide cover'> <table width="90%" height="90%" border="0" align="center"> <tr> <td> <div align="center"> <h1><font color="#808db5">Christieによるブロックチェーンの実装</font></h1> </div> </td> </tr> <tr> <td> <div align="left"> 赤堀 貴一 琉球大学 工学部 情報工学科 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;"> </div> </td> </tr> </table> </div> <div class='slide '> <!-- === begin markdown block === generated by markdown/1.2.0 on Ruby 2.3.7 (2018-03-28) [universal.x86_64-darwin17] on 2019-02-19 17:49:17 +0900 with Markdown engine kramdown (1.17.0) using options {} --> <!-- _S9SLIDE_ --> <h1 id="section">目次</h1> <ul> <li>研究目的</li> <li>ブロックチェーンとは</li> <li>ブロックチェーンのfork</li> <li>コンセンサスアルゴリズム <ul> <li>Proof of Work と Paxos</li> </ul> </li> <li>Christieとは</li> <li>TopologyManagerの実装</li> <li>PCクラスタ上でPaxosを動かした話</li> <li>まとめ</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="os">研究目的 OS単位での分散システム</h1> <ul> <li>コンピュータでデータが壊れることはあり得る. 誤操作や, データの破損, 最悪の場合システムの重要な部分のデータの破損も起こりうる.</li> <li>ブロックチェーンはデータを分散でき, 破損や不整合の検知が可能である.</li> <li>当研究室ではGearsOS, そしてGearsOSに組み込む予定がある分散フレームワークChristieがある.</li> <li>Christieにブロックチェーンを実装し, GearsOSに組み込むことで, GearsOS間の分散システムが可能になる. また, 分散システムを作らずとも, hash chainとしてデータの破損を検知できる.</li> <li>よって, Christieにブロックチェーンを実装する.</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="section-1">ブロックチェーンとは</h1> <p>ブロックチェーンとは分散型台帳技術と呼ばれる. 複数のトランザクションをまとめたブロックをつなげたものを, 台帳と呼ぶ. その台帳をシステムに参加しているノードが保持する技術である.</p> <p>ノード同士はP2Pでつながっており, 対等である. そのため, 管理者がいなくてもデータの管理が行える.</p> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="section-2">ブロックチェーンとは</h1> <div style="text-align: center;"> <img src="./images/blockchain.svg" alt="blockchain" width="1000" height="600" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="section-3">ブロックチェーンとは</h1> <p>ブロックチェーンにも種類がある. パブリックブロックチェーンとプライベートブロックチェーンである. 以下に, その違いを述べる.</p> <table> <thead> <tr> <th style="text-align: center"> </th> <th style="text-align: center">パブリックブロックチェーン</th> <th style="text-align: center">プライベートブロックチェーン</th> </tr> </thead> <tbody> <tr> <td style="text-align: center">ノードの参加権</td> <td style="text-align: center">誰でも参加可能</td> <td style="text-align: center">管理者(単数 or 複数)によって許可された場合のみ参加可能</td> </tr> <tr> <td style="text-align: center">コンセンサス</td> <td style="text-align: center">遅い</td> <td style="text-align: center">速い</td> </tr> </tbody> </table> <p>細かい違いは色々あるが, ほとんどはこの2つの違いから生まれる.</p> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="fork">ブロックチェーンのfork</h1> <p>ブロックがいたるところで作られると, 異なる高さの違うチェーンが複数できる. この状態をforkという.</p> <p>forkが起こった場合, どちらかを正しいものとしてブロックを積み上げたい. そのため, コンセンサスアルゴリズムを用いて, どちらか1方に統合する.</p> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="section-4">コンセンサスアルゴリズム</h1> <ul> <li>コンセンサスアルゴリズムは分散環境上で値を一意に決めるためのアルゴリズムである. <ul> <li>Paxos, Raftなどが有名. 簡単に言えば多数決を安全に行うためのアルゴリズム.</li> <li>故障モデルというものがあって, コンセンサスアルゴリズムでレベルが4段階ある. Paxos, Raftはレベル3で, ノードに裏切り者がいなければ安全に動く.</li> <li>PBFTがレベル4である<s>が読んでないのでわからない</s></li> </ul> </li> <li>Proof of Workを使っているパブリックブロックチェーンは「ブロックが多ければ多いほど」, レベル4に近づく.</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="section-5">パブリックブロックチェーンのコンセンサスアルゴリズム</h1> <ul> <li>パブリックブロックチェーンのコンセンサスアルゴリズムは, 「ある程度ブロックの差がついたら, 長い方を正とする」というもの.</li> <li>これだけだと, 裏切り者が適当なブロックをガシガシ積めば攻撃できるのでレベル4にはなれない. これを大幅に補強したのがProof of Work.</li> <li>Proof of Workは, 簡単に言えばブロックのHashに条件をつけるアルゴリズム. つまり, 新しいブロックを作るのが難しくなる.</li> <li>新しいブロックを作るのが難しいので, みんなで協力して作ったチェーンが自然に勝つ. また, 改ざんも難しい. ただし, トランザクションの確定が遅い.</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="section-6">プライベートブロックチェーンのコンセンサスアルゴリズム</h1> <ul> <li>プライベートブロックチェーンは管理者が許可するノードしか参加しない. つまり, レベル3のコンセンサスアルゴリズムで十分.</li> <li>新しいブロックもパブリックブロックチェーンより早く作れる.</li> <li>コンセンサスアルゴリズムの中でPaxosが速いらしいので, 今回はこちらも実装してみます.</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="paxos">Paxos</h1> <ul> <li>Lamport先生が「故障モデルレベル3での合意が不可能なのを証明してやる」と言って証明の途中で逆に編み出してしまったらしいアルゴリズム.</li> <li>レベル3のアルゴリズムの基礎となっている.</li> <li>proposerが値を提案し, acceptorが決め, Learnerが集計し, 多数決を取って決まった値を保持.</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="paxos-1">Paxos</h1> <p>Paxosアルゴリズムに入る前の用語説明</p> <dl> <dt>提案</dt> <dd>提案は, 異なる提案ごとにユニークな提案番号と値からなる. 提案番号とは, 異なる提案を見分けるための識別子であり, 単調増加する. 値は一意に決まってほしいデータである.</dd> <dt>値(提案)がacceptされる</dt> <dd>acceptorによって値(提案)が決まること.</dd> <dt>値(提案)が選択(chosen)される</dt> <dd>過半数以上のacceptorによって, 値(提案)がacceptされた場合, それを値(提案)が選択されたと言う.</dd> </dl> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="paxos-2">Paxos</h1> <p>Paxosは2つのフェーズで動作する. 1つ目のフェーズ, prepare-promiseは次のような手順で動作する.</p> <ul> <li>proposerは提案番号nを設定した提案を過半数以上のacceptorに送る. これをprepareリクエストという.</li> <li>acceptorはprepareリクエストが来たら次の動作をする. <ul> <li>もし, 以前に送られたprepareリクエストの提案番号より, 今送られてきたprepareリクエストの提案番号のほうが大きければ, それ以下の提案番号の提案を拒否するという約束を返す. この状態をPromiseしたという.</li> <li>もし, 値がすでにacceptされていれば, accpetされた提案を返す.</li> </ul> </li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="paxos-3">Paxos</h1> <div style="text-align: center;"> <img src="./images/prepare-promise.svg" alt="blockchain" width="1000" height="500" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="paxos-4">Paxos</h1> <p>2つ目のフェーズ, accept-acceptedは次のような手順で動作する.</p> <ul> <li>proposerは過半数のacceptorから返信が来たならば, 次の提案をacceptorに送る. これをacceptリクエストという. <ul> <li>もし, 約束のみが返ってきているならば, 任意の値vをprepareリクエストで送った提案に設定する.</li> <li>もし, acceptされた提案が返ってきたら, その中で最大の提案番号を持つ提案の値v’をprepareリクエストで送った提案の値として設定する.</li> </ul> </li> <li>acceptorはacceptリクエストが来た場合, Promiseした提案よりもacceptリクエストで提案された提案番号が低ければ, その提案を拒否する. それ以外の場合はacceptする.</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="paxos-5">Paxos</h1> <div style="text-align: center;"> <img src="./images/accept-accepted.svg" alt="blockchain" width="1000" height="500" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="paxos-6">Paxos</h1> <p>とりあえず, このアルゴリズムで値が一意に決まる.</p> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="christie">Christieとは</h1> <ul> <li>研究室で使っていたAliceの問題点を解消した, 分散プログラミングを簡単に書けるjavaのフレームワーク.</li> <li>Continued based C(CbC)と似た書き方が可能.</li> <li>まだAliceから引き継いでない機能でTopologyManagerというものがある. これは, Topologyを構成するための機能.</li> <li>簡単に言えば, ノード間の配線をしてくれる. 分散環境上で実験を行いたい場合に便利なため, これを実装してからPaxosを実装した.</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="topologymanager">TopologyManagerとは</h1> <ul> <li>TopologyManagerは参加を表明したノード(TopologyNode)を元にTopologyを作る.</li> <li>TopologyManagerは静的Topologyと動的Topologyを作れる.</li> <li>静的Topologyはdotファイルというものを読み込んで, そのとおりにTopologyを生成する.</li> <li>動的Topologyは参加を表明したノードを動的に配置する. が, 今はTreeしか実装していない.</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="pcpaxos">PCクラスタ上でPaxosを動かした話</h1> <ul> <li>ブロックチェーンにおいて, 分散環境上でテストしなければいけないのはコンセンサスアルゴリズムである. そのため, Paxosを実装し, 実際の分散環境上で動かした.</li> <li>評価は値が一意に決まるかどうかである. 値が一意に決まるならば, リーダーがコンセンサスをとっても良いし, ブロックについてコンセンサスをとっても良い.</li> <li>今回は単純化のために, 整数でコンセンサスを取る.</li> <li>また, ノードはproposerが2つ, acceptorが3つ, learnerが1つという構成で実験する.</li> </ul> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="paxos1">Paxos実験1</h1> <div style="text-align: center;"> <img src="./images/paxos1.svg" alt="blockchain" width="1000" height="800" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="paxos2">Paxos実験2</h1> <div style="text-align: center;"> <img src="./images/paxos2.svg" alt="blockchain" width="1000" height="1000" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="paxos3">Paxos実験3</h1> <div style="text-align: center;"> <img src="./images/paxos3.svg" alt="blockchain" width="1000" height="1000" /> </div> </div> <div class='slide '> <!-- _S9SLIDE_ --> <h1 id="section-7">まとめ</h1> <ul> <li>コンセンサスアルゴリズムのPaxosを実装しました.</li> <li>ブロック, トランザクション, proof of workも実装しました. ただ, トランザクションはファイルのデータを読めるようにはしていません.</li> <li>これらを繋げてブロックチェーンにできれば, Christieにブロックチェーンが実装されます. パブリックブロックチェーンもプライベートブロックチェーンもどちらも作れます.</li> </ul> <!-- === end markdown block === --> </div> </div><!-- presentation --> </body> </html>