view final_main/chapter3/chapter3.tex @ 8:0ad9752c0c85

add chapter5 and 6
author akahori
date Mon, 18 Feb 2019 18:35:32 +0900
parents d6cca85616e2
children 2e843f65ac5f
line wrap: on
line source

%\input{/Users/e155753/.tex/setup}

%%文書開始****************************
\begin{document} 
%%**************************************
\chapter{コンセンサスアルゴリズム}

ブロックチェーンでは, パブリックブロックチェーンの場合とコンソーシアムブロックチェーンによってコンセンサスアルゴリズムが変わる. この章ではパブリックブロックチェーンのBitcoin, Ethereumに使われているProof of Workについて説明し, コンソーシアムブロックチェーンに使えるPaxosを説明する.

\section{Proof of Workを用いたコンセンサス}
パブリックブロックチェーンとは, 不特定多数のノードが参加するブロックチェーンシステムのことを指す. よって, 不特定多数のノード間, 全体のノードの参加数が変わる状況でコンセンサスが取れるアルゴリズムを使用しなければならない. 
Proof of Workは不特定多数のノードを対象としてコンセンサスが取れる. ノードの計算量によってコンセンサスを取るからである. 次のような問題があっても, Proof of Workはコンセンサスを取ることができる.

\begin{enumerate}
\item プロセス毎に処理の速度が違う. つまり, メッセージの返信が遅い可能性がある
\item 通信にどれだけの時間がかかるかわからず, その途中でメッセージが失われる可能性がある, 
\item プロセスは停止する可能性がある. また, 復旧する可能性もある.
\item 悪意ある情報を他のノードが送信する可能性がある.
\end{enumerate}


Proof of Workに必要なパラメータは次のとおりである.

\begin{itemize}
\item nonce
\item difficulty
\end{itemize}

nonceはブロックのパラメータに含まれる. difficultyはProof of Workの難しさ, 正確に言えば1つのブロックを生成する時間を調整している.

Proof of Workはこれらのパラメータを使って次のようにブロックを作る.

\begin{enumerate}
\item ブロックとnonceを加えたものをハッシュ化する. この際, nonceによって, ブロックのハッシュは全く違うものになる.
\item ハッシュ化したブロックの先頭から数えた0ビットの数がdifficultyより多ければ, そのブロックにnonceを埋め込み, ブロックを作る. 
\item 2の条件に当てはまらなかった場合はnonceに1を足して, 1からやり直す.
\end{enumerate}
difficulty = 2でProof of Workの手順を図にしたものを図\ref{fig:proof-of-work}に示す. 

\begin{figure}[H]
\centering
  \fbox{
   \includegraphics[scale=0.5]{./images/proof-of-work.pdf}
  }
\caption{proof-of-workの例}
\label{fig:proof-of-work}
\end{figure}


2の条件については, 単純に$(桁数 - difficulty + 1) \times 10 > hash$とも置き換えることができる. 

nonceを変えていくことで, hashはほぼ乱数のような状態になる. つまり, difficultyを増やすほど, 条件に当てはまるhashが少なくなっていくことがわかり, そのhashを探すための計算量も増えることがわかる. 

これらがProof of Workでブロックを生成する手順である. これを用いることによって, ブロックが長くなればなるほど, すでに作られたブロックを変更することは計算量が膨大になるため, 不可能になっていく. 

Proof of Workでノード間のコンセンサスを取る方法は単純で, ブロックの長さの差が一定以上になった場合, 最も長かったブロックを正しいものとする. これを図で表すと, 図\ref{fig:proof-of-work-fork}のようになる. 

\begin{figure}[H]
\centering
  \fbox{
   \includegraphics[scale=0.5]{./images/proof-of-work-fork}
  }
\caption{Proof of Workでのコンセンサス}
\label{fig:proof-of-work-fork}
\end{figure}

計算量の差が51\%以上になると, forkしたブロック同士で差が生まれる. それによって, IPアドレスでのコンセンサスではなく, CPUの性能によるコンセンサスを取ることができる.

コンセンサスでは, ブロックの差が大きければ大きいほど, コンセンサスが正確に取れる. しかし, 正しいチェーンが決まるのに時間がかかる. そのため, コンセンサスに必要なブロックの差はコンセンサスの正確性と時間のトレードオフになっている. 

この方法でコンセンサスを取る場合の欠点を挙げる.
\begin{itemize}
\item CPUのリソースを使用する. 
\item Transactionが確定するのに時間がかかる. 
\end{itemize}


\section{Paxos}

コンソーシアムブロックチェーンは許可したノードのみが参加できるブロックチェーンである. そのため, ノードの数も把握できるため, Paxosを使うことができる. Paxosはノードの多数決によってコンセンサスを取るアルゴリズムである. ただし, Paxosは次のような問題があっても値を一意に決めることができる.

\begin{enumerate}
\item プロセス毎に処理の速度が違う. つまり, メッセージの返信が遅い可能性がある
\item 通信にどれだけの時間がかかるかわからず, その途中でメッセージが失われる可能性がある, 
\item プロセスは停止する可能性がある. また, 復旧する可能性もある.
\end{enumerate}

Proof of Workにある特性の4がないが, コンソーシアムブロックチェーンは3つの問題を解決するだけで十分である. なぜならば, コンソーシアムブロックチェーンは許可したノードのみが参加可能だからである. つまり, 悪意あるノードが参加する可能性が少ないためだ. 

Paxosは3つの役割のノードがある.

\begin{description}
\item[proposer] 値を提案するノード.
\item[acceptor] 値を決めるノード.
\item[learner] acceptorから値を集計し, 過半数以上のacceptorが持っている値を決める.
\end{description}

Paxosのアルゴリズムに入る前に, 定義された用語を説明する. 以下にその用語の定義を示す.\begin{description}
\item[提案] 提案は, 異なる提案ごとにユニークな提案番号と値からなる. 提案番号とは, 異なる提案を見分けるための識別子であり, 単調増加する. 値は一意に決まってほしいデータである.
\item[値(提案)がacceptされる] acceptorによって値(提案)が決まること. 
\item[値(提案)が選択(chosen)される] 過半数以上のacceptorによって, 値(提案)がacceptされた場合, それを値(提案)が選択されたと言う.
\end{description}


Paxosのアルゴリズムは2フェーズある. 

1つ目のフェーズ, prepare-promiseは次のような手順で動作する. 
\begin{enumerate}
\item proposerは提案番号nを設定した提案を過半数以上のacceptorに送る. これをprepareリクエストという. 
\item acceptorはprepareリクエストが来たら次の動作をする. 
\begin{enumerate}
\item もし, 以前に送られたprepareリクエストの提案番号より, 今送られてきたprepareリクエストの提案番号のほうが大きければ, それ以下の提案番号の提案を拒否するという約束を返す. この状態をPromiseしたという.
\item もし, 値がすでにacceptされていれば, accpetされた提案を返す. 
\end{enumerate}

\end{enumerate}

2つ目のフェーズ, accept-acceptedは次のような手順で動作する. 
\begin{enumerate}
\item proposerは過半数のacceptorから返信が来たならば, 次の提案をacceptorに送る. これをacceptリクエストという.
\begin{enumerate}
\item もし, 約束のみが返ってきているならば, 任意の値vをprepareリクエストで送った提案に設定する.
\item もし, acceptされた提案が返ってきたら, その中で最大の提案番号を持つ提案の値v'をprepareリクエストで送った提案の値として設定する.
\end{enumerate}

\item acceptorはacceptリクエストが来た場合, Promiseした提案よりもacceptリクエストで提案された提案番号が低ければ, その提案を拒否する. それ以外の場合はacceptする.
\end{enumerate}

このアルゴリズムによって, 各accptorごとに値が一意に決まる. 値を集計, 選択するのはLearnerの役割である. Learnerが値を集計する方法には2つの方法がある.

\begin{enumerate}
\item Acceptorによって値がacceptされた時に, 各Learnerに送信される. ただし, Message通信量が, $Acceptorの数 \times Learnerの数$になる.
\item 1つのLearnerが各Learnerに選択された値を送信する. 1の方法に比べてMessage通信量が少なくなる(Acceptorの数の通信量になる)代わりに, そのLearnerが故障した場合は各LearnerがMessageを受け取れない.
\end{enumerate}

2つの方法はメッセージ通信量と耐障害性のトレードオフになっていることがわかる.

Paxosでコンセンサスを取ることは, Proof of Workと比較して次のようなメリットがある.

\begin{itemize}
\item CPUのリソースを消費しない
\item Transactionの確定に時間がかからない.
\end{itemize}

\section{Paxosによるブロックチェーン}

PaxosはProof of Workに比べ, CPUのリソースを消費せず, Transactionの確定に時間がかからない. そのため, Paxosでブロックのコンセンサスを取るブロックチェーンを実装することにはメリットが有る.
また, Paxos自体がリーダー選出に向いているアルゴリズムである. そのため, リーダーを決め, そのノードのブロックチェーンの一貫性のみを考えることもできる.



%%文書終了****************************
\end{document}