【ソースコードあり】JavaScriptでブロックチェーンを作ってみた

以前、記事で「MacOSにbitcoin-cliを導入する」という記事を執筆しました。それとは全く連動していないのですが、簡単にブロックチェーンを理解するために今回は実際にコードを書き、ブロックチェーンを生成していきたいと思います。

ブロックチェーンを擬似的に生成するのは案外簡単で、様々な言語で実装が可能です。今回はJavaScriptを使って生成していこうと思います。余力のある人は他の言語で実装してみても面白いかもしれません。

スポンサードリンク

まずは必要なライブラリを読み込む

ブロックチェーンを実装するにあたって最も重要な関数が「ハッシュ関数」です。JavaScriptでは、デフォルトで適切なSHA-256ハッシュ関数を持っていないので、外部ライブラリからハッシュ関数を提供してくれるモジュールをrequireで読み込んでおきます。main.js(ファイル名はなんでも良い)の一行目にこのコードを記述しておいてください。

const SHA256 = require("crypto-js/sha256");

ブロックを実装する

ではここからブロックを生成するためのコードを実際に記述していきましょう。ブロックとは取引の内容(特定のデータ)やタイムスタンプ、前回のブロックのハッシュ値やそれらを統合して計算された新たなハッシュ値等を持ったデータの塊(トランザクション)の事です。ブロックチェーンは、これらのブロックが連なって連結することで膨大な計算量が必要なデータの改ざんを理論的に防いでいます。

JavaScriptではES6からclass構文が追加されたため、以前よりも直感的に記述できるかと思います。今回はES6の記述方法で解説していきます。

まず、ブロックに必要なものを確認しておきましょう、今回の例ではブロックに保有する情報は以下のように定義します。

・ブロック番号

・前回のブロックのハッシュ値

・ブロック生成時刻(タイムスタンプ)

・取引データ

・このブロックのハッシュ値

上のようにブロックclassを定義し、そのコンストラクタにそれぞれの値を代入するようにを記述してください。ただし、このブロック自体のハッシュ値については calculateHash() 関数を用意します。

requireで読み込んだモジュールからSHA256関数を用いてハッシュ値を計算します。SH256関数は中の引数を元にハッシュ値を計算します。ここでのポイントはトランザクションの全ての内容を引数に取っていることです。すなわちこのうち一つでもデータが改ざんされるとそのブロックのハッシュ値自体が変更されてしまうので、データが改ざんされたのがすぐにわかります。

ブロックチェーンを実装する

ブロックの実装が終わったので次にブロックチェーンの実装に入ります。ブロックチェーンはブロックが連なった1つの鎖状のデータ構造のことを指します。今回はこのブロックをそれぞれ配列の要素にしてブロックチェーンを実装します。

Blockchainクラスを定義します。そしてそのコンストラクタにチェーンオブジェクト(配列)を定義しましょう。ブロックチェーンではそれぞれのブロックが時系列順にどんどん配列にスタックされていきますが、最初のブロックのことを特別に「ジェネシスブロック(Genesis Block)」と言います。ジェネシスブロックはpreviousHashが「0000」として定義されている特別なブロックです。一番最初のブロックなので、コンストラクタ内のchain配列内に関数を通してジェネシスブロックを入れておきましょう。

次に、createGenesisBlock()関数を定義しましょう。

Blockクラスからジェネシスブロックインスタンスを生成します。ジェネシスブロックのトランザクション引数には好きな値を入れていただいて構いません。ただし、previousHashのみ0にすることを忘れないようにしましょう。(0にしなくてもブロックチェーンは動作しますが、ジェネシスブロックの作法的な観点で0にしておくことを推奨します。)

次に、ブロックをチェーンに追加する関数 addBlock() を定義していきます。

ブロックを追加するためには、引数に新しいブロックのインスタンスをとり、そのインスタンスからpreviousHashやhashに適切な値を代入します。概要は上のコードをみてもらった通り、前回のブロック(最も新しいブロックという意味からgetLatestBlock()関数を定義して、そこからハッシュ値をとってきています。)のハッシュを取ってきたものをpreviousHashとし、今回引数に取ってきたブロックのハッシュ値を計算してhashに代入しています。

最後に、このブロックのインスタンスをチェーンに連結(push)してこの関数の実装は終了です。

実際に動かしてみる

以上がブロックとブロックチェーンの実装です。案外簡単じゃないですか?仕組みを理解したら他の言語でもサクッと書けそうです。では、実際にブロックチェーンがどう動作するのか確かめてみましょう。

まずは同ファイルの中に以下の記述を定義して、ブロックを追加します。ブロックを追加したらconsole.logでそのブロックチェーンを確認してみましょう。

全ての準備ができたら、ターミナルを開いて、nodeでスクリプトを実行しましょう!

$ node main.js

このような結果が帰ってきたらブロックチェーンの実装に成功しています。

{
  "chain": [
    {
      "index": 0,
      "previousHash": "0",
      "timestamp": "01/01/2017",
      "data": "Genesis block",
      "hash": "4373c7fb1437035365d9228c77eca2cfd240523e274163e78c1eba11effd8b38"
    },
    {
      "index": 1,
      "previousHash": "4373c7fb1437035365d9228c77eca2cfd240523e274163e78c1eba11effd8b38",
      "timestamp": "10/01/2018",
      "data": {
        "amount": 4
      },
      "hash": "631f931d9bfbd778c065be9547ba878cf2648ea97cca4dd0a746d53712c903bb"
    },
    {
      "index": 2,
      "previousHash": "631f931d9bfbd778c065be9547ba878cf2648ea97cca4dd0a746d53712c903bb",
      "timestamp": "12/01/2018",
      "data": {
        "amount": 50
      },
      "hash": "c03f57a04e645b5308363b4b22f7ea3e9fdfab5415bd7c43c7c5fbd09abb04ee"
    },
    {
      "index": 3,
      "previousHash": "c03f57a04e645b5308363b4b22f7ea3e9fdfab5415bd7c43c7c5fbd09abb04ee",
      "timestamp": "13/01/2018",
      "data": {
        "amount": 90
      },
      "hash": "3298461bbee6a77663ced502f275c7534ebe07b56f031010dbd9827ffb4a82c5"
    }
  ]
}

 

見ていただいたらわかる通り、綺麗なブロックチェーンの実装結果が出力されています!チェーンになっていることを確認するには、現在のブロックのpreviousHash値が、前回のブロックのHash値と一致していたらOKです!

ブロックチェーンが正しいかどうかを検証する(おまけ)

ブロックチェーンが正しいかどうかを調べるために isChainValid() 関数を定義しておきます。

Blockchainクラス内の関数として定義しておきましょう。すると、このようにしてデータの改ざんが検出可能です。

console.log('Blockchain valid? ' + coin.isChainValid());
coin.chain[1].data = { amount: 100 };
console.log('Blockchain valid? ' + coin.isChainValid());

>>true
>>false

ソースコード全容

ソースコード全体です。Gistにて公開していますのでこちらに埋め込みで表示させておきましょう。エラーが出る方はこちらをコピペして動きを確認してみてください。

おわりに

今回はJavaScriptで基本的なブロックチェーンの実装をしてみました。コードを書くとブロックチェーンとはどういうものなのかが明確に理解できるので、一度コードを書いてみることをおすすめします。JavaScriptでなくても、他にも色々な言語でかけるので自分の得意な言語で是非やってみると良いかもしれません。

ビットコインとブロックチェーンについて基礎をしっかり知っておきたい!という方にはこの書籍がおすすめです。

 

スポンサードリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です