プライベートネットワークでイーサリアムを採掘してみた

Etherreum入門を参考しています。
素晴らしいサイトです。

簡単に手元でイーサリアムを採掘してみようと思います。
ターミナルだけで可能です。

Gethのインストール

Gethをインストールすることで、Ethereumネットワークにフル・ノードとして参加できるようになります。
macの場合はからbrewでインストールできます。

$ brew tap ethereum/ethereum
$ brew install ethereum
$ geth --help

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

プライベート・ネットワーク:一つの組織のみに管理されたノードのみが参加することが可能なネットワークです。ネットワークは自身の管理下に置くことが可能になり、中央集権的なP2Pシステムが可能になります。

Gethファイルを作成する

プライベートネットでやるため、独自のGenesisファイルを準備します。

mkdir /path/to/eth_private_net
cd /path/to/eth_private_net
touch myGenesis.json

myGenesis.jsonに以下の内容を記述します。

{
  "config": {
    "chainId": 15
  },
  "nonce": "0x0000000000000042",
  "timestamp": "0x0",
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "extraData": "",
  "gasLimit": "0x8000000",
  "difficulty": "0x4000",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "coinbase": "0x3333333333333333333333333333333333333333",
  "alloc": {}
}

Gethをプライベート・ネットで起動する

ここでプライベート・ネットワークは、自分自身のみのネットワークなので容易にEtherの採掘が可能ですし、安全性も高いネットワークです。

採掘はテストネットのEtherが対象となります。
テストネットで採掘したEtherはテストネット内でのみ使用可能です。

> // gethの初期化
$ geth --datadir /path/to/eth_private_net/myGenesis.json init /path/to/eth_private_net
> // gethを起動
geth --networkid "15" --nodiscover --datadir "/path/to/eth_private_net" console 2>> /path/to/eth_private_net/geth_err.log

consoleを起動してみましょう。

# consoleの起動
$ geth console
> 

Etherを採掘する

> // EOA(Externally Owned Account)の表示
> eth.accounts
[ ]

> // EOAの作成
> personal.newAccount("hogehoge01")
'0x24afe6c0c64821349bc1bfa73110512b33fa18e1'

>eth.accounts
['0x24afe6c0c64821349bc1bfa73110512b33fa18e1']

> // もう一つEOAを作成
> personal.newAccount("hogehoge02")
'0x59c444d6c4f4187d1dd1875ad74a558a2a3e20b6'

> eth.accounts
['0x24afe6c0c64821349bc1bfa73110512b33fa18e1', '0x59c444d6c4f4187d1dd1875ad74a558a2a3e20b6' ]

etherbaseを表示します。
etherbaseとはcoinbaseとも呼ばれ、各ノードで採掘を行う際に報酬を紐づけるEOAのアドレスです。

> eth.coinbase
'0x24afe6c0c64821349bc1bfa73110512b33fa18e1'

etherbaseがセットされていたら、採掘が可能です。

# 採掘開始
> miner.start()
null

> // 採掘停止
> miner.stop()
true

> // ブロックチェーンに何番目のブロックまで連なっているのか(=ブロック高)を確認する
> eth.blockNumber
145

ちゃんとマイニングされているか確認してみましょう。

> // 実際にマイニングされているか確認する
> eth.mining
true

> // ブロック高が100のブロックの情報を表示。
> // 100は任意の番号です。
> eth.getBlock(100)
{
  difficulty: '137447',
  extraData: '0x476574682f76312e302e312f6c696e75782f676f312e342e32',
  gasLimit: 3141592,
  gasUsed: 0,
  hash: '0x4d3063b91cbaa12bf2de81014c1319febc9f197c93f81b0746afaffaa9496620',
  logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
  miner: '0x24afe6c0c64821349bc1bfa73110512b33fa18e1',
  nonce: '0x28fda83cb19ed497',
  number: 100,
  parentHash: '0x5885cdec1d1410580eaaf1fb7ef9db245a735822d48e816c73d926b7c9872f15',
  sha3Uncles: '0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347',
  size: 536,
  stateRoot: '0xacf2c3dfc512373ae6d9693207b3ac43fd4811791fec994c2eecd8fdd3333699',
  timestamp: 1439451765,
  totalDifficulty: '13551548',
  transactions: [ ],
  transactionsRoot: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421',
  uncles: [ ]
}

マイニングで取得した報酬を確認してみましょう。

> //作成したアカウントのアドレスを再確認
> eth.accounts
['0x24afe6c0c64821349bc1bfa73110512b33fa18e1', '0x59c444d6c4f4187d1dd1875ad74a558a2a3e20b6' ]

> //etherbaseは0番目のアカウントに紐づいている。
> eth.coinbase == eth.accounts[0] 
true

> eth.getBalance(eth.accounts[0])
'51500000000000000000'

> eth.getBalance(eth.accounts[1])
'0'

// eth.getBalance(address)は「wei」の単位なのでetherの単位で表示。
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
'515'

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です