渋谷ほととぎす通信

Unity・ゲーム開発 技術で一生食べていく情報発信

【Ethereum開発】Gethを使ったether(イーサ)の採掘

前回に引き続きGethを使ったEthereum開発の学習を進めています。 環境構築についてはコチラの記事を見ていただければと思います。

今回はetherの採掘です。

ether(イーサ)とは?

Ethereumは内部通貨etherが規定されており、Ethereumでトランザクションを発生させるためにはetherの手数料が必要になります。

etherとはEthereumの内部通貨のことです。
そもそもEhtereumは通貨ではなくプラットフォーム。

そのプラットフォーム内で使われる通貨がether(イーサ)です。

プラットフォームと言われてもという感じですが、
毎度のごとく細かいことはスキップして本題の採掘を始めます。

本記事もコチラのサイトを参考にさせていただいております。
いつもありがとうございます。 etherを採掘する - Ethereum入門

EOAアカウントの作成

Ethereumには2種類のアカウントがありますが、 今回はEOA(Externally Owened Account)というアカウントを作成します。

前回記事で接続したプライベートネットワーク上の対話型コンソールを使っていきます。 もしまだでしたらコチラの記事を参考にして対話型コンソールを起動してください。

現在のEOAアカウント調査

> eth.accounts
[ ]

まだ作っていないため空の配列が出力されます。

アカウントの作成

personal.newAccountメソッドでアカウントが作成できます。

> personal.newAccount("pass")
"0xf49a337c6f16b1897576bdd12d4d76fef4f0ad65"

再度現在のアカウントリストを確認します。

> eth.accounts
["0xf49a337c6f16b1897576bdd12d4d76fef4f0ad65"]

このように、さきほどは空の配列でしたが、 作成したハッシュ値(アドレス)が格納されます。

あとで送金処理をするため、もう1アカウント作成します。

> personal.newAccount("pass2")
"0x2a93c84276d063851c307a9a490e5f83f75153e1"

> eth.accounts
["0xf49a337c6f16b1897576bdd12d4d76fef4f0ad65", "0x2a93c84276d063851c307a9a490e5f83f75153e1"]

このようにアカウントが2つ作成されました。

パスワードは復元できないので忘れないようにしてください

採掘と報酬をひも付けるetherbase またはcoinbase

> eth.coinbase
"0xf49a337c6f16b1897576bdd12d4d76fef4f0ad65"

eth.coinbaseと実行すると、 さきほど作成したEOAアカウントのうち片方のアドレスが表示されました。

このアドレスが採掘した時の報酬にひも付きます。

報酬をひも付けるアドレスを変えたい場合は、
以下のコマンドを実行します。

miner.setEtherbase(new_adress)

etherの採掘

👇以下のコマンドで採掘が開始します。

> miner.start()
null

採掘状況の確認

> eth.blockNumber
157

このように採掘したブロック数を確認できます。

採掘しているかどうかの確認

> eth.mining
true

採掘の停止

> miner.stop()
null

ハッシュレートの確認

マイニングをする際の1秒あたりの計算力、採掘速度のことです。 単位は hash/s (セカンド)で、「毎秒 ◯ ハッシュの計算ができる」ことを意味します。

そもそもハッシュレートとは採掘スピードとのことです。 ハッシュレートを確認してみましょう。

ところが、ドキュメントでは eth.hashrateと記載されていますが、

Error: the method eth_hashrate does not exist/is not available
    at web3.js:6347:37(47)
    at get (web3.js:6247:66(14))

👆このようなエラーがスローされます。

バージョン違いによる仕様の変更かもしれません。 中身を確認すると、
👇正しくはこちらで確認できます。

> ethash.getHashrate()
494672

採掘したブロックの確認

100個目のブロックを確認してみます。

> eth.getBlock(100)

すると以下のようなJSONが出力されます。

{
  difficulty: 137514,
  extraData: "0xd983010a02846765746888676f312e31362e338664617277696e",
  gasLimit: 121724529,
  gasUsed: 0,
  hash: "0xb454ce4bab83f6ae896469381a8831b004e89c19655dc139078347176e69dc5f",
  logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
  miner: "0xf49a337c6f16b1897576bdd12d4d76fef4f0ad65",
  mixHash: "0xf7058ff56352eda9708d940e9414048871108746d98268b0ebf958ac6593b693",
  nonce: "0x16d87ae5f6da90d8",
  number: 100,
  parentHash: "0xc89fabade2b4373520aab707a4a2d7fe1aa8ef0c4cd7f2c37dd7eee086e58026",
  receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
  size: 538,
  stateRoot: "0xc537d04ec12de7055ca44163ca95144bab45b149af09e38bd63e82752e97ee2b",
  timestamp: 1619428804,
  totalDifficulty: 13443302,
  transactions: [],
  transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
  uncles: []
}

一旦細かいことはスキップして先に進みます。

採掘報酬の確認

getBalanceメソッドで現状の保有etherを確認できます。

> eth.getBalance(eth.accounts[0])
1.0485e+22

wei単位の報酬量では分かりづらいためether単位に変換してみます。

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

現在採掘して、10485イーサ所有していることになります。

まとめ

etherの採掘をしてきました。

ただ、テスト環境だと正直どんどん採掘でき、
報酬も付与されるため何をしているのか実感はありません。

新しいことの学習とは、最初はそういうものです。 とりあえず引き続き全体把握に努めていきます。

次回はetherの送金です。