MENU
コラム

Go Ethereumで遊ぶ(1) 〜Genesisブロックの作成〜

Go Ethereum

Go EthereumとはGo言語で実装されたEthereumのクライアントです。Gethという略称が使われているようですね。これを使ってプライベートなネットワークでEthereumに触れてみようと思います。

Go Ethereumのgithub

この記事はMacを利用して書いたので、Windowsの場合は適宜読み替えてください。

インストール

インストール方法は公式のここを参考にしてください。

Windows

https://geth.ethereum.org/downloads/ からWindows版のダウンロードが可能なようです。
2018年12月15日の段階では、Geth 1.8.20 for Windowsと書かれた部分をクリックするとダウンロードが開始されます。

Mac

公式ではHomebrewを使ったインストールがおすすめされています。
Homebrewをインストールしていない場合は、こちらの公式ページへ飛んでトップページに書かれたコードをターミナルにコピペして実行すればインストールされるはずです。

ということで、

$ brew tap ethereum/ethereum
$ brew install ethereum

すぐにインストールされました。

Genesis Blockの作成

Genesisブロックとは、その名の通りブロックチェーンの始まりのブロックです。このブロックを起点にチェーンが繋がっていくのでこれから作成しようと思います。
まずはGenesisブロック生成の際に利用するjsonファイルを作成します。
公式を参考にして、

{
  "config": {
        "chainId": 5,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
  "alloc"      : {},
  "coinbase"   : "0x0000000000000000000000000000000000000000",
  "difficulty" : "0x200",
  "extraData"  : "",
  "gasLimit"   : "0x2fefd8",
  "nonce"      : "0x0000000000000015",
  "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
  "timestamp"  : "0x00"
}

みたいにします。今回は、nonceフィールドを書き換え、chainIDも変更しました。difficultyを低く設定しようと思ったので、そこも変更しました。
また、上の例では空になっているallocフィールドで指定したアカウントの残高を増やしておくこともできるそうです。

それっぽいフォルダを作ってから作成したjsonファイルを利用して初期化します。

$ mkdir -p Geth/private_net
$ cd Geth/private_net
$ geth --datadir ~/Geth/private_net/ init ~/Geth/private_net/genesis.json

Successfully wrote genesis state の表示があれば初期化は成功しています。
早速GethのコンソールからGenesisブロックを確認してみたいと思います。まずはコンソールの起動から。

$ geth --networkid "5" --nodiscover --datadir ~/Geth/private_net console 2>> ~/Geth/private_net/geth_error.log

Welcome to the Geth JavaScript console! と始まり、コンソールが入力待ち状態になったら下記のコマンドでGenesisブロックを確認してみます。

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

できていますね。

> exit

でコンソールから抜けられます。
次回はマイニングを開始してみようと思います。