shivaseの日記

SIer→Web→教師→SIer→ベンチャー(SRE)と異色な人生を歩んでいるエンジニアの日記

ブロックチェーンを体験する 1回目 ユーザ追加からマイニング

ブロックチェーンを体験する

の第1回です

スマートコントラクト本格入門―FinTechとブロックチェーンが作り出す近未来がわかる

スマートコントラクト本格入門―FinTechとブロックチェーンが作り出す近未来がわかる

目標

geth(Go版のethreum)を立ち上げ、ユーザー追加して採掘(マイニング)してみる。 最終目的はコントラクトの実行なのですが、コントラクト実行するためにはEtherが必要です。そこで少しだけ採掘をやってお金(Ether)を稼いでおきます。

作業の流れ

  1. Geth(Ethereum)環境の構築・実行
    プライベートなEthereumを構築していきます
  2. ユーザ作成
    1で作成したEthereum環境に二つのユーザを作成します。今後この二つのユーザ間でお金(ETH)をやりとりしていきます。 下図ではいきなりブロックチェーンネットワークにユーザ作成しているようになっていますが、実際には1で作成したGeth にコンソール経由で作成し、3を実行することで伝搬させていくイメージになります
  3. 採掘
    2で作成したユーザで採掘(マイニング)を実行させ、採掘した手数料としてETHを受け取ってみます。 ただし、今回実際にはブロックは作成しません

f:id:kegamin:20170217163144p:plain

前提

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)

未来を変える通貨 ビットコイン改革論【新版】 (NextPublishing)

お金の移動をしてないのに、なぜ採掘できるのか

金銭のやりとりは発生していなくてもマイニング自体はできてその報酬も払われる仕組みのようです。 genesis.jsonの難易度を変える事でその辺の動きもよくわかるかも

EVMとブロックチェーンネットワーク

この二つの違いが一番「???」でした。EVM上のコンソールで色々作業するのですが、EVMとブロックチェーンネットワーク の理解は是非とも「未来を変える通貨 ビットコイン改革論【新版】 (NextPublishing)」と「ブロックチェーン 仕組みと理論 サンプルで学ぶFinTechのコア技術」を併用しながら理解するといいかもしれません。というか前者をまず最初に読むべきでした。難しい・・・

【スポンサーリンク】