annotate final_main/chapter3/chapter3.tex @ 7:d6cca85616e2

update
author akahori
date Sat, 16 Feb 2019 23:15:20 +0900
parents 7ab85a536778
children 0ad9752c0c85
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
1 %\input{/Users/e155753/.tex/setup}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
2
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
3 %%文書開始****************************
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
4 \begin{document}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
5 %%**************************************
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
6 \chapter{コンセンサスアルゴリズム}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
7
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
8 ブロックチェーンでは, パブリックブロックチェーンの場合とコンソーシアムブロックチェーンによってコンセンサスアルゴリズムが変わる. この章ではパブリックブロックチェーンのBitcoin, Ethereumに使われているProof of Workについて説明し, コンソーシアムブロックチェーンに使えるPaxosを説明する.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
9
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
10 \section{Proof of Workを用いたコンセンサス}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
11 パブリックブロックチェーンとは, 不特定多数のノードが参加するブロックチェーンシステムのことを指す. よって, 不特定多数のノード間, 全体のノードの参加数が変わる状況でコンセンサスが取れるアルゴリズムを使用しなければならない.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
12 Proof of Workは不特定多数のノードを対象としてコンセンサスが取れる. ノードの計算量によってコンセンサスを取るからである. 次のような問題があっても, Proof of Workはコンセンサスを取ることができる.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
13
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
14 \begin{enumerate}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
15 \item プロセス毎に処理の速度が違う. つまり, メッセージの返信が遅い可能性がある
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
16 \item 通信にどれだけの時間がかかるかわからず, その途中でメッセージが失われる可能性がある,
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
17 \item プロセスは停止する可能性がある. また, 復旧する可能性もある.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
18 \item 悪意ある情報を他のノードが送信する可能性がある.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
19 \end{enumerate}
3
008ac0554ff5 add files
akahori
parents:
diff changeset
20
008ac0554ff5 add files
akahori
parents:
diff changeset
21
5
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
22 Proof of Workに必要なパラメータは次のとおりである.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
23
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
24 \begin{itemize}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
25 \item nonce
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
26 \item difficulty
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
27 \end{itemize}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
28
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
29 nonceはブロックのパラメータに含まれる. difficultyはProof of Workの難しさ, 正確に言えば1つのブロックを生成する時間を調整している.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
30 Proof of Workはこれらのパラメータを使って次のようにブロックを作る.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
31
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
32 \begin{enumerate}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
33 \item ブロックとnonceを加えたものをハッシュ化する. この際, nonceによって, ブロックのハッシュは全く違うものになる.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
34 \item ハッシュ化したブロックの先頭から数えた0ビットの数がdifficultyより多ければ, そのブロックにnonceを埋め込み, ブロックを作る.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
35 \item 2の条件に当てはまらなかった場合はnonceに1を足して, 1からやり直す.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
36 \end{enumerate}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
37 difficulty = 2でProof of Workの手順を図にしたものを図\ref{fig:proof-of-work}に示す.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
38
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
39 \begin{figure}[H]
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
40 \centering
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
41 \fbox{
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
42 \includegraphics[scale=0.5]{./images/proof-of-work.pdf}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
43 }
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
44 \caption{proof-of-workの例}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
45 \label{fig:proof-of-work}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
46 \end{figure}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
47
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
48
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
49 2の条件については, 単純に$(桁数 - difficulty + 1) \times 10 > hash$とも置き換えることができる.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
50
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
51 nonceを変えていくことで, hashはほぼ乱数のような状態になる. つまり, difficultyを増やすほど, 条件に当てはまるhashが少なくなっていくことがわかり, そのhashを探すための計算量も増えることがわかる.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
52
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
53 これらがProof of Workでブロックを生成する手順である. これを用いることによって, ブロックが長くなればなるほど, すでに作られたブロックを変更することは計算量が膨大になるため, 不可能になっていく.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
54
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
55 Proof of Workでノード間のコンセンサスを取る方法は単純で, ブロックの長さの差が一定以上になった場合, 最も長かったブロックを正しいものとする. これを図で表すと, 図\ref{fig:proof-of-work-fork}のようになる.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
56
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
57 \begin{figure}[H]
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
58 \centering
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
59 \fbox{
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
60 \includegraphics[scale=0.5]{./images/proof-of-work-fork}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
61 }
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
62 \caption{Proof of Workでのコンセンサス}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
63 \label{fig:proof-of-work-fork}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
64 \end{figure}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
65
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
66 計算量の差が51\%以上になると, forkしたブロック同士で差が生まれる. それによって, IPアドレスでのコンセンサスではなく, CPUの性能によるコンセンサスを取ることができる.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
67
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
68 コンセンサスでは, ブロックの差が大きければ大きいほど, コンセンサスが正確に取れる. しかし, 正しいチェーンが決まるのに時間がかかる. そのため, コンセンサスに必要なブロックの差はコンセンサスの正確性と時間のトレードオフになっている.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
69
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
70 この方法でコンセンサスを取る場合の欠点を挙げる.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
71 \begin{itemize}
7
akahori
parents: 6
diff changeset
72 \item CPUのリソースを使用する.
5
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
73 \item Transactionが確定するのに時間がかかる.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
74 \end{itemize}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
75
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
76
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
77 \section{Paxos}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
78
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
79 コンソーシアムブロックチェーンは許可したノードのみが参加できるブロックチェーンである. そのため, ノードの数も把握できるため, Paxosを使うことができる. Paxosはノードの多数決によってコンセンサスを取るアルゴリズムである. ただし, Paxosは次のような問題があっても値を一意に決めることができる.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
80
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
81 \begin{enumerate}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
82 \item プロセス毎に処理の速度が違う. つまり, メッセージの返信が遅い可能性がある
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
83 \item 通信にどれだけの時間がかかるかわからず, その途中でメッセージが失われる可能性がある,
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
84 \item プロセスは停止する可能性がある. また, 復旧する可能性もある.
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
85 \end{enumerate}
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
86
6
akahori
parents: 5
diff changeset
87 Proof of Workにある特性の4がないが, これは許可したノードのみが参加可能だからである. つまり, 悪意あるノードが参加する可能性が少ないためである.
akahori
parents: 5
diff changeset
88
7
akahori
parents: 6
diff changeset
89 Paxosは3つの役割のノードがある.
akahori
parents: 6
diff changeset
90
akahori
parents: 6
diff changeset
91 \begin{description}
akahori
parents: 6
diff changeset
92 \item[proposer] 値を提案するノード.
akahori
parents: 6
diff changeset
93 \item[acceptor] 値を決めるノード.
akahori
parents: 6
diff changeset
94 \item[learner] acceptorから値を集計し, 過半数以上のacceptorが持っている値を決める.
akahori
parents: 6
diff changeset
95 \end{description}
akahori
parents: 6
diff changeset
96
akahori
parents: 6
diff changeset
97 Paxosのアルゴリズムに入る前に, 定義された用語を説明する. 以下にその用語の定義を示す.\begin{description}
akahori
parents: 6
diff changeset
98 \item[提案(リクエスト)] 提案は, 異なる提案ごとにユニークな提案番号と, 値からなる. 提案番号とは, 異なる提案を見分けるための識別子であり, 単調増加する. 値は一意に決まってほしいデータである.
akahori
parents: 6
diff changeset
99 \item[値(提案)がacceptされる] acceptorによって値(提案)が決まること.
akahori
parents: 6
diff changeset
100 \item[値(提案)が選択される] 過半数以上のacceptorによって, 値(提案)がacceptされた場合, それを値(提案)が選択されたと言う.
akahori
parents: 6
diff changeset
101 \end{description}
akahori
parents: 6
diff changeset
102
akahori
parents: 6
diff changeset
103
akahori
parents: 6
diff changeset
104 Paxosのアルゴリズムは2フェーズある.
akahori
parents: 6
diff changeset
105
akahori
parents: 6
diff changeset
106 1つ目のフェーズ, prepare-promiseは次のような手順で動作する.
akahori
parents: 6
diff changeset
107 \begin{enumerate}
akahori
parents: 6
diff changeset
108 \item proposerは提案番号nを設定した提案を過半数以上のacceptorに送る. これをprepareリクエストという.
akahori
parents: 6
diff changeset
109 \item acceptorはprepareリクエストが来たら次の動作をする.
akahori
parents: 6
diff changeset
110 \begin{enumerate}
akahori
parents: 6
diff changeset
111 \item もし, 以前に送られたprepareリクエストの提案番号より, 今送られてきたprepareリクエストの提案番号のほうが大きければ, それ以下の提案番号の提案を拒否するという約束を返す. この状態をPromiseしたという.
akahori
parents: 6
diff changeset
112 \item もし, 値がすでにacceptされていれば, accpetされた提案を返す.
akahori
parents: 6
diff changeset
113 \end{enumerate}
akahori
parents: 6
diff changeset
114
akahori
parents: 6
diff changeset
115 \end{enumerate}
akahori
parents: 6
diff changeset
116
akahori
parents: 6
diff changeset
117 2つ目のフェーズ, accept-acceptedは次のような手順で動作する.
akahori
parents: 6
diff changeset
118 \begin{enumerate}
akahori
parents: 6
diff changeset
119 \item proposerは過半数のacceptorから返信が来たならば, 次の提案をacceptorに送る. これをacceptリクエストという.
akahori
parents: 6
diff changeset
120 \begin{enumerate}
akahori
parents: 6
diff changeset
121 \item もし, 約束のみが返ってきているならば, 任意の値vをprepareリクエストで送った提案に設定する.
akahori
parents: 6
diff changeset
122 \item もし, acceptされた提案が返ってきたら, その中で最大の提案番号を持つ提案の値v'をprepareリクエストで送った提案の値として設定する.
akahori
parents: 6
diff changeset
123 \end{enumerate}
akahori
parents: 6
diff changeset
124
akahori
parents: 6
diff changeset
125 \item acceptorはacceptリクエストが来た場合, Promiseした提案よりもacceptリクエストで提案された提案番号が低ければ, その提案を拒否する. それ以外の場合はacceptする.
akahori
parents: 6
diff changeset
126 \end{enumerate}
akahori
parents: 6
diff changeset
127
akahori
parents: 6
diff changeset
128 このアルゴリズムによって, 各accptorごとに値が一意に決まる. 値を集計, 選択するのはLearnerの役割である. Learnerが値を集計する方法には2つの方法がある.
akahori
parents: 6
diff changeset
129
akahori
parents: 6
diff changeset
130 \begin{enumerate}
akahori
parents: 6
diff changeset
131 \item Acceptorによって値がacceptされた時に, 各Learnerに送信される. ただし, Message通信量が, $Acceptorの数 \times Learnerの数$になる.
akahori
parents: 6
diff changeset
132 \item 1つのLearnerが各Learnerに選択された値を送信する. 1の方法に比べてMessage通信量が少なくなる(Acceptorの数の通信量になる)代わりに, そのLearnerが故障した場合は各LearnerがMessageを受け取れない.
akahori
parents: 6
diff changeset
133 \end{enumerate}
akahori
parents: 6
diff changeset
134
akahori
parents: 6
diff changeset
135 2つの方法はメッセージ通信量と耐障害性のトレードオフになっていることがわかる.
akahori
parents: 6
diff changeset
136
akahori
parents: 6
diff changeset
137 Paxosでコンセンサスを取ることは, Proof of Workと比較して次のようなメリットがある.
akahori
parents: 6
diff changeset
138
akahori
parents: 6
diff changeset
139 \begin{itemize}
akahori
parents: 6
diff changeset
140 \item CPUのリソースを消費しない
akahori
parents: 6
diff changeset
141 \item Transactionの確定に時間がかからない.
akahori
parents: 6
diff changeset
142 \end{itemize}
akahori
parents: 6
diff changeset
143
akahori
parents: 6
diff changeset
144 \section{Paxosによるブロックチェーン}
akahori
parents: 6
diff changeset
145
akahori
parents: 6
diff changeset
146 PaxosはProof of Workに比べ, CPUのリソースを消費せず, Transactionの確定に時間がかからない. そのため, Paxosでブロックのコンセンサスを取るブロックチェーンを実装することにはメリットが有る.
akahori
parents: 6
diff changeset
147 また, Paxos自体がそもそもリーダー選出に向いているアルゴリズムである. そのため, リーダーを決め, そのノードのブロックチェーンの一貫性のみを考えることもできる.
6
akahori
parents: 5
diff changeset
148
5
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
149
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
150
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
151 %%文書終了****************************
bb0c2543c456 update add pdf
akahori
parents: 3
diff changeset
152 \end{document}