エンジニア

Ethereum入門 〜さくさくマイニング体験〜

Ethereum入門 〜さくさくマイニング体験〜

あけましておめでとうございます。POSチームの人見です。
2018年が始まりましたね。
2017年は2月にハンズラボに入社して、ものすごくインプットの多い1年でした。
今年はもっともっとわがままに興味のあることを突き詰めていって、
チャンスがあればハンズラボでサービス開発をしたいと思っています。
 
今年最初のテーマはブロックチェーンです。
今回はEthereum入門ということでプライベートネットを構築、マイニングと送金を試してみたいと思います。
 

Gethのダウンロード

まず、Gethを使ってプライベートネットを構築します。
https://geth.ethereum.org/downloads/
からGethをダウンロードします。

私はGeth 1.7.3 for macOSを使います。
 

Gethの設定

ダウンロードして解凍したgethファイルを「/tools/ethereum/Geth-1.7.3」 ディレクトリにコピーします。(ディレクトリはお好きなところで構いません。)

# ディレクトリの作成 権限の付与
sudo mkdir -p /tools/ethereum/Geth-1.7.3
sudo chmod 777 /tools/ethereum/Geth-1.7.3

「/tools/ethereum/Geth-1.7.3」にPATHを通します。

# ~/.bash_profileに追加
export PATH=$PATH:/tools/ethereum/Geth-1.7.3

これで準備完了です。
 

プライベートネットの構築

Genesisブロックの作成

「/tools/ethereum/Geth-1.7.3/home/eth_private_net」にgenesis.jsonを作成します。

# genesis.json
{
    "config": {
        "chainId": 15,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "nonce": "0x0000000000000042",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "difficulty": "0x00",
    "alloc": {},
    "coinbase": "0x0000000000000000000000000000000000000000",
    "timestamp": "0x00",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "extraData": "0x00",
    "gasLimit": "0x1312d00"
}

 

初期化処理

geth --datadir /tools/ethereum/Geth-1.7.3/home/eth_private_net init /tools/ethereum/Geth-1.7.3/home/eth_private_net/genesis.json

成功すればSuccessfullyとでます。

Gethを起動

geth --networkid "10" --nodiscover --datadir "/tools/ethereum/Geth-1.7.3/home/eth_private_net" --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" --targetgaslimit "2000000" console 2>> /tools/ethereum/Geth-1.7.3/home/eth_private_net/geth_err.log

「Welcome to the Geth JavaScript console!」と表示されコンソールが起動されます。
 
 

マイニングと送金

次にマイニングと送金を試してみたいと思います。
 

アカウントの作成

まず、アカウントを2つ作成します。

> personal.newAccount("password")
"0x2286b243ca02018acfdc7242ac2599184cbd942b"
> personal.newAccount("password")
"0x33d3de17f19dc658de619ae64b6b60ae2b8817b0"

アカウントの確認

# アカウント一覧
> eth.accounts
["0x2286b243ca02018acfdc7242ac2599184cbd942b", "0x33d3de17f19dc658de619ae64b6b60ae2b8817b0"]
# アカウント1
> eth.accounts[0]
"0x2286b243ca02018acfdc7242ac2599184cbd942b"
# アカウント2
> eth.accounts[1]
"0x33d3de17f19dc658de619ae64b6b60ae2b8817b0"

マイニングするアカウントの確認

> eth.coinbase
"0x2286b243ca02018acfdc7242ac2599184cbd942b"

デフォルトではアカウント1になっています。

 マイニング

# マイニング開始
> miner.start(2)
null
# マイニングしているかどうか
> eth.mining
true

この状態でしばらく待つと残高が増えていきます。

残高確認

# アカウント1の残高
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
11430
# アカウント2の残高
> web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")
0

マイニング状態で放置しておくとどんどん残高が増えていきます。

送金

アカウント1からアカウント2に送金してみたいと思います。

# パスワードを入力してロック解除
> personal.unlockAccount(eth.accounts[0])
# 送金
> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(10, "ether")})
"0x4b26f3b6c2f6312c13debe9bd0d894c73a719171d707834218d2a699fdc1cece"
# 上の送金のレスポンスを使って、トランザクションの確認
> eth.getTransaction("0x4b26f3b6c2f6312c13debe9bd0d894c73a719171d707834218d2a699fdc1cece")
# トランザクションのレシート確認 (ブロックに取り込まれていないとnullが返ってくる)
> eth.getTransactionReceipt("0x4b26f3b6c2f6312c13debe9bd0d894c73a719171d707834218d2a699fdc1cece")

 

残高確認

# アカウント2の残高
> web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")
10

無事送金できていました。めでたし。
 

マイニングの停止

最後にマイニングを停止して終わります。

# マイニングの停止
> miner.stop()
true
# マイニングしているかどうか
> eth.mining
false

 
 
以上です。
意外と簡単にできるので、ぜひぜひお試しください。
これからブロックチェーンに使ったアプリケーションを開発していこうと思っています。
2018年も一緒に楽しんでいきましょう!本年もよろしくお願いいたします。

一覧に戻る