Ethereum [etherの採掘]


環境構築していない方

Ethereum [Solidity 開発環境準備]
Ethereum [プライベートネットワークに接続する]

アカウントの作成

Gethのコンソール上で新規のアカウントを作成します。EthereumにはEOAContractの2種類のアカウントが存在します。
詳しく知りたい方はこちらをご覧ください

ここでは、EOAを新規に作成していきます。
コンソールを立ち上げてください。

$ geth --networkid "15" --nodiscover --datadir "eth_private_net" console 2>> ./geth_err.log

まず、このノードに登録されたアカウント(EOA)を表示させてみましょう。eth.accountsコマンドはこのノード内で作成されたEOAのリストを表示するものです。現時点ではアカウントを作成していないため、下記のように実行しても空のリストが表示されるのみです。


> eth.accounts
[]

EOAの作成はpersonal.newAccount("passwd")コマンドで行います。ここでpasswdの部分は作成するEOAのパスワードです。

> personal.newAccount("hogehoge01")
"0x78de04155ebc33e02983029445913eb189dbd184"

> eth.accounts
["0x78de04155ebc33e02983029445913eb189dbd184"]

もう一つアカウントを作成しましょう(後で使用します)。


> personal.newAccount("hogehoge02")
"0xc07d99381154db0fc5f111104b7d6c7758ba9d98"
> eth.accounts
["0x78de04155ebc33e02983029445913eb189dbd184", "0xc07d99381154db0fc5f111104b7d6c7758ba9d98"]

【注意】

パスワードを忘れると復元する手段はありません。絶対にパスワードは忘れないようにしてください。また、上記の例では簡易なパスワードを用いましたが、実際には、セキュリティの観点から半角英数記号を含む長い複雑なパスワードを設定するようにしてください。

etherbase

ここで、eth.coinbaseコマンドを実行してみます。すると下記のとおり実行結果には先ほど作成した2つのEOAのうちの一つが表示されます。このコマンドはetherbase(coinbaseとも呼ばれます)を表示するコマンドで、etherbaseとは、各ノードで採掘を行う際にその報酬を紐づけるEOAのアドレスを示します。`


> eth.coinbase
INFO
address
"0x78de04155ebc33e02983029445913eb189dbd184"

etherbaseはデフォルトではプライマリーのアカウント(eth.accounts[0]コマンドを実行して表示されるアドレスのEOA)が設定されますが、下記のようにminer.setEtherbase(new_adress)コマンドで変更することも可能です。


> miner.setEtherbase(eth.accounts[1])
> eth.coinbase

etherの採掘

作成したEOAのアドレスがetherbaseとしてセットされていれば、etherの採掘が可能です。 etherの採掘はminer.start(thread_num)コマンドで開始します。ここでthread_num は採掘を何本のスレッドで同時実行するかを指定するパラメータです。指定しない場合は動作環境でのCPUコア数に設定されます。ここではthread_numは指定せず、以下のコマンドで採掘を開始します。


> miner.start()
null
採掘を停止したい場合は miner.stop()コマンドを実行すれば停止できます

> miner.stop()
true

1.採掘状況の確認

採掘を開始するとブロックが次々と生み出されていきます。ブロックチェーンに何番目のブロックまで連なっているのか(=ブロック高)を確認するには、eth.blockNumberコマンドを用います。 採掘開始後しばらくすると、

> eth.blockNumber
221

補足
なかなか採掘に成功しない場合、実際にGethで採掘処理が行われているのか不安になることが多くあります。処理が行われているかを確認する方法としてeth.miningコマンドで採掘中か否かを表示する方法があります。採掘中であればコマンドの実行結果としてtrueが返り、そうでなければfalseが返却されます。もう一つの方法は、eth.hashrateコマンドで、現在の採掘処理のハッシュ・レートを確認することです。ハッシュ・レートがゼロよりも大きければ、採掘処理が行われていると考えてよいでしょう。


> miner.start()
null
> eth.mining
true
> eth.hashrate  //採掘処理実行時
445445
> miner.stop()
true
> eth.mining
false
> eth.hashrate  //採掘処理が行われていない場合、ハッシュ・レートは0となる。
0

採掘したブロックの内容を調べる

eth.getBlock(number)コマンドは、numberに任意のブロック高を指定すると、そのブロック高のブロック情報を表示することができます。 以下に、ブロック高が100101のブロックの情報を表示してみます。


> eth.getBlock(100)
{
  difficulty: 137514,
  extraData: "0xd98301080e846765746888676f312e31302e338664617277696e",
  gasLimit: 121724529,
  gasUsed: 0,
  hash: "0xe525c8da2901350e5866ef0af8694520660e2a4f9623ce3d86bcf31a7e4ae704",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0xba867abdeb4752200497e4c87fbfbad53fffd9b9",
  mixHash: "0x4df0648613ba20400684dc6db0b7c53ae0afffe1c1c2ed1fb96141056098197f",
  nonce: "0x2a9c0ba7eea0c48a",
  number: 100,
  parentHash: "0xff7a58dd3e42d4ef32f6454fb5d2afa93f0937b115fca8c00f43d350f0fa8633",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 538,
  stateRoot: "0x93c023eb07ad573fd7313cdfc392fc6cc43a03cb56124b3a2102f685a3fa965b",
  timestamp: 1536646631,
  totalDifficulty: 13443302,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}
> eth.getBlock(101)
{
  difficulty: 137581,
  extraData: "0xd98301080e846765746888676f312e31302e338664617277696e",
  gasLimit: 121605659,
  gasUsed: 0,
  hash: "0x582769fe5b87e325d59592c6beb1127cfbec6ea2ed5307088309b40a68f5a2a2",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0xba867abdeb4752200497e4c87fbfbad53fffd9b9",
  mixHash: "0xeb6409867b81d8509c0d913bf69a7db08d4f914d5ff21fb7b68fa542d39d5df9",
  nonce: "0x786c48aacc8cf4ba",
  number: 101,
  parentHash: "0xe525c8da2901350e5866ef0af8694520660e2a4f9623ce3d86bcf31a7e4ae704",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 538,
  stateRoot: "0x65a941e07aa8d8128d53874f8f56851af73a92cfc01135ae7bbb09de05e76830",
  timestamp: 1536646632,
  totalDifficulty: 13580883,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

miner
そのブロックを採掘したEOAのアドレスを示しています。今回は採掘者は自分一人の環境のテスト・ネットなので、採掘者は自分のEOAのアドレス(eth.coinbaseで得られるアドレス)が採掘者として記録されているはずです。

number
そのブロックのブロック高を示しています。(今回はブロック高を指定して情報を表示しているので、指定したブロック高と同一の値が表示されているはずです。

hash
そのブロックのブロック・ヘッダ・ハッシュを表示しています。ブロック・ヘッダ情報をSHA-3アルゴリズム適用して得られた32-byteのハッシュ値です。このhashはブロックを指し示すユニークなIDとして利用されます。ここで、hashは、当該ブロックのデータ構造の中に含まれないことに注意してください。hashを知る必要がある場合には各自がブロック・ヘッダのデータを元に計算することになります5。

parentHash
親ブロックのブロック・ヘッダ・ハッシュを示しています。parentHashはブロック・ヘッダのデータ構造の中に含まれており、つまりは、子ブロックから親ブロックを参照していることになります。このような参照の連鎖が連なることでブロックのチェーン「ブロックチェーン」が形成されていることになります。

報酬の確認

採掘者が、自身の持つ計算資源を費やして採掘を行うインセンティブは、Ethereumの内部通貨であるetherを報酬として得られることにあります。実際に採掘をしたことによりetherが得られているかを確認してみましょう。

各アカウントのetherの持ち高を参照するにはeth.getBalance(address)コマンドを用います。持ち高を確認したいアカウントのアドレスをaddressパラメータに引き渡すことで確認が可能です。先の手順で、2つのアカウントを作成していました。それぞれのetherの持ち高を確認してみましょう。


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

coinbaseに紐づいたアカウントに採掘の報酬が与えられているのがわかります。eth.getBalance(address)は「wei」の単位で持ち高が表示されます。以下の変換用のコマンドを使うことでetherの単位で表示することも可能です。


> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
3500

以上で採掘は完了です。

テスト・ネット上での採掘のため、Ethereumの本番ネットワークであるライブ・ネット上では利用できませんのでご注意ください。

次回

Ethereum[CryptoZombies][コントラクト・状態変数・四則演算]