最近暗号通貨に興味が出てきて勉強し始めたので、メモ代わりにブログを書きました。
Ethereumとは
いろいろな機能をもつビットコインの仲間で、特にアプリケーション(DApps)のスマートコントラクトのプラットフォームとして使われています。
体験してみる
はじめに
今回はgo-ethereum
というEthereumのクラアント(Ethereumのネットワークに参加するのに必要なやつ)を使って送金を試してみたいと思います。
go-ethereumって何?
Go言語で実装されたEthereumのクラアントのことで、geth
とも呼ばれています。
go-ethereumをインストールする
Macを使っているので、Homebrewを使ってインストールしました。
$ brew tap ethereum/ethereum $ brew install 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"
- 現状作成済のアカウントを確認する
> 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が反映されていることを確認しました。