2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ethereumのプライベートネットワークで送金してみる(Geth on macOS)

Posted at

About

前回までのあらすじ

前回は以下のことをしました。
①GethというCUIクライアントをインストールして、
②自分のプライベートネットワークで自分のブロックチェーンを作って、
③採掘してみる

※前回の記事はこちら
Ethereumのプライベートネットワークを作って採掘ごっこしてみる(Geth on macOS)

今回やること

今回は、
①バックグラウンドで採掘しながら、
②etherをほかのアカウントに送金して、
③そのトランザクションの中身をざっと眺めてみる
という内容です。

今回も引き続き、オープンソースのドキュメント「Ethereum入門」のチュートリアルの一部をがっつり参考にしています。

注意点

この記事で説明しているのは、あくまでプライベートネットワーク上での実験です。パブリックの取引や採掘には一切関与しないため、採掘して得たetherをパブリックのアカウントに送金することはできないし、ご自身のパブリックのether残高にアクセスすることもありません。

環境・知識

筆者の環境

  • macOS 10.13.4
  • Homebrew 1.6.2

必要な知識

  • ブロックチェーンに対するざっくりとした理解
  • Terminalの基本的な操作
  • 基本的なUNIXコマンド
  • JavaScriptの簡単な知識(変数代入とか、オブジェクトとか)
  • 前回までの知識

手順

  1. Gethの起動と採掘の実行
  2. 残高確認とアカウントのアンロック
  3. 送金の実行
  4. トランザクションの確認

1. Gethの起動と採掘の実行

ここは前回のおさらいです。
まずは、TerminalでGethを起動します。

Terminal
$ cd eth-private-demo # 前回作ったデータディレクトリに移動
$ geth --networkid "15" --nodiscover --datadir "./" console 2>> ./geth_err.log
Welcome to the Geth JavaScript console!

instance: Geth/v1.8.4-stable/darwin-amd64/go1.10.1
coinbase: 0xfb6ab33c38a483e20554d9a4eabb5a6f3886fb2c
at block: 4962 (Sat, 28 Apr 2018 10:07:00 JST)
 datadir: /Users/kecy/dev/src/github.com/kecbigmt/eth-private-demo
 modules: admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0

>

次に、採掘を実行します。

今回の趣旨はetherの送金ですが、ブロックチェーンでは送金のトランザクションを採掘者に記録・検証してもらわなければいけません。
自分のプライベートネットワークで発生したトランザクションを記録・検証してくれる採掘者は、もちろん自分で用意しておく必要があります。

前回同様、2番目のアカウントを採掘報酬の受取先に指定してから、miner.start()を実行します。

Terminal+Geth
> miner.setEtherbase(eth.accounts[1]) // 2番目のアカウントを採掘報酬の受取先に指定
true
> miner.start() // 採掘の開始
null
> eth.mining // 採掘中かどうか確認
true

これで採掘が開始されました。これをバックグラウンドで走らせつつ、送金処理をやってみます。

2. 残高確認とアカウントのアンロック

まずは、アカウントの残高を確認しておきます。

Terminal+Geth
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether") // 1番目のアカウント`foo`の残高を確認
0.001242
> web3.fromWei(eth.getBalance(eth.accounts[1]), "ether") // 2番目のアカウント`bar`の残高を確認
25489.998758

はい。2番目のアカウントbarにはたんまりetherが入ってて、1番目のアカウントfooには少しだけ入っています。
fooに少しだけ入っているのは、このあいだうっかりfooを報酬受取先にして採掘をしてしまったからです。本当は0にしたかった)

現在のレートで換算すると、19億円近くの資産を抱えるbarと、92円の小銭しか持たないfoo。哀れに感じたbarは、100 etherをfooに恵んであげることにしました。
※ETH/JPY 74,619(2018/4/28現在, bitFlyer)

まずは、2番目のアカウントbarのロックを解除します。前回のアカウント作成時に指定したパスワードが必要になります。

Terminal+Geth
> personal.unlockAccount(eth.accounts[1]) // ロックを解除(パスワードを要求されるので入力)
Unlock account 0x0efc6673f35b9b9489f539ea965609eb5ae587d0
Passphrase:
true

3. 送金の実行

※ほんの少しだけJavaScriptの知識がでてきます

eth.sendTransaction()で送金を実行します。引数として、送金元(from)・送金先(to)・送金額(value)をオブジェクトに入れて渡す必要があります。
また、この関数の返り値はトランザクションIDになるので、それをtxHashという変数に代入しておきます。
矢継ぎ早にeth.getTransaction(txHash)を実行して、未完了のトランザクションの情報を確認してみましょう。
(のんびりしているとバックグラウンドで実行されている採掘プロセスに拾われて、送金処理が完了してしまいます)

Terminal+Geth
> txHash = eth.sendTransaction({from: eth.accounts[1], to: eth.accounts[0], value: web3.toWei(100, "ether")})
"0x3ff59587aca8b933dc73e5971e8d9203284bf79af90d75e602897d09eb703d6d"
> eth.getTransaction(txHash)
{
  blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  blockNumber: null,
  from: "0x0efc6673f35b9b9489f539ea965609eb5ae587d0",
  gas: 90000,
  gasPrice: 18000000000,
  hash: "0x3ff59587aca8b933dc73e5971e8d9203284bf79af90d75e602897d09eb703d6d",
  input: "0x",
  nonce: 0,
  r: "0x17aeffde51d3786af2773397e4476ecd6358ef0eb592e78c0a3e462f74d0d6b7",
  s: "0x7ed0afd16fd3cbc75eb5ac9b824f59d1bd948e72a4b94714dd9ae09b5ae6a0ee",
  to: "0xfb6ab33c38a483e20554d9a4eabb5a6f3886fb2c",
  transactionIndex: 0,
  v: "0x1b",
  value: 100000000000000000000
}

fromtoにはさっき指定した送金元のアドレスと送金先のアドレスが入っていて、valueにはWei換算された送金額が記録されていることがわかります。

blockNumbernullblockHash0x00(16進数のゼロ)になっているなど、まだ採掘が完了していないこともわかります。

4.トランザクションの確認

バックグラウンドで採掘プロセスが走ったままであれば、10数秒以内に採掘が完了するはずです。
もう一度eth.getTransaction(txHash)でトランザクションの情報を確認してみましょう。

Terminal+Geth
> eth.getTransaction(txHash)

{
  blockHash: "0x5ff998808329c3a9514027bf37c7604b37c30de8da652f3cc35fb753e46fe37e",
  blockNumber: 5099,
  from: "0x0efc6673f35b9b9489f539ea965609eb5ae587d0",
  gas: 90000,
  gasPrice: 18000000000,
  hash: "0x3ff59587aca8b933dc73e5971e8d9203284bf79af90d75e602897d09eb703d6d",
  input: "0x",
  nonce: 0,
  r: "0x17aeffde51d3786af2773397e4476ecd6358ef0eb592e78c0a3e462f74d0d6b7",
  s: "0x7ed0afd16fd3cbc75eb5ac9b824f59d1bd948e72a4b94714dd9ae09b5ae6a0ee",
  to: "0xfb6ab33c38a483e20554d9a4eabb5a6f3886fb2c",
  transactionIndex: 0,
  v: "0x1b",
  value: 100000000000000000000
}

blockNumberblockHashがしっかり埋まっているので、採掘が完了していることがわかります。

web3.fromWei(eth.getBalance(アドレス), "ether")でether換算の残高も確認してみましょう。

Terminal+Geth
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether") // 1番目のアカウント`foo`の残高を確認
100.001242
> web3.fromWei(eth.getBalance(eth.accounts[1]), "ether") // 2番目のアカウント`bar`の残高を確認
25399.998758

めでたく、fooのアカウントに100 etherが送金されていることがわかります。これでfooは現在のレートで74,619,000円分のetherを恵んでもらうことができました。
※ETH/JPY 74,619(2018/4/28現在, bitFlyer)

barのアカウントからは90 etherだけ減っています。ぴったり100 etherではないのは、

  • 送金時に手数料を上乗せして残高から差し引かれた
  • 採掘報酬を受け取った(このノードの採掘報酬の受取先はbarのアドレスに指定されているため)

という理由が挙げられます。

送金手数料の計算や、トランザクション情報の詳細については次回詳しく見ていきたいなと思います。

References

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?