0
0

More than 1 year has passed since last update.

Web3.0検証(6)-Blockchainのプライベートネットワーク

Last updated at Posted at 2022-04-20
[前回] Web3.0検証(5)-Blockchainのプライベートネットワーク

はじめに

前回に続き、Gethを用いたBlockchainプライベートネットワークの構築です。

プライベートネットワークとは

自分自身で管理可能なネットワークで、中央集権的なP2Pシステムを構築可能。
ちょっとしたEthereum動作確認や分散型アプリケーショ(DApp)の開発に便利かも。

基本概念の理解

  • Genesisブロック

    • Blockchainにおける最初のブロック(Block番号0)のこと
  • Genesisファイル

    • Genesisブロックの情報を記述したjsonファイル
    • サンプル: TestGenesis.json
{
  "config": {
    "chainId": 1234,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0
  },
  "difficulty": "0x4000",
  "gasLimit": "0x8000000",
  "alloc": {}
}
  • Gethのデータディレクトリ

    • プライベートネットワークの各種データを格納
      • ブロック情報
      • ノード情報
    • 各種ログの出力先
  • Gethの実行方法

    • Genesisブロックの初期化
    • Gethを起動
  • Gethの起動モード

    • バックグラウンドモード
    • コンソール対話モード
      • トランザクションの生成などを対話的に進められる
      • consoleサブコマンドを指定し、コンソール立ち上げる
  • gethコマンドの各オプション

    • datadir
      • データディレクトリ、Genesisブロックの初期化で指定したディレクトリを指定
    • networkid
      • ネットワークID、Genesisブロックの初期化で指定したchainIdを指定
      • 任意の正の整数のIDを指定し、異なるネットワークを立ち上げることも可能
    • nodiscover
      • プライベートネットワークで未知のノードとの接続を避けるため、自動Peer探索機能を無効に
      • Gethはデフォルトで、自動的に同じネットワークIDのEthereumネットワークのノード(Peer)を探し接続を試みる

プライベートネットワークの構築開始

検証環境

前回と変わりません。

端末を開きます。

Genesisファイルを作成

ホームディレクトリ直下に作成します。

$ cd
$ mkdir eth_private_net
$ cd eth_private_net
$ vi TestGenesis.json
{
  "config": {
    "chainId": 1234,
    "homesteadBlock": 0,
    "eip150Block": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "byzantiumBlock": 0
  },
  "difficulty": "0x4000",
  "gasLimit": "0x8000000",
  "alloc": {}
}

データディレクトリを作成

$ cd
$ mkdir -p eth_private_net/data1

Genesisブロックの初期化

  • ブロックチェーン情報をGenesisファイルの内容で初期化
$ geth --datadir $HOME/eth_private_net/data1 init $HOME/eth_private_net/TestGenesis.json

データディレクトリにディレクトリが新しく作成され、
その中にGenesisブロックのブロックチェーン情報が保存される。

Gethを起動

networkidに、TestGenesis.jsonファイルのchainIdの値を指定。

$ geth --networkid 1234 --nodiscover --datadir $HOME/eth_private_net/data1 console 2>> $HOME/eth_private_net/data1/geth_error.log

Welcome to the Geth JavaScript console!

instance: Geth/v1.10.18-unstable-bb5633c5-20220417/linux-amd64/go1.18.1
at block: 0 (Thu Jan 01 1970 09:00:00 GMT+0900 (JST))
 datadir: /home/zhao/eth_private_net/data1
 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

To exit, press ctrl-d or type exit

コンソールが起動されました。
Gethプロンプトから、ブロック番号"0"を指定し、getBlockコマンド実行、
Genesisブロックの情報を表示します。

> eth.getBlock(0)
{
  difficulty: 16384,
  extraData: "0x",
  gasLimit: 134217728,
  gasUsed: 0,
  hash: "0xcbfef64b08ea63eeb3a1787dc5cacca4887b56791da5790d1a62f9ab0cafcbee",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0x0000000000000000000000000000000000000000",
  mixHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  nonce: "0x0000000000000000",
  number: 0,
  parentHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 507,
  stateRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  timestamp: 0,
  totalDifficulty: 16384,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

TestGenesis.jsonの指定とおり、プライベートネットワークのGenesisブロックが作成されています。
※ difficultyは10進表記に変換されている

Gethプロンプトを終了

> exit

Gethプロセスを停止

$ pkill geth

Gethをバックグラウンドで常時起動しておき、必要に応じてコンソール操作したい

  • gethコマンドでconsoleサブコマンドを指定せず、最後に"&"を指定しバックグラウンドで起動。
$ nohup geth --networkid 1234 --nodiscover --datadir $HOME/eth_private_net/data1 2>> $HOME/eth_private_net/data1/geth_error.log &
  • 起動済みGethプロセスに対し、コンソールを立ち上げる

ipcに、gethプロセスのデータディレクトリ配下に生成されたソケットファイルgeth.ipcを指定。

$ geth --datadir $HOME/eth_private_net/data1 attach ipc:$HOME/eth_private_net/data1/geth.ipc

これで、コンソール起動できました。

おわりに

Blockchainのプライベートネットワーク環境を構築できました。
といっても、ノード(Peer)一つのみでネットワークとは言えないですね。
次回は、複数ノードを立ち上げ、相互疎通を検証します。
お楽しみに。

[次回] Web3.0検証(7)-Blockchainのプライベートネットワーク
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0