自分だけのEthereum(イーサリアム)作ってみた【第三回:送金編】

ブロックチェーン

自分だけのEthereum(イーサリアム)作ってみた【第三回:送金編】

おはようございます。平野羽美です。
本シリーズは、ローカル環境上でEthereum(イーサリアム)を構築してみる方法をまとめています。第三回となる今回の記事では、アカウント間の送金処理についてご紹介していきます。


これまでの記事
第一回:準備編
第二回:マイニング編

Ethereumの概要

Ethereum(イーサリアム)は、分散アプリケーションを構築するためのプラットフォーム(OSやミドルウェアのようにアプリケーションやソフトウェアが動作する基盤となる仕組み)で、ブロックチェーン技術がベースとなっています。
分散アプリケーションについてはこちらのサイトに詳細や定義が記載されています。

これまでの一般的なシステムとは異なり、特別な権限を持った管理者がいない状態(非中央集権)でシステム全体が信頼性を保てるようにできています。
なお、ブロックチェーン技術自体の解説は、過去の記事もございますのであわせてご覧ください。

前回までのおさらい

前回記事では、AさんからBさんにETH(Ethereum上での通貨の単位)を送金する前段として、マイナー(Ethereumの維持に必要な計算能力を提供する人)がETHをマイニングする処理までをご紹介しました。今回はまず、マイナーからAさんへの送金を実施したいと思います。(下図参照)

早速送金…と進む前に、各アカウントが保持しているETHの量を確認しておきましょう。

> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
630
> web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
0
> web3.fromWei(eth.getBalance(eth.accounts[2]),"ether")
0

マイナー(eth.accounts[0])の残高が630ETH、Aさん(eth.accounts[1])とBさん(eth.accounts[2])の残高が0ETHであることを上記の結果から確認できます。

確認コマンド中で利用しているweb3は、Ethereumの処理を呼び出すライブラリの総称で、fromWei関数は、Ethereum上の最小単位であるWEIからETHに単位変換してくれる関数です。(getBalance関数では、WEIで表示されるためわかりづらくなります)

※ コマンドラインの起動方法は、第一回の記事をご参照ください。

それでは、ここから実際に送金処理を行っていきます。
まずはじめに「マイナーからAさんへの送金処理」を、その後、「AさんからBさんへの送金処理」を実施していきます。

送金処理(マイナー→Aさん)

マイニングによって取得したETHをマイナーからAさんに送金してみます。

Ethereumの送金準備

まずはアカウント間で送金を行うために、アカウントのロックを外す処理(アンロック)を行います。
アカウントのアンロックは以下のコマンドで実施できます。
※ Xの部分は0、1、2に置き換えて実行してください

> personal.unlockAccount(eth.accounts[X])

こちらのコマンドを実行すると、アカウントのアドレスが表示された後にPassphraseを尋ねられます。

Passphraseはアカウント作成時に設定した文字列で、本記事の例ではaccounts[0] = "horihori"accounts[1] = “hoge1”accounts[2] = "hoge2"、としています。

こちらのPassphraseは、一度忘れると確認する手段がないそうですので、アカウント作成時にはご注意ください。
※なお、コマンド中に出てくるpersonalやethは、Ethereum上で事前に定義(用意)されている処理をまとめたオブジェクトのようなものです

Ethereumの送金

マイナーからAさんへの送金は以下のコマンドで実行できます。

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

fromに送金元(マイナー)、toに送金先(Aさん)、valueに総金額(上記の例では100ETH)を設定します。
コマンド実行後にトランザクションIDが表示されれば処理は成功です。
では、早速各アカウントの残高を確認してみましょう。

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

……変化なし?

マイニング実行

各アカウントの残高を確認すると変化がないため、コマンド誤りもしくは送金処理が途中で失敗してしまったように見えるかもしれません。

ですが、前回のマイニング編の記事を思い出してください。
Ethereumの処理(トランザクション)は、マイニングが行われることではじめて承認されてブロックがつながっていきます。

そのため、マイニングが行われていない状態では、送金処理がまだ誰にも承認されておらず、残高にも変化がありません。
再度マイニングを実施すると送金処理が実施されます。

> miner.start()
null

※ ここで1〜2分 待機

> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
1125
> web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
100

accounts[0] = 630 – 100 + 595[マイニング分] = 1125
accounts[1] = 0 + 100[送金分] = 100

送金処理(Aさん→Bさん)

さて、いよいよ今回の目的であるAさんからBさんへの送金を実施します。
送金準備のアカウントアンロックは前の節で実施済みなので、早速送金処理を実施していきましょう。

Ethereumの送金

送金トランザクションの実行コマンドはマイナーから送金する時とほぼ同じです。
fromにAさん(accounts[1])、toにBさん(accounts[2])を設定します。

> eth.sendTransaction({
from: eth.accounts[1],
to: eth.accounts[2],
value: web3.toWei(50,"ether")})

送金処理後に再度マイニングを実施し、残高を確認しましょう。


> web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
100
> web3.fromWei(eth.getBalance(eth.accounts[2]),"ether")
0
> miner.start()
null

> web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")
49.999622
> web3.fromWei(eth.getBalance(eth.accounts[2]),"ether")
50

送金処理後の残高を確認すると、Aさんの残高が50ではなく49.999622となっています。
これは、0.000378ETHが手数料(GAS)としてマイナーに支払われたためです。

手数料の詳しい仕組みについては割愛しますが、Ethereumではトランザクションの実行時に必ず手数料が必要になる方式を取っているため、単純な送金処理を行ったとしても数ETHが手数料として支払われます。


まとめ

いかがでしたか?
これまで三回にわたってローカル環境でのEthereumの動作方法および簡単な送金処理についてご紹介してきました。

これらは、ほぼチュートリアルと同様の内容であり、Ethereumを使ったブロックチェーン開発はまだまだ奥が深い内容となっています。
今後は、Ethereumでのスマートコントラクト開発やDApps開発についても記事としてお伝えしていきます。

また、未来技術推進協会でも、ブロックチェーンをはじめとした技術分野に関する講演会や講座を実施していく予定です。
興味のある方は、こちらも是非ご参加いただければと思います。

以上、平野でした。

参考