【NEO 開発】NEOのプライベートネットワークをDockerで構築してみよう!

Words
227
Reading
2 min
Listen
Play
8y

neo-logo.png

NEOはDBFTというコンセンサスアルゴリズムによって動作するブロックチェーンプラットフォームです。
投票者が投票したBookkeeper(ブロック生成者)がブロックを生成します。

https://medium.com/@masahiro.sasaki/dbft-%E6%B0%91%E4%B8%BB%E7%9A%84%E3%81%AA%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%B3%E3%82%B5%E3%82%B9%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0-5c36b80cac2b

NEOプライベートチェーンをデプロイするには、コンセンサスに達するために少なくとも4つのサーバが必要になってきます。
しかし、開発用にサーバーを四台借りるとなるとかなりのコストが発生します。
そこで今回はDockerを利用して、一つのサーバー上に4つのノードをたてることでプライベートチェーンを構築してみようと思います。

動作環境:Ubuntu 16.04
※docker上に環境を作るので関係ないはずです。

■目次

・docker インストール
・neo コンテナの起動
・neoコンテナに必要なパッケージをインストール
・プライベートネットワークを起動

・docker インストール

$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce

・neo コンテナの起動

dockerに必要なリポジトリをcloneしてきましょう。

$ git clone https://github.com/CityOfZion/neo-privatenet-docker.git
$ cd neo-privatenet-docker

以下のコマンドを順番に実行するとneoのコンテナが立ち上がっているはずです。
少し時間がかかるので気長に待ってください。

$ ./docker_build.sh
$ ./docker_run_and_create_wallet.sh

終わったようですね!
ではコンテナが立ち上がっているかどうか確認してみましょう。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                  NAMES
6f7ed0d4ae3a        neo-privnet         "/bin/bash /opt/pr..."   2 hours ago         Up 2 hours          0.0.0.0:20333-20336->20333-20336/tcp   neo-privnet

では次にneoコンテナの中に入ります。

$ docker exec -it neo-privnet bash

* Consensus nodes are running in screen sessions, check 'screen -ls'
* neo-python is installed in /neo-python, with a neo-privnet.wallet file in place
* You can use the alias 'neopy' in the shell to start neo-python's prompt.py with privnet settings
* Please report issues to https://github.com/CityOfZion/neo-privatenet-docker

無事は入れたようです!

・neoコンテナに必要なパッケージをインストール

まずは必要なものをいれていきます。

//更新
root@neo-privnet:/neo-python# apt-get update

//nodeをたちあげるために必要なものを入れる。
apt-get install software-properties-common python-software-properties
add-apt-repository ppa:deadsnakes/ppa
apt-get update
apt-get install python3.6 python3.6-dev python3.6-venv python3-pip libleveldb-dev libssl-dev g++
root@neo-privnet:/neo-python# alias python=python3

//pythonとpipの設定エイリアス
root@neo-privnet:/neo-python# alias pip=pip3

//仮想環境を作成して有効にする
root@neo-privnet:/neo-python# python -m venv venv
root@neo-privnet:/neo-python# source venv/bin/activate

//パッケージを編集可能な形式でインストールする
(venv) root@neo-privnet:/neo-python# pip install -e .

これで準備は整いました!!!

・プライベートネットワークを起動

prompt.pyというファイルからネットワークを起動する必要があります。
なのでまずは探してみましょう。

(venv) root@neo-privnet:/# find | grep prompt.py
./usr/local/lib/python3.6/dist-packages/prompt_toolkit/shortcuts/prompt.py
./root/.neopython/.prompt.py.history
./neo-python/neo/bin/prompt.py
./neo-python/venv/lib/python3.6/site-packages/prompt_toolkit/shortcuts/prompt.py

下から二番目の場所っぽいので移動します。

(venv) root@neo-privnet:/neo-python/neo/bin# ll
total 88
drwxr-xr-x 2 root root  4096 Aug 21 01:20 ./
drwxr-xr-x 1 root root  4096 Aug 22 15:22 ../
-rw-r--r-- 1 root root     0 Aug 21 01:20 __init__.py
-rwxr-xr-x 1 root root 10551 Aug 21 01:20 api_server.py*
-rw-r--r-- 1 root root  1901 Aug 21 01:20 bootstrap.py
-rw-r--r-- 1 root root  2604 Aug 21 01:20 export_blocks.py
-rw-r--r-- 1 root root  3805 Aug 21 01:20 import_blocks.py
-rwxr-xr-x 1 root root 45285 Aug 21 01:20 prompt.py*
-rw-r--r-- 1 root root  3022 Aug 21 01:20 reencrypt_wallet.py
-rw-r--r-- 1 root root  3373 Aug 21 01:20 sign_message.py

ではプライベートネットワークを起動してみましょう!!
// -m メインネット
// -p privatenet
//指定なしだとテストネット。

(venv) root@neo-privnet:/neo-python# np-prompt -p
[I 180821 04:59:54 LevelDBBlockchain:115] Created Blockchain DB at /root/.neopython/Chains/SC234 
[I 180821 04:59:54 NotificationDB:73] Created Notification DB At /root/.neopython/Chains/Test_Notif 
NEO cli. Type 'help' to get started

Screenshot from 2018-08-23 21-55-01.png

blockを取得してみましょう!

//blockの取得
neo> block 1                                                                                                                                                                                                                                                                                          
{
    "hash": "0x0012f8566567a9d7ddf25acb5cf98286c9703297de675d01ba73fbfe6bcb841c",
    "size": 686,
    "version": 0,
    "previousblockhash": "0xb3181718ef6167105b70920e4a8fbbd0a0a56aacf460d70e10ba6fa1668f1fef",
    "merkleroot": "0x8e3a32ba3a7e8bdb0ad9a2ad064713e45bd20eb0dab0d2e77df5b5ce985276d0",
    "time": 1494400282,
    "index": 1,
    "nonce": "afbd1492287a1fd1",
    "nextconsensus": "AdyQbbn6ENjqWDa5JNYMwN3ikNcA4JeZdk",
    "script": {
        "invocation": "40884037dd265cb5f5a54802f53c2c8593b31d5b8a9c0bad4c7e366b153d878989d168080ac36b930036a9eb966b48c70bb41792e698fa021116f27c09643563b840e83ab14404d964a91dbac45f5460e88ad57196b1779478e3475334af8c1b49cd9f0213257895c60b5b92a4800eb32d785cbb39ae1f022528943909fd37deba63403677848bf98cc9dbd8fbfd7f2e4f34471866ea82ca6bffbf0f778b6931483700c17829b4bd066eb04983d3aac0bd46b9c8d03a73a8e714d3119de93cd9522e314054d16853b22014190063f77d9edf6fbccefcf71fffd1234f688823b4e429ae5fa639d0a664c842fbdfcb4d6e21f39d81c23563b92cffa09696d93c95bc4893a6401a43071d00d3e854f7f1f321afa7d5301d36f2195dc1e2643463f34ae637d2b02ae0eb11d4256c507a4f8304cea6396a7fce640f50acb301c2f6336d27717e84",
        "verification": "55210209e7fd41dfb5c2f8dc72eb30358ac100ea8c72da18847befe06eade68cebfcb9210327da12b5c40200e9f65569476bbff2218da4f32548ff43b6387ec1416a231ee821034ff5ceeac41acf22cd5ed2da17a6df4dd8358fcb2bfb1a43208ad0feaab2746b21026ce35b29147ad09e4afe4ec4a7319095f08198fa8babbe3c56e970b143528d2221038dddc06ce687677a53d54f096d2591ba2302068cf123c1f2d75c2dddc542557921039dafd8571a641058ccc832c5e2111ea39b09c0bde36050914384f7a48bce9bf92102d02b1873a0863cd042cc717da31cea0d7cf9db32b74d4c72c01b0011503e2e2257ae"
    },
    "tx": [
        {
            "txid": "0x8e3a32ba3a7e8bdb0ad9a2ad064713e45bd20eb0dab0d2e77df5b5ce985276d0",
            "size": 10,
            "type": "MinerTransaction",
            "version": 0,
            "attributes": [],
            "vout": [],
            "vin": [],
            "sys_fee": "0",
            "net_fee": "0",
            "scripts": [],
            "nonce": 679092177
        }
    ]
}

Screenshot from 2018-08-23 21-57-30.png

・おまけ

ポートを見てみると4つ使用されていることがわかります。
おそらくこいつらがブロックの生成してるはずです!

(venv) root@neo-privnet:/neo-python/neo/bin# lsof -i
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dotnet   15 root  103u  IPv4 190687      0t0  TCP *:20333 (LISTEN)
dotnet   15 root  125u  IPv4 189187      0t0  TCP localhost:20333->localhost:47545 (ESTABLISHED)
dotnet   15 root  130u  IPv4 189199      0t0  TCP localhost:20333->localhost:50254 (ESTABLISHED)
dotnet   15 root  140u  IPv4 189209      0t0  TCP localhost:20333->localhost:58899 (ESTABLISHED)
dotnet   15 root  152u  IPv4 189220      0t0  TCP *:30333 (LISTEN)
dotnet   15 root  154u  IPv6 189235      0t0  TCP *:10333 (LISTEN)
dotnet   27 root   97u  IPv4 190692      0t0  TCP *:20334 (LISTEN)
dotnet   27 root   98u  IPv4 190695      0t0  TCP localhost:47545->localhost:20333 (ESTABLISHED)
dotnet   27 root  116u  IPv4 189798      0t0  TCP localhost:20334->localhost:55485 (ESTABLISHED)
dotnet   27 root  135u  IPv4 189816      0t0  TCP localhost:20334->localhost:34553 (ESTABLISHED)
dotnet   27 root  152u  IPv4 189831      0t0  TCP *:30334 (LISTEN)
dotnet   27 root  154u  IPv6 189832      0t0  TCP *:10334 (LISTEN)
dotnet   40 root  104u  IPv4 190706      0t0  TCP *:20335 (LISTEN)
dotnet   40 root  115u  IPv4 189794      0t0  TCP localhost:50254->localhost:20333 (ESTABLISHED)
dotnet   40 root  118u  IPv4 189797      0t0  TCP localhost:55485->localhost:20334 (ESTABLISHED)
dotnet   40 root  130u  IPv4 189817      0t0  TCP localhost:20335->localhost:46526 (ESTABLISHED)
dotnet   40 root  153u  IPv4 189227      0t0  TCP *:30335 (LISTEN)
dotnet   40 root  154u  IPv6 189228      0t0  TCP *:10335 (LISTEN)
dotnet   54 root  110u  IPv4 190754      0t0  TCP *:20336 (LISTEN)
dotnet   54 root  112u  IPv4 190757      0t0  TCP localhost:58899->localhost:20333 (ESTABLISHED)
dotnet   54 root  119u  IPv4 190761      0t0  TCP localhost:34553->localhost:20334 (ESTABLISHED)
dotnet   54 root  121u  IPv4 190762      0t0  TCP localhost:46526->localhost:20335 (ESTABLISHED)
dotnet   54 root  152u  IPv4 190783      0t0  TCP *:30336 (LISTEN)
dotnet   54 root  154u  IPv6 190784      0t0  TCP *:10336 (LISTEN)

これで記事は終わりです。

Twitterやっています。よかったらフォローお願いします!
https://twitter.com/yamamotodaa

参考:
https://medium.com/proof-of-working/how-to-run-a-private-network-of-the-neo-blockchain-d83004557359
https://github.com/CityOfZion/neo-python#getting-started

【NEO 開発】NEOのプライベートネットワークをDockerで構築してみよう! | Ecency