ブロックチェーンを体験する 1回目 ユーザ追加からマイニング
の第1回です
スマートコントラクト本格入門―FinTechとブロックチェーンが作り出す近未来がわかる
- 作者: 鳥谷部昭寛,加世田敏宏,林田駿弥
- 出版社/メーカー: 技術評論社
- 発売日: 2017/02/16
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
目標
geth(Go版のethreum)を立ち上げ、ユーザー追加して採掘(マイニング)してみる。 最終目的はコントラクトの実行なのですが、コントラクト実行するためにはEtherが必要です。そこで少しだけ採掘をやってお金(Ether)を稼いでおきます。
作業の流れ
- Geth(Ethereum)環境の構築・実行
プライベートなEthereumを構築していきます - ユーザ作成
1で作成したEthereum環境に二つのユーザを作成します。今後この二つのユーザ間でお金(ETH)をやりとりしていきます。 下図ではいきなりブロックチェーンネットワークにユーザ作成しているようになっていますが、実際には1で作成したGeth にコンソール経由で作成し、3を実行することで伝搬させていくイメージになります - 採掘
2で作成したユーザで採掘(マイニング)を実行させ、採掘した手数料としてETHを受け取ってみます。 ただし、今回実際にはブロックは作成しません
前提
OSによっての差異がありますので、個別にググってみて下さい。 ちなみに私はmacなのでhomebrewで入れました。
- geth(1.5.9-stable)のインストール済み
- Solidity(0.4.9)のインストール済み
差異がある場合は注意して下さい。コマンドの戻り値のjsonが違っていたりで、その先のコマンドが変わってくる可能性があります(というか本から大分バージョンアップしているので実際ありました)。
Geth(Ethereum)環境の構築・実行
ethereumのGO版であるgethを今回使っていきます。 インストールは済んでいるとし、ローカルネットワークに閉じたethereumを作って立ち上げていきます。
種々のファイルを保存するディレクトリの作成
特に指定はしていませんが、適当な場所に作って下さい
# 好きな場所に作成する $ mkdir eth_private_net
gethの起動用パラメータ(Genesisファイル)の準備
localで起動させ、マイニングの難易度を下げたgenesisファイルを作成します。ここでdifficultyなどを変えることで採掘の難易度の変更とかできます。
$ cd eth_private_net $ vi genesis.json $ cat genesis.json { "nonce": "0x0000000000000042", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "difficulty": "0x00", "alloc": {}, "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "gasLimit": "0xffffffff" }
ethereum初期化
作成したgenesis.jsonを利用して初期化をします
$ geth eth_private_net init eth_private_net/genesis.json $ ls -l eth_private_net -rw-r--r-- 1 user staff 355 2 15 17:04 genesis.json drwxr-xr-x 3 user staff 102 2 15 19:52 geth drwx------ 2 user staff 68 2 15 19:52 keystore
コンパイラーのバージョンを確認。現在(2018/2/15時点で0.4.9)
実行する前にコンパイラであるsolidityのバージョンをチェックしておきます。現在0.4.9ですが、大きく違っている場合は今後のコマンドが違っている可能性があるので気をつけて下さい。
$ solc --version solc, the solidity compiler commandline interface Version: 0.4.9+commit.364da425.Darwin.appleclang # solcのディレクトリを確認 $ which solc /usr/local/bin/solc
geth(GO製のethereum)の立ち上げ
今は特に気にせず以下の通り実行すればOKでしょう
geth --datadir eth_private_net --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" console
ユーザ作成
一人だけだと何やってるかさっぱりなので、一応二人作って変化を見ていこうと思います。
geth
コマンドでconsole
を入れているとコンソールの>
が出ていますので、以下の通り実行して二人のユーザを作成して下さい。
> personal.newAccount("pass1") > personal.newAccount("pass2") // ユーザ確認。上手くいってれば二つの値が表示される > eth.accounts ["0x05b52fcf41646bafc6506e140ab2c571b5f3e32c", "0x14c528d860980ed14719cf99958c3dfdbd6423e9"]
このユーザーのハッシュは使っていくのでメモっておいて下さい。
採掘
今後のコントラクトの実行には税金(ether)を納める必要があるので、取りあえずpass1にあたるユーザに採掘をさせてお金を稼がせておきます。(初回だけDAG ...% というのが表示されて少し時間がかかります)
> miner.start() // 採掘スタート > eth.mining // 採掘確認 > miner.stop() // よしなに採掘を止める > eth.getBalance(eth.accounts[0]) // 採掘金額を調べる 1.1178125e+21
書いていませんが、デフォルトだと最初の一人目のユーザで自動的にminer.start()
されます。変更したい場合はminser.setEtherbase(eth.accounts[1])
などやるとOKです。
感想
もう色々本の内容を読みながら「???」がずっとでっぱなしでした。
作ったユーザはどこに存在するのか
ローカルに作ってるように見えますが、実際にはマイニングすることでブロックチェーンのネットワークにブロードキャストされるのかな。 この辺の仕組みは、以下の本を読んでやっと理解できました。ビットコインの例ですが、仕組みは同じでしょう。ビーカーの例え超わかりやすい
未来を変える通貨 ビットコイン改革論【新版】 (NextPublishing)
- 作者: 斉藤賢爾
- 出版社/メーカー: インプレスR&D
- 発売日: 2017/02/17
- メディア: Kindle版
- この商品を含むブログを見る
お金の移動をしてないのに、なぜ採掘できるのか
金銭のやりとりは発生していなくてもマイニング自体はできてその報酬も払われる仕組みのようです。 genesis.jsonの難易度を変える事でその辺の動きもよくわかるかも
EVMとブロックチェーンネットワーク
この二つの違いが一番「???」でした。EVM上のコンソールで色々作業するのですが、EVMとブロックチェーンネットワーク の理解は是非とも「未来を変える通貨 ビットコイン改革論【新版】 (NextPublishing)」と「ブロックチェーン 仕組みと理論 サンプルで学ぶFinTechのコア技術」を併用しながら理解するといいかもしれません。というか前者をまず最初に読むべきでした。難しい・・・