annotate final_pre/pre.tex @ 13:117794d50054

update
author akahori
date Tue, 19 Feb 2019 21:49:55 +0900
parents 2e843f65ac5f
children 2e706e8bb6bd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12
akahori
parents:
diff changeset
1 \documentclass[twocolumn,twoside,9.5pt]{jarticle}
akahori
parents:
diff changeset
2 \usepackage[dvipdfmx]{graphicx}
akahori
parents:
diff changeset
3 \usepackage{picins}
akahori
parents:
diff changeset
4 \usepackage{fancyhdr}
akahori
parents:
diff changeset
5 \usepackage{abstract}
13
akahori
parents: 12
diff changeset
6 \usepackage{here}
12
akahori
parents:
diff changeset
7 \usepackage{url}
akahori
parents:
diff changeset
8 %\pagestyle{fancy}
akahori
parents:
diff changeset
9 \lhead{\parpic{\includegraphics[height=1zw,keepaspectratio,bb=0 0 251 246]{pic/emblem-bitmap.pdf}}琉球大学主催 工学部情報工学科 卒業研究発表会}
akahori
parents:
diff changeset
10 \rhead{}
akahori
parents:
diff changeset
11 \cfoot{}
akahori
parents:
diff changeset
12
akahori
parents:
diff changeset
13 \setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}}
akahori
parents:
diff changeset
14 \setlength{\headheight}{0mm}
akahori
parents:
diff changeset
15 \setlength{\headsep}{5mm}
akahori
parents:
diff changeset
16 \setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}}
akahori
parents:
diff changeset
17 \setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}}
akahori
parents:
diff changeset
18 \setlength{\textwidth}{181mm}
akahori
parents:
diff changeset
19 \setlength{\textheight}{261mm}
akahori
parents:
diff changeset
20 \setlength{\footskip}{0mm}
akahori
parents:
diff changeset
21 \pagestyle{empty}
akahori
parents:
diff changeset
22
akahori
parents:
diff changeset
23 \input{dummy.tex}
akahori
parents:
diff changeset
24 \renewcommand{\abstractname}{Abstract}
akahori
parents:
diff changeset
25 \begin{document}
akahori
parents:
diff changeset
26 \title{Blockchain implements in Christie}
akahori
parents:
diff changeset
27 \author{155753A 氏名 {赤堀}{貴一} 指導教員 : 河野 真治}
akahori
parents:
diff changeset
28 \date{}
akahori
parents:
diff changeset
29 \twocolumn [
akahori
parents:
diff changeset
30 \maketitle
akahori
parents:
diff changeset
31 \begin{onecolabstract}
akahori
parents:
diff changeset
32
13
akahori
parents: 12
diff changeset
33 Data corruption and inconsistency in computers causes severe problem. Therefore, we detect corruption and inconsistency by Blockchain. The Blockchain is a distributed system. It is possible to compare between hash value and data which is correct. Even if there are incorrect operation and tampering, data are possible to recover with Blockchain.
12
akahori
parents:
diff changeset
34
akahori
parents:
diff changeset
35 We are developing Christie and GearsOS. Christie is a distributed framework and GearsOS is a Operating System. GearsOS Filesystem will refer to Christie. if implementing block chain in Christie and implementing it in GearsOS, makes it possible to detect data corruption and inconsistency in the GearsOS file system. In addition, it is possible to configure decentralized distributed network between Gears OS. if it does not configure, data is protected. So, our purpose can be achieved.
akahori
parents:
diff changeset
36
akahori
parents:
diff changeset
37 In this study, We implement Blockchain in Christie and run it in distributed environment on PC cluster.
akahori
parents:
diff changeset
38 \end{onecolabstract}]
akahori
parents:
diff changeset
39 \thispagestyle{fancy}
akahori
parents:
diff changeset
40
akahori
parents:
diff changeset
41 \section{研究目的}
akahori
parents:
diff changeset
42
13
akahori
parents: 12
diff changeset
43 ブロックチェーンとは分散型台帳技術とも呼ばれ, 複数のトランザクションをまとめたブロックをHashでつなげたものを, システムに参加しているすべてのノードが保持できる技術である.
12
akahori
parents:
diff changeset
44
13
akahori
parents: 12
diff changeset
45 当研究室では分散フレームワークとしてChristieを開発している. これはGearsOSにファイルシステムに組み込む予定がある. そのため, Christieにブロックチェーンを実装し, GearsOSに組み込むことにより, GearsOSのファイルシステムにおいてデータの不整合を検知できる. また, GearsOS同士による分散ファイルシステムを構成することができ, 非中央的にデータの分散ができるようになる. もし分散システムを構成しない場合でもデータの整合性保持は行え, 上記の目的は達成できる.
12
akahori
parents:
diff changeset
46
akahori
parents:
diff changeset
47 本研究では, Christieにブロックチェーンを実装し, 実際に学科のPCクラスタ上の分散環境で動かす.
akahori
parents:
diff changeset
48
akahori
parents:
diff changeset
49 \section{ブロックチェーン}
akahori
parents:
diff changeset
50 ブロックチェーンを実装することは次のようなメリットが有る.
akahori
parents:
diff changeset
51
akahori
parents:
diff changeset
52 \begin{itemize}
akahori
parents:
diff changeset
53 \item データの追跡, 検証が容易である.
akahori
parents:
diff changeset
54 \item 中央管理者が存在しない. 単一障害点がない.
akahori
parents:
diff changeset
55 \end{itemize}
akahori
parents:
diff changeset
56
akahori
parents:
diff changeset
57 データの追跡, 検証が容易であるのは, ブロックの構造によるものである. ブロックの構造は簡易化すれば次のようなものである.
akahori
parents:
diff changeset
58
akahori
parents:
diff changeset
59 \begin{itemize}
akahori
parents:
diff changeset
60 \item 前のブロックの暗号化ハッシュ.
akahori
parents:
diff changeset
61 \item タイムスタンプ.
akahori
parents:
diff changeset
62 \item トランザクションリスト.
akahori
parents:
diff changeset
63 \end{itemize}
akahori
parents:
diff changeset
64
akahori
parents:
diff changeset
65 ブロックは図\ref{fig:chain}のようにhashでつながっている. 一つのブロックが変更されれば, その後に連なるブロックも整合性が保たれないため, これによってデータの整合性保持が行える.
akahori
parents:
diff changeset
66
13
akahori
parents: 12
diff changeset
67 \begin{figure}[H]
12
akahori
parents:
diff changeset
68 \centering
akahori
parents:
diff changeset
69 \fbox{
akahori
parents:
diff changeset
70 \includegraphics[scale=0.3]{./images/chain.pdf}
akahori
parents:
diff changeset
71 }
akahori
parents:
diff changeset
72 \caption{hash chain}
akahori
parents:
diff changeset
73 \label{fig:chain}
akahori
parents:
diff changeset
74 \end{figure}
akahori
parents:
diff changeset
75
akahori
parents:
diff changeset
76
13
akahori
parents: 12
diff changeset
77 トランザクション, ブロックともにノード間で伝搬され, ノードごとに検証される. そして検証を終え, 不正なトランザクション, ブロックであれば破棄する. 検証に通った場合は, トランザクションはTransaction PoolにTransactionを貯めておき, ブロックはブロックチェーンに取り組まれ, 検証したノードからトランザクション, ブロックがブロードキャストされる. ノード間はP2Pで通信が行われている.
12
akahori
parents:
diff changeset
78
akahori
parents:
diff changeset
79 同時に異なるノードで複数のブロックができることを, forkという. これによってブロックチェーンの分岐が起こる.
akahori
parents:
diff changeset
80 ブロックチェーンの分岐を収束させるにはコンセンサスアルゴリズムを使用する.
akahori
parents:
diff changeset
81
akahori
parents:
diff changeset
82 \section{コンセンサスアルゴリズム}
akahori
parents:
diff changeset
83 コンセンサスアルゴリズムとは, 一意の値を分散環境上で決めるためのアルゴリズムである.
akahori
parents:
diff changeset
84
13
akahori
parents: 12
diff changeset
85 今回は分散アルゴリズムとしてPaxosを実装した.
akahori
parents: 12
diff changeset
86
akahori
parents: 12
diff changeset
87 Paxosは3つの役割のノードがある.
akahori
parents: 12
diff changeset
88
akahori
parents: 12
diff changeset
89 \begin{description}
akahori
parents: 12
diff changeset
90 \item[proposer] 値を提案するノード.
akahori
parents: 12
diff changeset
91 \item[acceptor] 値を決めるノード.
akahori
parents: 12
diff changeset
92 \item[learner] acceptorから値を集計し, 過半数以上のacceptorが持っている値を決める.
akahori
parents: 12
diff changeset
93 \end{description}
akahori
parents: 12
diff changeset
94
akahori
parents: 12
diff changeset
95 Paxosのアルゴリズムに入る前に, 定義された用語を説明する. 以下にその用語の定義を示す.\begin{description}
akahori
parents: 12
diff changeset
96 \item[提案] 提案は, 異なる提案ごとにユニークな提案番号と値からなる. 提案番号とは, 異なる提案を見分けるための識別子であり, 単調増加する. 値は一意に決まってほしいデータである.
akahori
parents: 12
diff changeset
97 \item[値(提案)がacceptされる] acceptorによって値(提案)が決まること.
akahori
parents: 12
diff changeset
98 \item[値(提案)が選択(chosen)される] 過半数以上のacceptorによって, 値(提案)がacceptされた場合, それを値(提案)が選択されたと言う.
akahori
parents: 12
diff changeset
99 \end{description}
akahori
parents: 12
diff changeset
100
akahori
parents: 12
diff changeset
101
akahori
parents: 12
diff changeset
102 Paxosのアルゴリズムは2フェーズある.
akahori
parents: 12
diff changeset
103
akahori
parents: 12
diff changeset
104 1つ目のフェーズ, prepare-promiseは次のような手順で動作する.
akahori
parents: 12
diff changeset
105 \begin{enumerate}
akahori
parents: 12
diff changeset
106 \item proposerは提案番号nを設定した提案を過半数以上のacceptorに送る. これをprepareリクエストという.
akahori
parents: 12
diff changeset
107 \item acceptorはprepareリクエストが来たら次の動作をする.
akahori
parents: 12
diff changeset
108 \begin{enumerate}
akahori
parents: 12
diff changeset
109 \item もし, 以前に送られたprepareリクエストの提案番号より, 今送られてきたprepareリクエストの提案番号のほうが大きければ, それ以下の提案番号の提案を拒否するという約束を返す. この状態をPromiseしたという.
akahori
parents: 12
diff changeset
110 \item もし, 値がすでにacceptされていれば, accpetされた提案を返す.
akahori
parents: 12
diff changeset
111 \end{enumerate}
12
akahori
parents:
diff changeset
112
13
akahori
parents: 12
diff changeset
113 \end{enumerate}
akahori
parents: 12
diff changeset
114
akahori
parents: 12
diff changeset
115 2つ目のフェーズ, accept-acceptedは次のような手順で動作する.
akahori
parents: 12
diff changeset
116 \begin{enumerate}
akahori
parents: 12
diff changeset
117 \item proposerは過半数のacceptorから返信が来たならば, 次の提案をacceptorに送る. これをacceptリクエストという.
akahori
parents: 12
diff changeset
118 \begin{enumerate}
akahori
parents: 12
diff changeset
119 \item もし, 約束のみが返ってきているならば, 任意の値vをprepareリクエストで送った提案に設定する.
akahori
parents: 12
diff changeset
120 \item もし, acceptされた提案が返ってきたら, その中で最大の提案番号を持つ提案の値v'をprepareリクエストで送った提案の値として設定する.
akahori
parents: 12
diff changeset
121 \end{enumerate}
akahori
parents: 12
diff changeset
122
akahori
parents: 12
diff changeset
123 \item acceptorはacceptリクエストが来た場合, Promiseした提案よりもacceptリクエストで提案された提案番号が低ければ, その提案を拒否する. それ以外の場合はacceptする.
akahori
parents: 12
diff changeset
124 \end{enumerate}
akahori
parents: 12
diff changeset
125
akahori
parents: 12
diff changeset
126
akahori
parents: 12
diff changeset
127 このアルゴリズムによって, 各accptorごとに値が一意に決まる. 値を集計, 選択するのはLearnerの役割である. Learnerが値を集計する方法には2つの方法がある.
akahori
parents: 12
diff changeset
128
akahori
parents: 12
diff changeset
129 \begin{enumerate}
akahori
parents: 12
diff changeset
130 \item Acceptorによって値がacceptされた時に, 各Learnerに送信される. ただし, Message通信量が, $Acceptorの数 \times Learnerの数$になる.
akahori
parents: 12
diff changeset
131 \item 1つのLearnerが各Learnerに選択された値を送信する. 1の方法に比べてMessage通信量が少なくなる($Acceptorの数 + Learnerの数$になる)代わりに, そのLearnerが故障した場合は各LearnerがMessageを受け取れない.
akahori
parents: 12
diff changeset
132 \end{enumerate}
akahori
parents: 12
diff changeset
133
akahori
parents: 12
diff changeset
134 2つの方法はメッセージ通信量と耐障害性のトレードオフになっていることがわかる.
akahori
parents: 12
diff changeset
135
akahori
parents: 12
diff changeset
136 Paxosでコンセンサスを取ることは, Proof of Workと比較して次のようなメリットがある.
akahori
parents: 12
diff changeset
137
akahori
parents: 12
diff changeset
138 \begin{itemize}
akahori
parents: 12
diff changeset
139 \item CPUのリソースを消費しない
akahori
parents: 12
diff changeset
140 \item Transactionの確定に時間がかからない.
akahori
parents: 12
diff changeset
141 \end{itemize}
12
akahori
parents:
diff changeset
142
akahori
parents:
diff changeset
143 \section{Christie}
akahori
parents:
diff changeset
144
akahori
parents:
diff changeset
145 Christieは当研究室で開発している分散フレームワークである. ChristieはJavaで書かれているが, 当研究室で開発しているGearsOSに組み込まれる予定がある. そのため, GearsOSを構成する言語Continuation based Cと似た概念がある. Christieに存在する概念として次のようなものがある.
akahori
parents:
diff changeset
146
akahori
parents:
diff changeset
147 \begin{itemize}
akahori
parents:
diff changeset
148 \item CodeGear(以下CG)
akahori
parents:
diff changeset
149 \item DataGear(以下DG)
akahori
parents:
diff changeset
150 \item CodeGearManager(以下CGM)
akahori
parents:
diff changeset
151 \item DataGearManager(以下DGM)
akahori
parents:
diff changeset
152 \end{itemize}
akahori
parents:
diff changeset
153
akahori
parents:
diff changeset
154 CGはクラス, スレッドに相当し, DGは変数データに相当する. CGMはノードであり, DGM, CG, DGを管理する. DGMはDGを管理するものであり, putという操作により変数データ, つまりDGを格納できる.
akahori
parents:
diff changeset
155
akahori
parents:
diff changeset
156 DGMにはLocalとRemoteと2つの種類があり, Localであれば, LocalのCGMが管理しているDGMに対し, DGを格納していく. Remoteであれば接続したRemote先のCGMのDGMにDGを格納できる. DGを取り出す際にはアノテーションを付けることで, データの取り出し方も指定できる. Take, Peekという操作があり, Takeは読み込んだDGが消えるが, PeekはDGを消さずにそのまま残す. また, RemoteTake, RemotePeekというものもあり, リモート先を指定することにより, RemoteDGMからデータを取ることができる.
akahori
parents:
diff changeset
157
akahori
parents:
diff changeset
158 CGはCGMによって実行されるが, 実行するにはCGに必要なDGが全て揃う必要がある. もしDGが全て揃わない場合, CGMはずっとlistenし, データが揃うまで実行を待つ.
akahori
parents:
diff changeset
159
13
akahori
parents: 12
diff changeset
160 \section{Christieでのブロックチェーンの実装}
akahori
parents: 12
diff changeset
161 Christieでブロックチェーンのブロック, トランザクション, Paxosを実装した.
akahori
parents: 12
diff changeset
162
akahori
parents: 12
diff changeset
163 その際の, Christieの便利な点を述べる.
akahori
parents: 12
diff changeset
164
akahori
parents: 12
diff changeset
165 \begin{itemize}
akahori
parents: 12
diff changeset
166 \item ブロック, トランザクションを送るのが簡単. ChristieはDataGearという単位でデータを保持する. そのため, ブロックやトランザクションはDataGearに包めばいい.
akahori
parents: 12
diff changeset
167 \item TopologyManagerでのテストが便利. dotファイルが有れば, TopologyManagerが任意の形でTopologyを作れる. そのため, ノードの配置については理想の環境を作れるため, 理想のテスト環境を作ることができる.
akahori
parents: 12
diff changeset
168 \item ソースコードの機能ごとにファイルが実装できるため, 見通しが良い. ChristieはCbCのgotoと同じように関数が終わるとsetupによって別の関数に移動する. そのため自然に機能ごとにファイルを作るため, 見通しが良くなる.
akahori
parents: 12
diff changeset
169 \end{itemize}
akahori
parents: 12
diff changeset
170
akahori
parents: 12
diff changeset
171 不便な点を以下に述べる.
akahori
parents: 12
diff changeset
172
akahori
parents: 12
diff changeset
173 \begin{itemize}
akahori
parents: 12
diff changeset
174 \item デバッグが難しい. DGでのkeyのスペルミスなどが起こると, CodeGearが実行されず, waitされる問題が出る.
akahori
parents: 12
diff changeset
175 \item TakeFrom, PeekFromの使い方が難しい. TakeFrom, PeekFromは引数でDGM nameを指定する. しかし, DGMの名前を静的に与えるよりも, 動的に与えたい場合が多かった.
akahori
parents: 12
diff changeset
176 \item Takeの待ち合わせでCGが実行されない. 2つのCGで同じ変数をTakeしようとすると, setupされた時点で変数がロックされる. このとき, 片方のCGはDGがすべて揃っているのに, すべての変数が揃っていないもう片方のCGに同名の変数がロックされ, 実行されない場合がある.
akahori
parents: 12
diff changeset
177 \end{itemize}
akahori
parents: 12
diff changeset
178
akahori
parents: 12
diff changeset
179
akahori
parents: 12
diff changeset
180
akahori
parents: 12
diff changeset
181
akahori
parents: 12
diff changeset
182 \section{実験, 評価}
akahori
parents: 12
diff changeset
183 ブロックチェーンにおいて, 分散環境上でテストしなければいけないのはコンセンサスアルゴリズムである. そのため, Paxosを実装し, 琉球大学のPCクラスタ上で動かした.
akahori
parents: 12
diff changeset
184
akahori
parents: 12
diff changeset
185 今回は単純化のために, 整数でコンセンサスを取る. ノードはproposerが2つ, acceptorが3つ, learnerが1つという構成で実験する.
akahori
parents: 12
diff changeset
186
akahori
parents: 12
diff changeset
187 Paxosの実験は3回行った. Paxosにはlog4j2を実装しており, logを取るようにしている. そのため, そのlogから値が一意に決まるまでを調べた. 1つの実験の結果を図\ref{fig:paxos2}に示す.
akahori
parents: 12
diff changeset
188
akahori
parents: 12
diff changeset
189 \begin{figure}[h]
akahori
parents: 12
diff changeset
190 \centering
akahori
parents: 12
diff changeset
191 \fbox{
akahori
parents: 12
diff changeset
192 \includegraphics[scale=0.45]{./images/paxos2.pdf}
akahori
parents: 12
diff changeset
193 }
akahori
parents: 12
diff changeset
194 \caption{実験の結果1}
akahori
parents: 12
diff changeset
195 \label{fig:paxos2}
akahori
parents: 12
diff changeset
196 \end{figure}
akahori
parents: 12
diff changeset
197
akahori
parents: 12
diff changeset
198 実際にLearnerの値が一意に決まっていることがわかる.
akahori
parents: 12
diff changeset
199
akahori
parents: 12
diff changeset
200
12
akahori
parents:
diff changeset
201
akahori
parents:
diff changeset
202 \section{まとめ}
akahori
parents:
diff changeset
203
akahori
parents:
diff changeset
204
13
akahori
parents: 12
diff changeset
205 本研究ではブロックチェーンと, 分散環境上で値を一意に決めるコンセンサスアルゴリズムを述べ, Christieという分散フレームワークで実際にPaxosを作り, PCクラスタ上で動かした. その結果, コンセンサスの結果として一意のデータが取り出せることがわかった.
akahori
parents: 12
diff changeset
206
akahori
parents: 12
diff changeset
207 まだPCクラスタ上ではブロックチェーンを動かすことができない. しかし, Block, Transaction, Hash生成, 署名のためのクラスはいずれも作られている. Transactionにおいてはまだファイルのデータを入れる機能は実装していないが, これらを組み合わせれば簡易的なブロックチェーンが作れる. そのため, あとはPaxosとこれらのクラスをどのようにつなげるかが問題となる.
akahori
parents: 12
diff changeset
208 また, Proof of Workを行うクラスも作られている. そのため, ブロックチェーンが実装できた場合, このクラスを用いてPaxosと速度比較も行える.
akahori
parents: 12
diff changeset
209
akahori
parents: 12
diff changeset
210 今後の課題としては, Paxosによるブロックチェーンを作り, 分散クラスタ上でファイルのやり取りができるかを見る. その際にどの程度スケーラビリティがあるのか, Proof of Workと比較し, どの程度速度が違うのかを見ていきたい.
akahori
parents: 12
diff changeset
211
akahori
parents: 12
diff changeset
212
akahori
parents: 12
diff changeset
213
12
akahori
parents:
diff changeset
214 \nocite{*}
akahori
parents:
diff changeset
215 \bibliographystyle{junsrt}
akahori
parents:
diff changeset
216 \bibliography{reference}
akahori
parents:
diff changeset
217 \end{document}