Ethereumテストネットワークでマイニングしてみる
どうも、ぺろりんです。
今回は「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」でのお勉強に戻ってきました。
先日の投稿でGethを起動したところからの続きです。
Gethを起動したら以下のような画面になったのでした。
これの続きをやっていきます。
今回はテストネットでアカウントを作成してマイニングしてみます。
だいぶマターリ進行ですがあしからずw
アカウントの作成
EOAとContractアカウントというものがあるそうで、まずはEOAアカウントを作成します。(アカウントについては別記事でもーちょい調べた内容を書きました)
pass0はアカウントのパスフレーズで、1行目でEnterを押して出てきた2行目が、送金に使うアドレスです。
アカウントの確認をしてみます。
アカウントをもう1つ作ってから確認すると、こんな感じでアカウントのリストが増えます。
インデックスを付けると各個別アカウントの値を返すので、「eth.accounts」という配列に各アカウントのアドレスが入っているようです。
「exit」でGethコンソールを抜けて、Linux側で「geth」コマンドによるアカウント作成・確認もできます。
Linuxの端末から上記gethコマンドで見てみると、Linux上では「/home/vm01/data_testnet/keystore/」という場所に「UTC--2018-03-25T15-36-45.854394759Z--8ade49123c81461e676fd2f8f2eb31885cdb07e0」などというのが作成されていて、こいつがアドレス情報のファイルのようです。
catコマンドで中身を見てみるとこんな感じです。
内容としては参考に挙げたところによると以下の内容とのことです。
ひとまずそのまま訳してみるので、誤訳などあればメールフォームからご指摘いただけると助かります。
・cipher:対称AES[注1]アルゴリズムの名前。
・cipherparams:上記「cipher」アルゴリズムで要求されるパラメータ。
・ciphertext:上記「cipher」アルゴリズムを使って暗号化されたあなた(対象アカウント)の秘密鍵。
・kdf:パスワードを用いてあなた(対象アカウント)のキーストアファイルを暗号化するのに使う鍵導出関数[注2]。
・kdfparams:上記「kdf」アルゴリズムで要求されるパラメータ。
・mac:あなた(対象アカウント)のパスワードを認証するためのメッセージ認証符号[注3]。
Ethereumのマイニング
マイニング前の状況確認
マイニング報酬を受け取るCoinbase(Etherbase)を確認します。
これは、先ほど確認したeth.accounts[0]です。デフォルトだとこれになるようです。
ちなみにEtherbaseの変更は以下のようにできます。
ためしにやってみたのですが、Etherbaseに2つのアカウントを登録するのはうまくいかないみたいです。
あと、eth.coinbaseに入っているアドレスは、各文字が配列として入っているみたいです。
遊び終えたのでEtherbaseをeth.accounts[0]に戻しておきます。
現状でEthereumの残高を確認するとこんな感じです。
このeth.getBalanceでついでにちょっと遊んでみると、引数なしでやったりするとダメっぽいですね。
最後のやつは、存在しないeth.accounts[3]というアカウントを引数にした場合です。
まだ何もしていないのでブロック数は0です。(Genesisファイルは作ったので0番目のブロックはあるのでしょう)
…という状態からマイニングをはじめてみましょう。
マイニング
マイニング開始。
引数の1は、マイニングのスレッド数です。
初回はDAG(Directed acyclic graph)というのを作成するために時間がかかるようです。(DAGについては別途調べました)
別コンソールを開いてtailでgeth.logを見ていましたが、私の環境だと12分くらいかかりました。。
DAG作成が終わってマイニングが始まるところのログがこんな感じです。
DAGファイル(1GBくらい)はここに作成されています。
マイニングされているか、1秒当たりのハッシュ計算の回数、現在のブロック数は以下です。
このへんでマイニング停止。
この時点での残高はこんな感じ(単位はwei)。
マイニング報酬は、すべてeth.coinbase(今のデフォルト設定だと、=eth.accounts[0])に行きます。
以前見たEthereumの他の通貨単位に変換することもできます。
(参考)
・Ethereum入門 – アカウントとマイニング(BlockChain Online)
・What is an Ethereum keystore file?(Medium)
まとめ
今回は、(コマンドの動作確認をすこし挟みつつ)アカウント作成とマイニング実行までをやりました。
少なくともこれだけなら簡単にできましたね。
わからない単語もいくつかありましたが、これらは別途調べた記事をご参照ください。
この次はテストネットでEthereumの送金をやります。
ではではこのへんで。
[注1] AES…DESの後継として米国の国立標準技術研究所(NIST:National Institute of Standards and Technology)によって制定された共通鍵の暗号化規格。
(参考)
・Advanced Encryption Standard(Wikipedia)
・マスターIT/暗号技術:第3回 AES暗号化(@IT)
・AESの仕様書:FIPS-197「Advanced Encryption Standard」[PDF](NIST)
[注2] 鍵導出関数…与えられたパスワードから共通鍵暗号用の鍵を生成する関数。鍵導出関数として使われている具体的な関数はいくつかあって、その内の1つがここで設定されている「scrypt」という名前が付けられた関数のようです。
(参考)
・鍵導出関数(Wikipedia)
・パスワード暗号(シニアエンジニアの庵)
・Android 4.4(KRT16S)では、「端末の暗号化」機能に関する重大なバグの修正が行われている(juggly.cn)
[注3] メッセージ認証符号(Message Authentication Code)…ネットワークスペシャリストの問題の解答によると、「通信内容の改ざんの有無を検証し、完全性を保証するために通信データから生成される固定長のビット列」だそうです。送信者と受信者であらかじめ共通鍵を共有した状態で、送信者は「元データ」+「(元データ+共通鍵)から生成したMAC値」を送り、受信者は共通鍵を使って「元データ」から送信者と同じMAC値が得られるか照合して改ざんを確かめる。このMAC値のことをメッセージ認証符号と呼ぶようです。この手順で公開鍵は出てきません。
(参考)
・ネットワークスペシャリスト 平成27年秋期 午前Ⅱ 問16(ネットワークスペシャリストドットコム)
・メッセージ認証符号(Wikipedia)
・メッセージ認証コード(サイファー・テック株式会社)
・MAC(メッセージ認証コード)とは(CubicLouve)
・MAC(message authentication code)(情報処理安全確保支援士(情報セキュリティスペシャリスト) - SE娘の剣 -)
今回は「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門 (DEV Engineer's Books)」でのお勉強に戻ってきました。
先日の投稿でGethを起動したところからの続きです。
Gethを起動したら以下のような画面になったのでした。
vm01@ubuntu:~$ geth --networkid 4649 --nodiscover --maxpeers 0 --datadir /home/vm01/data_testnet console 2>> /home/vm01/data_testnet/geth.log
Welcome to the Geth JavaScript console!
instance: Geth/v1.5.5-stable-ff07d548/linux/go1.6.2
modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
これの続きをやっていきます。
今回はテストネットでアカウントを作成してマイニングしてみます。
だいぶマターリ進行ですがあしからずw
アカウントの作成
EOAとContractアカウントというものがあるそうで、まずはEOAアカウントを作成します。(アカウントについては別記事でもーちょい調べた内容を書きました)
> personal.newAccount("pass0")
"0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"
pass0はアカウントのパスフレーズで、1行目でEnterを押して出てきた2行目が、送金に使うアドレスです。
アカウントの確認をしてみます。
> eth.accounts
["0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"]
アカウントをもう1つ作ってから確認すると、こんな感じでアカウントのリストが増えます。
> personal.newAccount("pass1")
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"
> eth.accounts
["0x8ade49123c81461e676fd2f8f2eb31885cdb07e0", "0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"]
インデックスを付けると各個別アカウントの値を返すので、「eth.accounts」という配列に各アカウントのアドレスが入っているようです。
> eth.accounts[0]
"0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"
> eth.accounts[1]
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"
「exit」でGethコンソールを抜けて、Linux側で「geth」コマンドによるアカウント作成・確認もできます。
vm01@ubuntu:~$ geth --datadir /home/vm01/data_testnet/ account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat passphrase:
Address: {ecac305a22ac002107cdac420e24042d430bcb26}
vm01@ubuntu:~$
vm01@ubuntu:~$ geth --datadir /home/vm01/data_testnet/ account list
Account #0: {8ade49123c81461e676fd2f8f2eb31885cdb07e0} /home/vm01/data_testnet/keystore/UTC--2018-03-25T15-36-45.854394759Z--8ade49123c81461e676fd2f8f2eb31885cdb07e0
Account #1: {3a8e6c0304c761b88feeefb5cdefe27ced28d620} /home/vm01/data_testnet/keystore/UTC--2018-04-15T07-34-57.756551935Z--3a8e6c0304c761b88feeefb5cdefe27ced28d620
Account #2: {ecac305a22ac002107cdac420e24042d430bcb26} /home/vm01/data_testnet/keystore/UTC--2018-04-15T08-00-19.988671829Z--ecac305a22ac002107cdac420e24042d430bcb26
Linuxの端末から上記gethコマンドで見てみると、Linux上では「/home/vm01/data_testnet/keystore/」という場所に「UTC--2018-03-25T15-36-45.854394759Z--8ade49123c81461e676fd2f8f2eb31885cdb07e0」などというのが作成されていて、こいつがアドレス情報のファイルのようです。
catコマンドで中身を見てみるとこんな感じです。
vm01@ubuntu:~$ cat data_testnet/keystore/UTC--2018-03-25T15-36-45.854394759Z--8ade49123c81461e676fd2f8f2eb31885cdb07e0
{"address":"8ade49123c81461e676fd2f8f2eb31885cdb07e0","crypto":{"cipher":"aes-128-ctr","ciphertext":"c8bf1c8a3ec4338e7c98a7a4afe7f8172e44c92f2049b80b9914755aec436d62","cipherparams":{"iv":"af13fe72364dd06b91c33d358f3b46af"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"c493bb2b3a7c4bc338f8a70fd95dde747b86a73d71dbe8971110e8aef7c8f283"},"mac":"ffa7c3527aca8afa549de4b14d9817e55e6a8f689ddca550c02209d2226bc97d"},"id":"4db341af-88af-418b-861f-c626a0ad689d","version":3}
内容としては参考に挙げたところによると以下の内容とのことです。
ひとまずそのまま訳してみるので、誤訳などあればメールフォームからご指摘いただけると助かります。
・cipher:対称AES[注1]アルゴリズムの名前。
・cipherparams:上記「cipher」アルゴリズムで要求されるパラメータ。
・ciphertext:上記「cipher」アルゴリズムを使って暗号化されたあなた(対象アカウント)の秘密鍵。
・kdf:パスワードを用いてあなた(対象アカウント)のキーストアファイルを暗号化するのに使う鍵導出関数[注2]。
・kdfparams:上記「kdf」アルゴリズムで要求されるパラメータ。
・mac:あなた(対象アカウント)のパスワードを認証するためのメッセージ認証符号[注3]。
Ethereumのマイニング
マイニング前の状況確認
マイニング報酬を受け取るCoinbase(Etherbase)を確認します。
> eth.coinbase
"0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"
これは、先ほど確認したeth.accounts[0]です。デフォルトだとこれになるようです。
ちなみにEtherbaseの変更は以下のようにできます。
> miner.setEtherbase(eth.accounts[1])
true
> eth.coinbase
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"
ためしにやってみたのですが、Etherbaseに2つのアカウントを登録するのはうまくいかないみたいです。
> miner.setEtherbase(eth.accounts[1],eth.accounts[2])
true
> eth.coinbase
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"
> eth.accounts[1]
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"
> eth.accounts[2]
"0xecac305a22ac002107cdac420e24042d430bcb26"
あと、eth.coinbaseに入っているアドレスは、各文字が配列として入っているみたいです。
> eth.coinbase
"0x3a8e6c0304c761b88feeefb5cdefe27ced28d620"
> eth.coinbase[0]
"0"
> eth.coinbase[1]
"x"
> eth.coinbase[2]
"3"
> eth.coinbase[3]
"a"
> eth.coinbase[4]
"8"
> eth.coinbase[40]
"2"
> eth.coinbase[41]
"0"
> eth.coinbase[42]
undefined
遊び終えたのでEtherbaseをeth.accounts[0]に戻しておきます。
> miner.setEtherbase(eth.accounts[0])
true
> eth.coinbase
"0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"
> eth.accounts[0]
"0x8ade49123c81461e676fd2f8f2eb31885cdb07e0"
現状でEthereumの残高を確認するとこんな感じです。
> eth.getBalance(eth.accounts[0])
0
> eth.getBalance(eth.accounts[1])
0
> eth.getBalance(eth.accounts[2])
0
このeth.getBalanceでついでにちょっと遊んでみると、引数なしでやったりするとダメっぽいですね。
> eth.getBalance
function()
> eth.getBalance(eth.accounts)
Error: invalid address
at web3.js:3887:15
at web3.js:4939:28
at map ()
at web3.js:4938:12
at web3.js:4964:18
at web3.js:4989:23
at:1:1
>
> eth.getBalance(eth.accounts[3])
Error: invalid address
at web3.js:3887:15
at web3.js:4939:28
at map ()
at web3.js:4938:12
at web3.js:4964:18
at web3.js:4989:23
at:1:1
>
最後のやつは、存在しないeth.accounts[3]というアカウントを引数にした場合です。
まだ何もしていないのでブロック数は0です。(Genesisファイルは作ったので0番目のブロックはあるのでしょう)
> eth.blockNumber
0
…という状態からマイニングをはじめてみましょう。
マイニング
マイニング開始。
> miner.start(1)
true
引数の1は、マイニングのスレッド数です。
初回はDAG(Directed acyclic graph)というのを作成するために時間がかかるようです。(DAGについては別途調べました)
別コンソールを開いてtailでgeth.logを見ていましたが、私の環境だと12分くらいかかりました。。
DAG作成が終わってマイニングが始まるところのログがこんな感じです。
I0417 07:33:00.085336 vendor/github.com/ethereum/ethash/ethash.go:276] Done generating DAG for epoch 0, it took 12m12.900405808s
I0417 07:33:47.791323 miner/unconfirmed.go:83] 🔨 mined potential block #1 [251d30b4…], waiting for 5 blocks to confirm
I0417 07:33:47.854460 miner/worker.go:516] commit new work on block 2 with 0 txs & 0 uncles. Took 52.320461ms
I0417 07:34:00.458694 miner/unconfirmed.go:83] 🔨 mined potential block #2 [335402cf…], waiting for 5 blocks to confirm
I0417 07:34:00.459445 miner/worker.go:516] commit new work on block 3 with 0 txs & 0 uncles. Took 509.749µs
DAGファイル(1GBくらい)はここに作成されています。
vm01@ubuntu:~$ tree .ethash/
.ethash/
└── full-R23-0000000000000000
0 directories, 1 file
vm01@ubuntu:~$ ls -lh .ethash/full-R23-0000000000000000
-rw-rw-r-- 1 vm01 vm01 1.0G Apr 17 07:33 .ethash/full-R23-0000000000000000
マイニングされているか、1秒当たりのハッシュ計算の回数、現在のブロック数は以下です。
> eth.mining
true
> eth.hashrate
72632
> eth.blockNumber
191
このへんでマイニング停止。
> miner.stop()
true
> eth.mining
false
> eth.hashrate
0
> eth.blockNumber
196
この時点での残高はこんな感じ(単位はwei)。
マイニング報酬は、すべてeth.coinbase(今のデフォルト設定だと、=eth.accounts[0])に行きます。
> eth.getBalance(eth.coinbase)
980000000000000000000
> eth.getBalance(eth.accounts[0])
980000000000000000000
> eth.getBalance(eth.accounts[1])
0
> eth.getBalance(eth.accounts[2])
0
以前見たEthereumの他の通貨単位に変換することもできます。
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
980
> web3.fromWei(eth.getBalance(eth.coinbase),"ether")
980
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
980
> web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
0
> web3.fromWei(eth.getBalance(eth.accounts[2]),"ether")
0
> web3.fromWei(eth.getBalance(eth.accounts[0]),"szabo")
980000000
> web3.fromWei(eth.getBalance(eth.accounts[0]),"finney")
980000
(参考)
・Ethereum入門 – アカウントとマイニング(BlockChain Online)
・What is an Ethereum keystore file?(Medium)
まとめ
今回は、(コマンドの動作確認をすこし挟みつつ)アカウント作成とマイニング実行までをやりました。
少なくともこれだけなら簡単にできましたね。
わからない単語もいくつかありましたが、これらは別途調べた記事をご参照ください。
この次はテストネットでEthereumの送金をやります。
ではではこのへんで。
[注1] AES…DESの後継として米国の国立標準技術研究所(NIST:National Institute of Standards and Technology)によって制定された共通鍵の暗号化規格。
(参考)
・Advanced Encryption Standard(Wikipedia)
・マスターIT/暗号技術:第3回 AES暗号化(@IT)
・AESの仕様書:FIPS-197「Advanced Encryption Standard」[PDF](NIST)
[注2] 鍵導出関数…与えられたパスワードから共通鍵暗号用の鍵を生成する関数。鍵導出関数として使われている具体的な関数はいくつかあって、その内の1つがここで設定されている「scrypt」という名前が付けられた関数のようです。
(参考)
・鍵導出関数(Wikipedia)
・パスワード暗号(シニアエンジニアの庵)
・Android 4.4(KRT16S)では、「端末の暗号化」機能に関する重大なバグの修正が行われている(juggly.cn)
[注3] メッセージ認証符号(Message Authentication Code)…ネットワークスペシャリストの問題の解答によると、「通信内容の改ざんの有無を検証し、完全性を保証するために通信データから生成される固定長のビット列」だそうです。送信者と受信者であらかじめ共通鍵を共有した状態で、送信者は「元データ」+「(元データ+共通鍵)から生成したMAC値」を送り、受信者は共通鍵を使って「元データ」から送信者と同じMAC値が得られるか照合して改ざんを確かめる。このMAC値のことをメッセージ認証符号と呼ぶようです。この手順で公開鍵は出てきません。
(参考)
・ネットワークスペシャリスト 平成27年秋期 午前Ⅱ 問16(ネットワークスペシャリストドットコム)
・メッセージ認証符号(Wikipedia)
・メッセージ認証コード(サイファー・テック株式会社)
・MAC(メッセージ認証コード)とは(CubicLouve)
・MAC(message authentication code)(情報処理安全確保支援士(情報セキュリティスペシャリスト) - SE娘の剣 -)