エンジニア向け
【Ethereum入門】gethでマイニングをする
Tamahashi
はじめに
はじめまして!アルバイトのタマハシです。
Eyes,JAPANに来てからまだ3ヶ月ですが、多くの経験をさせてもらうなかで、現在業務の関係でスマートコントラクトの勉強をしています。
そこで、Ehererumに関する知識を共有することで、これからスマートコントラクトを学ぶ人の最初の足掛かりになればと思いこの記事を書います。
今回は、Ethereumに関する用語の整理とgethを用いて仮想通貨であるetherをマイニングするところまで紹介します。
Ethereumとは
イーサリアム(英: Ethereum)とは、分散型アプリケーション (DApps) やスマート・コントラクトを構築するためのプラットフォームの名称、及び関連するオープンソース・ソフトウェア・プロジェクトの総称である。
イーサリアム – Wikipedia
あまりピンとこないのでEthereumの特徴を私なりに整理してみます。
- 仮想通貨であるEtherによって資産のやり取りができる。
- マイニングや、送金はgethと呼ばれるクライアントで実行できる。
- 送金の際はトランザクションを生成することで実現する。
- トランザクションにはEtherだけでなく任意のデータを載せることができ、そこに任意のコードも載せることができる。
- コードはSolidityと呼ばれる独自のプログラミング言語で記述する。
- 以上の仕組みを提供するプラットフォームをEthereumと呼ぶ。
このように解釈しています。
なかでもトランザクションに任意のデータを載せることができる点が、bitcoinやNEMと比較してEthereumの最も特徴的な部分だと考えています。これによりブロックチェーン上で任意のプログラムを実行させることでスマートコントラクトを用いたさまざまなアプリケーションを実現することができます。
マイニングをする準備
gethをインストール
> brew tap ethereum/ethereum
> brew install ethereum
Dockerを利用の方
docker-compose.ymlファイルを作成したのでこちらをご使用ください!
version: '3'
services:
geth:
image: ethereum/client-go
volumes:
- ./data:/root
ports:
- "30303:30303"
- "8545:8545"
tty: true
Genesisファイルを作成
Genesisファイルとは、ネットワークでやり取りされるブロックチェーンの最初(0番目)のブロック情報を定義したもので、Ethereumをプラベートネットワークで運用する際は必須です。
genesis.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ファイルで初期化
以下のコマンドでgenesisファイルを用いてブロックチェーンを初期化します。
/root/eth_private_net/の部分はgenesisファイルがあるパスに適宜読み替えてください
geth --datadir /root/eth_private_net init /root/eth_private_net/genesis.json
gethを起動
geth --networkid "15" --nodiscover --port 30304 --datadir "/root/eth_private_net" console 2>> /root/eth_private_net/geth_err.log
アカウントの作成
マイニングした際の報酬を受け取るアカウントを作成します。
ここで入力したパスワードを忘れないようにしてください。
> personal.newAccount("testpassword")
"0xa18bc09f7193f6092e7e37b3ce32228ff2c2cc31"
マイニングをする
以下のコマンドでマイニングを開始します。
結果とてnullが帰ってきますが、戻り値がないだけなので特に問題はありません。
> miner.start()
null
以下のコマンドで現在マイニング中かどうかを確認できます。
> eth.mining
true
以下のコマンドでマイニングの速度を確認できます。
0より大きい値が出力されれば正常にマイニングできています(初回は時間がかかるようで私の環境だと10分ほど待つと0より大きい値が表示されました)。
> eth.hashrate
13043
マイニングが成功したら以下のコマンドで終了します。
> miner.stop()
報酬として得たetherを確認します。
> eth.getBalance(eth.accounts[0])
125000000000000000000
以上でマイニング完了です!おつかれさまでした!
終わりに
いかがだったでしょうか?今回はEthereum周辺知識の確認とgethを用いてマイニングをしてみました。
今後の目標はsolidityを使ってスマートコントラクトのアプリケーションを作成することですのでまだまだ学ぶべきことは多いです。
また知見がたまりましたら共有できればと思っています。
ありがとうございました!