
イーサアリアムは、現在の「プルーフ・オブ・ワーク(PoW)」から「プルーフ・オブ・ステーク(PoS)」への移行でマイニングは無くなっていくようじゃ。
イーサリアムの開発者Tim Beiko氏もマイニング設備にこれ以上投資しないように勧めているのじゃ。

じゃあその前にということで、ノートパソコン1つでetherをマイニングしてみました。

結果は 0 ETH だったのじゃ。
イーサリアムはグラフィックカード(GPU)を使うマイニングに適しているから、ノートパソコン1つでソロマイニングはちょっと難しかったようじゃ。

でもマイニング体験はできたので良しとします。

今回のマイニングでは「Ubuntu」「Geth」「Visual Studio Code」を使用するので、これらが無ければ過去記事を参考にするのじゃ
- OS:Windows 10/バージョン 21H2 (OS ビルド 19044.1706)
- プロセッサ:Intel(R) Core(TM) i7-7500U
- メモリ:DDR4 8GB
- マザーボード:L-NSS172-L(みんなもっとカッコイイ名前の使ってますよね…)
Gethの確認

「Ubuntu」を立ち上げ、「Geth」がインストールされているか確認するのじゃ。
●コマンドを実行↓
geth --help

Genesisファイルを作成する

過去記事「Solidityで独自トークンを発行し、Faucetアプリを作る方法②」とは違う方法で作成するのじゃ。

以前作ったGenesisファイルはChain IDが「4」のRinkebyネットワークを使いました。
今回は「15」のChain IDを使っていますが、いくつかの番号以外であれば、自分で指定できます。

テストネット用のディレクトリを作るのじゃ。
今回は「My_eth_chain」としたのじゃ。
●コマンドを実行↓
mkdir /home/ユーザー名/My_eth_chain


「VS Code」をWSL2(Windows Subsystem for Linux 2)に接続するのじゃ。
①リモートエクスプローラーを選択
②「Ubuntu」を右クリックすると接続メニューが表示されるので、「Connect to WSL」を選択↓


新規でVisual Studio Codeが起動するのじゃ。
左下に「WSL: Ubuntu」と表示されていれば接続完了なのじゃ。

①「Open Folder」をクリック
②作成したディレクトリ「My_eth_chain」を選択
③「OK」↓

●「myGenesis.json」ファイルを作り、下記コードを貼り付け↓
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"berlinBlock": 0
},
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "",
"gasLimit": "0x8000000",
"difficulty": "0x4000",
"mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {}
}

genesisブロックの初期化
●コマンドを実行↓
geth --datadir /home/ユーザー名/My_eth_chain init /home/ユーザー名/My_eth_chain/myGenesis.json

Gethの起動
●コマンドを実行↓
geth --networkid "15" --nodiscover --datadir "/home/ユーザー名/My_eth_chain" console 2>> /home/ユーザー名/My_eth_chain/geth_err.log


今作ったmyGenesis.jsonファイルの内容のGenesisブロックか確認するのじゃ。
●コマンドを実行↓
eth.getBlock(0)


内容を簡単に確認してみるのじゃ。
myGenesis.json | |
“nonce” | “0x0000000000000042” |
“gasLimit” | “0x8000000″(16進表記) |
“difficulty” | “0x4000″(16進表記) |
Genesisブロック | |
“nonce” | “0x0000000000000042” |
“gasLimit” | 134217728(10進表記) |
“difficulty” | 16384(10進表記) |

16進表記から10進表記を確認するのは面倒だけど、ちゃんと作ったmyGenesis.jsonファイルの内容になってるね。
16進表記から10進表記なんて初めて調べてみたよ
ε=( ̄。 ̄;A フゥ…

目次の「Genesisファイルを作成する」から「Gethの起動」の工程によって、プライベートネット(テストネット)に接続することができたのじゃ。
アカウントの作成

アカウントの作成を行うのじゃ。
このアカウントによってマイニングを行うのじゃ。
その前に、まだアカウントを作ってない状態でアカウントを表示させるコマンドを実行してみるのじゃ。
●アカウント表示↓
eth.accounts

すると下図のように[]が表示されるのじゃ。
[]の中が何も表示されないのは、まだアカウントが無いということなのじゃ。


何もないことが分かったところで、アカウントを作成するのじゃ。
●アカウント作成↓
personal.newAccount("hogehoge01")

上記コマンドの hogehoge01
はアカウントを作成するためのパスワードなので、この部分は自分で決めたパスワードに書き換えて実行してください。
- パスワードを忘れると復元する手段はないので、パスワードは忘れないように自分で保管しておく。
- 半角英数記号を含む長い複雑なパスワードを設定して、セキュリティを強化しておく。


ほー、メタマスクなんかでお馴染みのアドレスができた。

アカウントを作ったところで、さっき空のリスト[]が表示された eth.accounts
コマンドを実行してみるのじゃ。


うん、ちゃんと作成したアドレスが表示された。

送金テスト用に、もう1つアドレスを作成しておくのじゃ。
●アカウント作成↓
personal.newAccount("hogehoge02")

hogehoge02にも新たにパスワードを設定して、忘れないようにしてください。



マイニングが成功時したときに報酬を受け取るアカウントを表示してみるのじゃ。
●マイニング成功時に報酬を受け取るアカウント確認↓
eth.coinbase


マイニングが成功時したときに報酬を受け取るアカウントを表示してみるのじゃ。
作成した2つのアカウントが表示されていて、この緑色の方が報酬を紐づけるアカウントなのじゃ。

2回目の表示からは緑色の方だけ表示されるみたいです。

このアカウントの事をetherbase(coinbase)と言うのじゃ。
etherbaseはデフォルトで eth.accounts[0]
コマンドを実行して表示されるアドレスに設定されているのじゃ。


違うアカウントに設定したい場合は…
●etherbase(coinbase)の変更↓
miner.setEtherbase(eth.accounts[1])

etherをマイニング

いよいよetherのマイニングなのじゃ。

(((o(*゚∀゚*)o)))ワクワク
●スタートコマンド↓
miner.start()
●ストップコマンド↓
miner.stop()


ゆるりは miner.stop() をしても止まらないときがありました。
そんな時は「Ctrl + D」でコンソールから抜けると止まります。
●現在マイニング中かどうかの確認↓
eth.mining

マイニング中であればコマンドの実行結果が true
になり、そうでなければ false
が返ってくるのじゃ。

●マイニング状況の確認↓
eth.blockNumber

●保有額確認(wei単位)↓
eth.getBalance(eth.accounts[0])
※etherbase(coinbase)を[0]以外で設定しているのであれば、[0]を自分の設定したアカウントの番号にに書き換えて実行。


「3.832e+21」?

このコマンド結果ではwei単位で表示されるのじゃ。

1wei = 0.000000000000000001ether だったね。

下記コマンドだとether単位でわかりやすくなるのじゃ。
●保有額確認(ether単位)↓
web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
※etherbase(coinbase)を[0]以外で設定しているのであれば、[0]を自分の設定したアカウントの番号にに書き換えて実行。


報酬額は 3832eth なのじゃ。

∑(゚Д゚)ファッ!!?
3832eth !!!!!!!?

落ち着くのじゃ、これはプライベートネット(テストネット)なのじゃ。
だから 3832eth は例えると子供銀行券のようなもので、なんの価値もないのじゃ。

そうだったね、
いきなりメインネットに接続すると、スマートコントラクトがちゃんと動かなかった時でもガス代(トランザクション手数料)がかかっちゃうから、まずはこのプライベートネット(テストネット)で動作確認するんだったね…(´・ω・`)
etherの送金


上の図を見ると、etherbase(coinbase)であるaccounts[0]に 3832eth が保有されていて、accounts[1]は 0 なのじゃ。
このaccounts[0]からaccounts[1]へ、気前よく 555eth を送金してみるのじゃ。
- 送金元のアカウントのロックを解除すること
- マイニング処理
miner.start()
を実行していること
●送金元アカウントのロック解除↓
personal.unlockAccount(eth.accounts[0])


Passphraseはアカウントを作成したときのパスワードを入力するのじゃ。

ちなみにパスワードは入力しても入力しているのかわからないし表示もされないので、間違えないようにキーボードをポチポチしましょう。

「true」と表示されれば、ロック解除成功なのじゃ。

デフォルトの設定で5分経過するとまたロックがかかりますが、気になる方はロックをかけなおしてください。
●アカウントのロック↓
personal.lockAccount(eth.accounts[0])
●ether送金↓
eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(555, "ether")})

from
に送金元アドレス、 to
に送金先アドレス、 value
に送りたいether単位の額を指定するのじゃ。


コマンドを実行した後、トランザクションIDが返ってくれば成功。

wei単位だとやっぱり分かりずらいので、ether単位で確認してみると、確かにaccounts[1]に555ethがありました。
トランザクション情報を確認

今度はaccounts[1]が送金された555ethをそのままaccounts[0]に返そうとするとエラーが起きたのじゃ。
そこで金額を少なくして5ethを送金し、[1]の残りの保有額を確認してみると残り550のはずが、それよりも少ない額になっているのじゃ。


もしかして、これが噂のガス代…?

そうじゃ。計算してみるのじゃ。
- 送金前:eth.getBalance(eth.accounts[1])=555,000,000,000,000,000,000 wei
- 送金後:eth.getBalance(eth.accounts[1])=549,999,979,000,000,000,000 wei
- 送金前 - 送金後 = 21,000,000,000,000 wei

ガス代は 21,000,000,000,000 wei なのじゃ。
●トランザクション情報の確認↓
eth.getTransaction('ether送金したときのトランザクションID')

blockNumber
: トランザクションID情報があるブロック(2720ブロック)from
: 送金元(accounts[1]=0x5620b2a376cc7897419e1714e9aa7b1c2fb274f3)gas
: トランザクション処理時のgasの使用量の「最大値」
※実際のトランザクション処理時のgasの使用量ではない(21000)gasPrice
: トランザクション処理時に採掘者に支払う1 gas 当たりの手数料(1000000000wei)to
: 送金先(accounts[0]=0x78c9224735d823f6fd509f44cd2ec8adf043e938)value
: 送金額(5000000000000000000wei=5eth)
メインネットに接続

いよいよメインネットに接続なのじゃ。

(ФДФ)ッ!!!!!!!!!!!!!!
●「Ctrl + D」でコンソールから出る↓

●メインネットに接続する用のディレクトリを用意↓
mkdir /home/ユーザー名/mainnet_data

●ホームディレクトリに戻る↓
cd

●作ったディレクトリ「mainnet_data」に移動↓
cd mainnet_data

●メインネットに接続↓されるはずが…
geth --datadir "/home/ユーザー名/mainnet_data" 2>> /home/ユーザー名/mainnet_data/e01.log &


下記コマンドを実行してみるのじゃ。
●メインネットに接続↓
geth console 2> ./e01.log

●接続状況の確認↓
net.peerCount


自分のノード(パソコン)が他のノードといくつ接続されているかを確認することができるのじゃ。

今は2つのノードと繋がっているということだね。
●接続されているノードの情報確認↓
admin.peers

ここから改めてメインネット用のアカウント(etherbase=coinbase)を作成し、miner.start()
でマイニングをスタートするのじゃ。


でもテストネットの時と違ってずっと false
のままだね…

これがメインネットの厳しさじゃな。

マイニングをスタート miner.start()
し、 VS Code でメインネット用に作ったディレクトリ(mainnet_data)内の「e01.log」を見てみるとマイニングを頑張っている様子を見ることができるのじゃ。

見たい見たい。


その中にハンマーのもし絵文字が出たら、保有額を確認してみるのじゃ。
泣いて喜ぶかもしれん。


何時間かやってみましたが、ゆるりはこんな感じでした↓


このような結果になってしまったが、君はどうだったかな?
お疲れ様だったのじゃ(´・ω・)っ旦~
コメント