node.js初心者が200行ブロックチェーンを試す

  • 投稿日:
  • 更新日:2018/05/19
  • by
  • カテゴリ:

Blockchainの動きを見るのに、A blockchain in 200 lines of code (邦訳)を参考にしています。

コードはnode.jsで書かれているのですが、私は今までサーバサイドJavaScriptを使ったことがなかったので、これを機にインストールしてみました。

今回は物理的に2台のMacを使いました。

なお、ブロックチェーン自体の説明は上記の記事を参照ください。

Node.jsのインストール

Node.jsは公式ページからのものと、Macの場合はHomebrewからnodebrewをインストールする方法があるようですが、今回は公式ページからpkgをインストールしました。

nodejs.png

node.js (画像クリックでダウンロードページへ)

2台のコンピュータにnode.jsをダウンロード、インストールします。

ブロックチェーンを動作させる

2台のマシンにGitHubの200行ブロックチェーンからソースをダウンロードします。

(2台のマシンで実行)
$ git clone https://github.com/lhartikk/naivechain
$ cd nativechain

必要パッケージファイルをインストールします。

package.jsonが既に含まれているので、以下のコマンドで勝手にダウンロード、インストールされます。

(2台のマシンで実行)
$ npm install

あとはそれぞれのマシンでmain.jsを起動します。

(2台のマシンで実行)
$ node main.js
listening websocket p2p port on: 6001
Listening http on port: 3001

1台目のサーバに2台目のサーバを追加します。curlコマンドはクライアントの実行なので、どのマシンから実行しても構いません。

(任意のマシンで実行)
$ curl -X POST -H "Content-type: application/json" -d '{"peer":"http://(2台目のアドレス):6001"}' http://(1台目のアドレス):3001/addPeer

両方のコンソールに以下が表示されます。

Received message{"type":0}
Received message{"type":2,"data":"[{\"index\":0,\"previousHash\":\"0\",\"timestamp\":1465154705,\"data\":\"my genesis block!!\",\"hash\":\"816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7\"}]"}
received blockchain is not longer than current blockchain. Do nothing

この時点で1台目、2台目とも同じブロックチェーンが共有されています。

ブロックの追加

1台目のサーバに対して、新しいブロックを追加してみます。新しいブロックには"added block"というデータを入れます(下のコマンドの下線部分)。

(任意のマシンで実行)
$ curl -X POST -H "Content-type: application/json" -d '{"data":"added block"}' http://(1台目のアドレス):3001/mineBlock

1台目のコンソールには以下が表示されます。

block added: {"index":1,"previousHash":"816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7","timestamp":1526182353.791,"data":"added block","hash":"5fc38357e99c1171920df583eb5c0b3ed09691569fe508374e1a77141ffe490f"}
Received message{"type":2,"data":"[{\"index\":1,\"previousHash\":\"816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7\",\"timestamp\":1526182353.791,\"data\":\"added block\",\"hash\":\"5fc38357e99c1171920df583eb5c0b3ed09691569fe508374e1a77141ffe490f\"}]"}
received blockchain is not longer than current blockchain. Do nothing

2台目のコンソールには以下が表示されます。

Received message{"type":2,"data":"[{\"index\":1,\"previousHash\":\"816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7\",\"timestamp\":1526182353.791,\"data\":\"added block\",\"hash\":\"5fc38357e99c1171920df583eb5c0b3ed09691569fe508374e1a77141ffe490f\"}]"}
blockchain possibly behind. We got: 0 Peer got: 1
We can append the received block to our chain

ブロックの同期時に2台目は1台目よりブロックチェーンが短かったので、新しいブロックをチェーンに追加しているのがわかります。

2台目のマシンのブロックを表示してみます。

(任意のマシンで実行)
$ curl http://(2台目のアドレス):3001/blocks | jq
[
{
"index": 0,
"previousHash": "0",
"timestamp": 1465154705,
"data": "my genesis block!!",
"hash": "816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7"
},
{
"index": 1,
"previousHash": "816534932c2b7154836da6afc367695e6337db8a921823784c14378abed4f7d7",
"timestamp": 1526182554.948,
"data": "added block",
"hash": "4feea70d5e366ff114cd9f0f45d10f028cbeccf0111a97c8bdeafda2f057a0a9"
}
]

上記は見やすいようにjqコマンドで空白や改行を追加しています。jqコマンドはbrewでインストールできますが、なければ省略しても構いません。

ちゃんとindex=0およびindex=1の2つのブロックが追加されているのがわかります。

あとはブロックのデータを用意すれば、複数マシン間で同期を取る実験が簡単にできそうです。

こちらもよく読まれています