Work】JavaScriptでブロックチェーンにおけるnonceを理解するツイートシェアはてブLINEPocket前回の記事「【ソースコードあり】JavaScriptでブロックチェーンを作ってみた」で簡単なブロックチェーンをJavaScriptで実装し、それを紹介しましたが今回はその続編です。記事を読んでいない方はそちらに一度目を通しておくと良いでしょう。今回はブロックチェーンのブロックにおける「nonce(ノンス、ナンス)」について簡単に解説していこうと思います。コードは前回のものを転用して説明していきます。Work(プルーフ・オブ・ワーク)」について紹介しておきます。PoWとは、各取引を認証するために算出しなければならないデータ、またはそのようなシステムのことを総称して指します。要は自分が計算した証を記録するためのシステム、またはそのデータのことです。ビットコイン等はこのシステムによりデータの改ざんを防ぎます。このPoWを実現するために使われているのがnonceという訳です。nonceが一体どのような働きをしているのでしょうか?ブロックチェーンにおけるnonceの働きnonceは言ってしまえば、単純にランダムな値のことです。ブロックチェーンにおいてハッシュ値を計算するためにこのランダムな値であるnonceを使用します。nonceが必要なのかは前回の記事では補えていないので、今回の記事で補填しておこうと思います。・タイムスタンプ・取引内容(任意のデータ)・前回のハッシュ値この4つのデータを引数に取ってSHA256で計算しました。ブロックチェーンではこれらに加えてコンピュータがランダムに計算した値であるnonceという値も引数にとってハッシュ値を生成します。ところで、ブロックチェーンにおけるハッシュ値はその最初の数字が0から始まることが決まっています(ビットコインでは少なくともそう)。頭が0から始まるようにハッシュ値を計算しているので、もし頭が0でなければブロックはハッシュ値をループで回し再計算する必要があります。・タイムスタンプ・取引内容(任意のデータ)・前回のハッシュ値は変更することができません。よってもう1つ、変更できる変数を用意する必要があります。それが「nonce(ノンス、ナンス)」なのです。ビットコイン・ブロックチェーン上では各ノードが各取引のハッシュ値を計算するためにnonceを繰り返し計算します。早くnonceを見つけたノードに対して報酬が支払われるシステムになっています。これがいわゆる「マイニング」の仕組みであり、すなわちマイニングとは「ハッシュ値を求めるためにnonceを計算すること」に他ならないのです。実際に簡単なnonceを実装してみる(ブロックにマイニング機能を付ける)まずはブロックにnonceを定義します。前回のコードからnonceを追加しておきましょう。初期値には0を代入しておきます。次に同じBlockクラス配下にマイニングをするためのmineBlock()関数を定義します。引数にdifficultyを取ったり、条件式を実装していたりしてわかりにくいと思いますが1行ずつ解説していきます。mineBlock(){}でmineBlock()関数を定義し、引数にdifficultyを定義します。このdifficultyはマイニングにおける難易度を定義するための引数です。マイニングの難易度とは、その名の通りマイニングにおける計算量を調整するために与えられた数値です。この数値が大きくなればなるほどマイニングの難易度は上がっていきます(つまり、ハッシュ値が計算しにくくなるということ。計算量が単純に増加するということ)。ここではマイニングの難易度があがるということを、ハッシュ値の頭から0が続く数が増加することと同値とします。ハッシュ値が「0」から始まるのと、ハッシュ値が「0000」から始まるのとでは後者の方が大きく難易度が上がることが理解できるかと思います。これが理解できれば関数内の1行目の処理は理解可能です。whileの条件式には「ハッシュ値の頭から0が何個続くか」を定義しており、それはdifficultyに依存しています。条件式がfalseな限り、nonceをインクリメントしながらハッシュ値を再計算していることが確認できるかと思います。ここではインクリメントをしていますが、実際にはランダムな値を計算してハッシュ値を求めている場合が多いです。whileを抜けると、ハッシュ値の計算に成功しているということなので、console.log()でその結果を出力しています。これで上記の関数の実装は終了なのですが、これだけではマイニングできません。いうのも前回のコードのままだったら、calculateHash()関数は同じハッシュ値を返してしまうからです。これを、nonceを導入することによってコードを変えていきましょう。difficultyもBlockchainクラスに定義しておきます。この数値は任意に設定しても大丈夫です。(ただし、あまり大きすぎるとマイニングするのに時間がかかるので適度に調整してください。今回は5で設定しています。)以上でnonceの実装は終了ですが、実行方法が前回と異なるので下の部分(addBlock()関数)もコードを変更しておいてください。以上が変更できたら、マイニングを実際に行うためのコードを追加します。最終行にこれを書いておきましょう。ブロック内容は任意に変更してもよいマイニングを実行するそれではスクリプトを実行してみましょう。mined...00000e3174091f725f9cdb57beaa4be3223f93d8b76af353034776ba457f7d1c上記のように表示されたらマイニングに成功しています。difficultyで設定した5が動作していることを確認してください。今回もGistでソースコードを公開しているのでこちらに埋め込んでおきましょう。うまく動作しない人はこちらのコードをコピペして実行してみてください。おわりに今回はPoWの概要と、PoWに使われているnonceの解説を行いました。ブロックチェーンではこのnonceによってハッシュ値が決定します。ビットコイン・ブロックチェーンではこのnonceの計算時間が均等になるように難易度が調整されており、nonceの発見者には報酬が与えられるといううまい仕組みで構成されています。このようにデータが改ざんされない、かつノードが積極的にブロックチェーン・ネットワークに参加できる仕組みを実装しているビットコインに導入されている技術にはやはり目をひかれる所がありますね...。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。RailsにMySQLを導入したらかなりハマった件について【ソースコードあり】JavaScriptでブロックチェーンを作ってみたRECOMMENDこちらの記事も人気です。JavaScript2018.10.2【ソースコードあり】JavaScriptでブロックチェーンを作ってみたJavaScript2019.1.12【JavaScript】axiosを使って、HTTP通信を簡単に操る。(TECH::CAMP)の無料説明会に行ったら衝撃の事実が発覚した件について【2019年最新】テックキャンプ(TECH::CAMP)の評判と料金、概要まとめ。実際の最新情報を解説します。