Blockchain
Ethereum

go-ethereum (geth) で送金してみる

前回 につづき、
渡辺・松本・西村・清水(2017)『はじめてのブロックチェーンアプリケーション』翔泳社
を参考に、ブロックチェーンの実装を試している。

概要

前回 立ち上げた geth で以下の操作を行う

  • アカウントを作成
  • マイニング
  • 送金

geth を起動する

フォアグラウンドで起動した

$ geth --networkid 4649 --nodiscover --maxpeers 0 --datadir ~/eth/data_testnet console 2>> ~/eth/data_testnet/geth.log
>

アカウント(EOA)を作成する

送金用のアカウント(EOA)を作成する。
A さんから B さんに送金するので、アカウントを2つ作成する。

> personal.newAccount("pass0")
> personal.newAccount("pass1")

確認する

> eth.accounts
["0x9243861e2eaf17d07a4b7d3cea8b6d36cafdc107", "0xf0e88a84e2ec8cc0e97df28442c508fd8cad7ce2"]

マイニングする

送金の原資として、マイニング報酬を利用するために、まずマイニングを行う。

マイニング報酬を受け取るアカウントを確認する

マイニング成功時に報酬を受け取るアカウントを確認する。最初に作成したEOAが報酬を得られるようだ。

> eth.coinbase
"0x9243861e2eaf17d07a4b7d3cea8b6d36cafdc107"

アカウントの残高を確認する

> eth.getBalance(eth.accounts[0])
0

マイニングを開始する

> miner.start(1)

注)

  • パラメータはマイニングを行うスレッド数。
  • 初回はDAG( Direct acyclic grapf )の生成が行われるため、マイニングが行われるまで時間がかかる  DAG ファイルは、ASIC耐性のために作成される1GBのファイルで、3万ブロック(約125時間)ごとに再作成される。  ~/.ethash/full-R* として作成される  

マイニングの状況を確認する

マイニング中か

> eth.mining
true

ハッシュレート(マイニングの計算力)を調べる。
なぜ0なんだろう。。

> eth.hashrate
0

ブロック高*を確認する。
*ブロック高とは、ジェネシスブロックを 0 とした時にそのブロックが何番目のブロックにあたるかを指す。

> eth.blockNumber
418

マイニングを止める

> miner.stop()
true

マイニング報酬を確認する

ブロック高を確認

456ブロック

> eth.blockNumber
456

残高を確認

■wei
2.28e+21 wei

> eth.getBalance(eth.coinbase)
2.28e+21

■ether
weiをetherに変換して表示する

> web3.fromWei(eth.getBalance(eth.coinbase), "ether")
2280

1wei = 0.000000000000000001ether
http://www.tottemoyasashiibitcoin.net/entry/2017/10/01/090847

■円?

感覚がわからないので、余興としてパブリックな ethereum の場合の円貨を求めてみた。

2280 ether = 126,675,842.4 JPY

https://www.coingecko.com/ja/%E7%9B%B8%E5%A0%B4%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88/%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%AA%E3%82%A2%E3%83%A0/jpy

送金する

ロックを解除する

送金元のアカウントに手数料が発生するので、デフォルト状態ではロックされているらしい。ロックを解除する。

> personal.unlockAccount(eth.accounts[0], "pass0")
true

アカウント1からアカウント2へ送金する。

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

トランザクションを確認する。

> eth.getTransaction("0xc848cb5724a49d89e882139ffe86ae1901d2d39e16603b3f4ce3a65445801ce3")
{
  blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000",
  blockNumber: null,
  from: "0x9243861e2eaf17d07a4b7d3cea8b6d36cafdc107",
  gas: 90000,
  gasPrice: 18000000000,
  hash: "0xc848cb5724a49d89e882139ffe86ae1901d2d39e16603b3f4ce3a65445801ce3",
  input: "0x",
  nonce: 0,
  r: "0x8347332a80a4009c3763169df01a6c7b99fdfe88f8f246335f948f7b0fb446aa",
  s: "0x67118045bbe425bcc0412baaab48031934d27b79d1ba970c2e27a991385d254b",
  to: "0xf0e88a84e2ec8cc0e97df28442c508fd8cad7ce2",
  transactionIndex: 0,
  v: "0x41",
  value: 10000000000000000000
}

→blockNumber: nullとなっている。
送金したが、マイニングされていないので、pending 状態である。

マイニングする

ペンディングのトランザクションがあるか確認する

> eth.pendingTransactions
[{
    blockHash: null,
    blockNumber: null,
    from: "0x9243861e2eaf17d07a4b7d3cea8b6d36cafdc107",
    gas: 90000,
    gasPrice: 18000000000,
    hash: "0xc848cb5724a49d89e882139ffe86ae1901d2d39e16603b3f4ce3a65445801ce3",
    input: "0x",
    nonce: 0,
    r: "0x8347332a80a4009c3763169df01a6c7b99fdfe88f8f246335f948f7b0fb446aa",
    s: "0x67118045bbe425bcc0412baaab48031934d27b79d1ba970c2e27a991385d254b",
    to: "0xf0e88a84e2ec8cc0e97df28442c508fd8cad7ce2",
    transactionIndex: 0,
    v: "0x41",
    value: 10000000000000000000
}]

マイニングする

マイニングを開始する。ペンディング中のトランザクションがなくなったらマイニングを終了する。

> miner.start(1)
null
> eth.pendingTransactions
[]
> miner.stop()
true

残高を確認する

送金先の残高

> eth.getBalance(eth.accounts[1])
10000000000000000000

送金元の残高

> eth.getBalance(eth.accounts[0])
2.285e+21

補足

今回は geth をフォアグラウンドで起動し、コンソールでオペレーションしました。
JSON-RPC で接続し、HTTP でリクエストするほうが普通なんでしょうね。

以上