WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

EthreumのプライベートネットワークをMacのローカルで立ち上げてマイニング・送金するまで

   

1. gethをインストールする

geth
Ethreumのネットワークに参加するためのCUIクライアント

brewなら以下で入る

brew tap ethereum/ethereum
brew install ethereum

2. 作業用ディレクトリ作成

mkdir ~/private_ethereum_net
PRIVATE_ETH_DATA_DIR=$_
export PRIVATE_ETH_DATA_DIR

3. Genesisブロックの作成

ブロックチェーンの一番最初のブロックであるGenesis blockを作成する。
作業用ディレクトリにgenesis.jsonを配置。

vim "$PRIVATE_ETH_DATA_DIR/genesis.json"  内容はEthereumのgenesis.jsonファイル - Qiita から拝借

4. 初期化

geth --dev --datadir $PRIVATE_ETH_DATA_DIR init "$PRIVATE_ETH_DATA_DIR/genesis.json"

–devをオプションをつけることでサイズが大きいDAGファイルの作成をスキップできる
“Successfully wrote genesis state”と表示されればOK

5. 起動

geth --networkid "10" \
     --nodiscover \
     --datadir $PRIVATE_ETH_DATA_DIR \
     --rpc \
     --rpcaddr "localhost" \
     --rpcport "8545" \
     --rpccorsdomain "*" \
     --rpcapi "eth,net,web3,personal" \
     --targetgaslimit "20000000" \
     console 2>> "$PRIVATE_ETH_DATA_DIR/geth_error.log"

“Welcome to the Geth JavaScript console!”と表示されればOK

6. アカウント作成

前項で立ち上がった対話型のコンソールでアカウントを作成する

なお、Ethereumには2種類のアカウントが存在する。
一つは EOA(Externally Owned Account) で、もう一方がContract。
ここで作成するのはEOAで、これはネットワーク参加者が取引に使うアカウント(あるEOAに対して送金するなど)となる。

以下のコマンドで作成する。

> password = 'password'  今回はローカルでのテストなので適当に設定しているが本番では複雑な書式で強度の強いパスワードを用いる必要がある
> personal.newAccount(password)
"0xc337612d45753657263d26babd9495dee776c558"

今回は送金を行うため複数アカウントを作成しておく必要があるため、上記コマンドは2回実行しておく
以下のコマンドでアカウントの一覧を確認できる

> eth.accounts
["0x7c6646d5e4e1a08381a3178a99881b528ba44c39", "0x27d02af9d6303f0eb6de3d1eaed93e716bec8a01", "0x1f2f7a5b5a388a61046a3a8c174072f5d05f3640"]

インデックスが0のアカウントは初期化時にデフォルトで作成されたアカウントで、ここではこれを使ってマイニングを行う

> eth.accounts[0]
"0x7c6646d5e4e1a08381a3178a99881b528ba44c39"
> eth.coinbase  各ノードで採掘を行う際にその報酬を紐づけるEOAのアドレスを表示するコマンド
"0x7c6646d5e4e1a08381a3178a99881b528ba44c39"
> eth.coinbase == eth.accounts[0]
true

7. マイニングする

> miner.start(2)  引数はマイニングに使用するスレッド数
null
> eth.mining  trueであればマイニング中
true

マイニング前・直後はcoinbaseの残高は0ですが、

> eth.getBalance(eth.accounts[0])
0

マイニングが成功する度に増える

> eth.getBalance(eth.accounts[0])
300000000000000000000

なお、getBalanceメソッドの返り値の単位はweiなので、これをetherに変換して表示するには以下のコマンドを実行する

> web3.fromWei(eth.getBalance(eth.accounts[0]))
300

8. 送金する

送金はeth.sendTransactionコマンドで行う
送金元はコインベースで、送金先は先ほど手動で作成したアカウントとする
なお、送金額を指定するvalueの値はwei単位で指定が必要だがここでは1etherを動的にweiに変換している

> eth.sendTransaction({ from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, "ether")})
Error: authentication needed: password or unlock

“Error: authentication needed: password or unlock”は送金元であるアカウントのロックを解除していないため発生するエラー
以下のコマンドで解除できる

> personal.unlockAccount(eth.accounts[0])
Unlock account 0x7c6646d5e4e1a08381a3178a99881b528ba44c39
Passphrase: 今回は特に設定してないので空エンターでOK
true

これで送金できるようになる

> eth.sendTransaction({ from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(1, "ether")})
"0xf2bab8fa5ffe27f70a8dbec6c24aca0000d2bdbe2902781d020b8b49834b94e6"
> web3.fromWei(eth.getBalance(eth.accounts[1]))
1

あとマイニングしたままにしてるとPCに無駄な負荷がかかるのでgethを終了しておく(Geth/v1.8.1では、ここで使っている対話型コンソールの終了でマイニングもストップした。コンソール閉じたくない場合はminer.stop()でマイニングだけ止めれる)

以上、初期化から送信まででした

 - Ethreum , , , , , ,