簡単なブロックチェーンを作る

Blog Single

みなさん、こんにちは。

最近雨が多いですね、渋谷です。
今回はタイトルの通り、簡単なブロックチェーンを作つくろうと思います。pythonやC++など様々な言語で実装可能ですが、この記事ではNode.jsで実装していきます。

ブロックチェーンとは

1)「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ。」
2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
出典 : 「ブロックチェーンの定義」を公開しました

難しいですね…。
とてもとても簡単に言うと、誰でも閲覧できるデータを記録しておく改ざん不可能な分散型台帳です。
改ざんが不可能と言われている理由は、新しく作られるブロック(台帳)が1つ前のブロックのハッシュ値を持っているからです。1つのブロックを改ざんすると、「1つ前のブロックのハッシュ値を持っている」というブロックチェーンの特徴から、それ以降のブロック全てに修正を加えなければ辻褄が合わなくなってしまいます。

実装

早速実装していきます。

実装環境

$ node -v
v8.0.0

準備

block_chainディレクトリを作成し、その下にindex.jsを作成します。

$ mkdir block_chain
$ cd block_chain
$ touch index.js

node.jsで開発を始める為に、下記コマンドを実行します。

$ npm init -y

ブロックをハッシュ化するためのsha256ライブラリをインストールします。

$ npm i sha256

以上で準備は完了です。実際にindex.jsにコーディングしてみましょう。

コーディング

const sha256 = require('sha256');

// 1つ1つのBlock
class Block {
  constructor(index, timestamp, data, prevHash) {
    this.index = index;
    this.timestamp = timestamp;
    this.data = data;
    this.prevHash = prevHash;
    this.thisHash = sha256(
      this.index + this.timestamp + this.data + this.prevHash
    );
  }
}

// ジェネシス(最初の)ブロック
// ジェネシスブロックは前回のハッシュ(prevHash)がないため、独自の処理を入れて実装する必要がある
const createGenesisBlock = () => new Block(0, Date.now(), 'Genesis Block', '0');

// ブロック生成
const nextBlock = (lastBlock, data) =>
  new Block(lastBlock.index + 1, Date.now(), data, lastBlock.thisHash);

// ブロックチェーンを作成
const createBlockchain = num => {
  const blockchain = [createGenesisBlock()];
  let previousBlock = blockchain[0];

  for (let i = 1; i < num; i += 1) {
    const blockToAdd = nextBlock(previousBlock, `This is block #${i}`);
    blockchain.push(blockToAdd);
    previousBlock = blockToAdd;
  }
  console.log(blockchain);
};

// ジェネシスブロックを含めた20個のブロックを作成する
const lengthToCreate = 20;
createBlockchain(lengthToCreate);

実行結果

$ node index.js

[ Block {
    index: 0,
    timestamp: 1538018740838,
    data: 'Genesis Block',
    prevHash: '0',
    thisHash: 'a7b9592ee2758bedba09ac01b39d1b5bc341c068724f7ef7bc1a244d14576e9e' },
  Block {
    index: 1,
    timestamp: 1538018740840,
    data: 'This is block #1',
    prevHash: 'a7b9592ee2758bedba09ac01b39d1b5bc341c068724f7ef7bc1a244d14576e9e',
    thisHash: 'f7072cdcfa3251b5f15dfdfceda801b63f4409c1af31bb5885d0a1ed62e5c9fc' },
  Block {
    index: 2,
    timestamp: 1538018740840,
    data: 'This is block #2',
    prevHash: 'f7072cdcfa3251b5f15dfdfceda801b63f4409c1af31bb5885d0a1ed62e5c9fc',
    thisHash: '66aefc36b4d9d953668354454d84b687a019513883cb5aae6aa9890c6e8dfbc5' },
  Block {
    index: 3,
    timestamp: 1538018740840,
    data: 'This is block #3',
    prevHash: '66aefc36b4d9d953668354454d84b687a019513883cb5aae6aa9890c6e8dfbc5',
    thisHash: '94cb8d1debe0cff880c5ebaeeeaf7aeb23fca47ed45d2c76a3fb4beb45bfb265' },
  Block {
    index: 4,
    timestamp: 1538018740840,
    data: 'This is block #4',
    prevHash: '94cb8d1debe0cff880c5ebaeeeaf7aeb23fca47ed45d2c76a3fb4beb45bfb265',
    thisHash: '5243d318a3de4b2305037b7e011c18f9b2449f64bbd34a194e9acd04f2060299' },

--省略--

  Block {
    index: 18,
    timestamp: 1538018740840,
    data: 'This is block #18',
    prevHash: '2098276d8c9884a39840f7b282e5a479d07b75bc72ae90c3ea200d0e21c6d0cf',
    thisHash: '6dacfc623898ed716291e0c9b2ac82855368bd05f5f33809479e563b1d38d5ef' },
  Block {
    index: 19,
    timestamp: 1538018740840,
    data: 'This is block #19',
    prevHash: '6dacfc623898ed716291e0c9b2ac82855368bd05f5f33809479e563b1d38d5ef',
    thisHash: 'bbddcf28fd4035e651690cf4145fb0b4052d40dd2dae2ce220de0db68b7c6d04' } ]

まとめ

仮想通貨でブロックチェーンの技術が騒がれている中で、ブロックチェーンがどのようなものなのかイメージできていない人でも、実際に自分で簡単なブロックチェーンを作ることで理解を深める事ができると思います。
これを見て少しでも興味を持った人は、自分の好きな言語で作ってみてください。

参考

Understanding and building your own tiny blockchain in JavaScript
ブロックチェーンが改ざんできない仕組み

Posted by ShibuyaYuuki
今はPHPで開発を行なっているエンジニア。 就職してから体重が15キロ増えました!!

Other Posts: