何かやってみるブログ

興味をもったことに関して書いています。技術系の記事が多いです。

go-ethereumでethereumの送金を体験してみた

最近暗号通貨に興味が出てきて勉強し始めたので、メモ代わりにブログを書きました。

Ethereumとは

いろいろな機能をもつビットコインの仲間で、特にアプリケーション(DApps)のスマートコントラクトのプラットフォームとして使われています。

bitflyer.com

体験してみる

はじめに

今回はgo-ethereumというEthereumのクラアント(Ethereumのネットワークに参加するのに必要なやつ)を使って送金を試してみたいと思います。

go-ethereumって何?

Go言語で実装されたEthereumのクラアントのことで、gethとも呼ばれています。

geth.ethereum.org

go-ethereumをインストールする

Macを使っているので、Homebrewを使ってインストールしました。

$ brew tap ethereum/ethereum
$ brew install ethereum

Installing Geth | Go Ethereum

プライベートのネットワークを構築する

今回は試すだけなので、プライベートのネットワークを構築します。

  • ディレクトリを作る。
$ mkdir sample_eth
  • ディレクトリの中にgenesis.jsonを作成して設定を書く
$ touch sample_eth/genesis.json

genesis.jsonで最初のブロックチェーンのブロックを作成する設定などを書きます。

{
    "config": {
        "chainId": 15,  
        "homesteadBlock": 0,
        "eip150Block": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "difficulty": "200000000",
    "gasLimit": "2100000",
    "alloc":{}
}
  • 初期化してデータベースを作成
$ geth --datadir sample_eth init  sample_eth/genesis.json
  • コンソールを立ち上げる。
$ geth --datadir sample_eth console
  • 別タブでattachする
$  geth attach ipc:sample_eth/geth.ipc

attachとconsoleの違いは以下のwikiに書いてあります。

JavaScript Console · ethereum/go-ethereum Wiki · GitHub

アカウントを作成する

attachしたタブのほうでアカウントを作成していきます。

  • 現状作成済のアカウントを確認する
> eth.accounts
[]

作成されていないので、空配列が帰ってきます。

  • 作成する
> personal.newAccount("passphrase")
"0xcc50ad66cc9382803ef2d841556dfd307b6c4d2a"
> personal.newAccount("passphrase2")
"0x5b849c3792f897c99a001ddf56015110f749d0ff"

www.weblio.jp

  • 現状作成済のアカウントを確認する
> eth.accounts
["0xcc50ad66cc9382803ef2d841556dfd307b6c4d2a", "0x5b849c3792f897c99a001ddf56015110f749d0ff"]

コインを獲得する

現状のコインが発行されていないので、マイニングをします。

  • Coinbase(マイニングされたらコインを獲得するアカウント)の確認
> eth.coinbase
"0xcc50ad66cc9382803ef2d841556dfd307b6c4d2a"

マイニングされたらインデックス0番目のアカウントがコインを獲得することがわかりました。

  • マイニング開始
> miner.start()
null
  • ブロックを確認
> eth.blockNumber
3

しばらく放置して確認してみると3つのブロックが作成されていることを確認しました。

  •  マイニング停止
> miner.stop()
null
  • マイナーが賞金を獲得できているかを確認
> eth.getBalance(eth.accounts[0])
10000000000000000000

なお、値の単位がweiで表示されていて値が大きすぎるので、etherに変換してみます。

> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
15

www.tottemoyasashiibitcoin.net

コインを獲得できて残高に反映されていることを確認しました。

コインを送金する

> eth.accounts
["0xcc50ad66cc9382803ef2d841556dfd307b6c4d2a", "0x5b849c3792f897c99a001ddf56015110f749d0ff"]

インデックス番号 0番のアカウントから1番のアカウントに5ether送金していきたいと思います。

  • 送信元(インデックス番号0のアカウント)をアンロック
> personal.unlockAccount(eth.accounts[0])
Unlock account 0xcc50ad66cc9382803ef2d841556dfd307b6c4d2a
Passphrase:
true
  • 0番から1番に送信
> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")})
"0x78c9f0d1c1d90dd4104ff60e23b5b7b291ffe2f04d9464ec0b38505fdcc41544"
  • マイニングをしてブロックを作成してトランザクションを承認させる
> miner.start()
null
> eth.blockNumber
4
> miner.stop()
null
  • 1番の残高をそれぞれ確認する
web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
5

1番のアカウントに5etherが反映されていることを確認しました。