shivaseの日記

SIer→Web→教師→SIer→ベンチャー(SRE)と異色な人生を歩んでいるエンジニアの日記

ブロックチェーンを体験する 第2回 Ether(通貨)の送金

ブロックチェーンを体験する 1回目 ユーザ追加からマイニング - kegamin’s diaryの続きになります。

スマートコントラクト本格入門―FinTechとブロックチェーンが作り出す近未来がわかる

スマートコントラクト本格入門―FinTechとブロックチェーンが作り出す近未来がわかる

目標

ユーザ送金を実施し、ブロックチェーンネットワークの流れを理解する

作業の流れ

  1. 送金処理
  2. 送金処理をブロックチェーンネットワークに反映

f:id:kegamin:20170220102352p:plain

前提

ブロックチェーンを体験する 1回目 までの構築が済んでいること。

つまりgethの構築が終わっており、二人のユーザが追加されていること

gethの立ち上げ

Ethereumを立ち上げていない場合は、コンソールから以下を実行して準備しておきます。

 geth --datadir eth_private_net --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" console

送金処理

図中の①にあたる、送金処理としてuser1からuser2に1weiほど送金していきます

持っているEtherの確認

持っているEtherはeth.getBalance(eth.accounts[数値])で確認できます。

// ユーザ1人目(前回のminer.start()次第で結果は各々違うはずです)
> eth.getBalance(eth.accounts[0])
1.1678125e+21
// ユーザ2人目
> eth.getBalance(eth.accounts[1])
0

送金処理

eth.sendTransaction()コマンドを使って実際に送金してみます

> eth.sendTransaction({from: '0x05b52fcf41646bafc6506e140ab2c571b5f3e32c', to: '0x14c528d860980ed14719cf99958c3dfdbd6423e9', value: web3.toWei(1, "ether")})
Error: authentication needed: password or unlock
    at web3.js:3104:20
    at web3.js:6191:15
    at web3.js:5004:36
    at <anonymous>:1:1

という事でこのままではエラーになります。authentication neededは、user1の値を送金するのに権限が無い状態で、パスワードを知らない他のユーザーが勝手にuser1のお金を送金させない為の仕組みですね。

ユーザのunlock

今回はユーザ1(eth.account[0])から送金するので、最初に決めたパスワードを使ってpersonal.unlockAccount()を実行します

> personal.unlockAccount(eth.accounts[0],"pass1")
true
送金処理

再度実行してみましょう。すると最下行に一行トランザクションIDが表示されるようになります。

> eth.sendTransaction({from: '0x05b52fcf41646bafc6506e140ab2c571b5f3e32c', to: '0x14c528d860980ed14719cf99958c3dfdbd6423e9', value: web3.toWei(1, "ether")})
I0220 10:29:23.790159 internal/ethapi/api.go:1143] Tx(0x783e033728ca53df8741f60e3f7c28f46d060d44a62b93dc156d072c6d5902bd) to: 0x14c528d860980ed14719cf99958c3dfdbd6423e9
"0x783e033728ca53df8741f60e3f7c28f46d060d44a62b93dc156d072c6d5902bd"
>
未確定なトランザクション

しかし、この状態ではまだトランザクションはブロックチェーンネットワークに反映されていません。実際に未確定のトランザクションはeth.pendingTransactionsで見ることができるのでやってみます。

> eth.pendingTransactions
[{
    blockHash: null,
    blockNumber: null,
    from: "0x05b52fcf41646bafc6506e140ab2c571b5f3e32c",
    gas: 90000,
    gasPrice: 20000000000,
    hash: "0x783e033728ca53df8741f60e3f7c28f46d060d44a62b93dc156d072c6d5902bd",
    input: "0x",
    nonce: 2,
    r: "0xd19f4959ff8b651510c5e902d6081dbe9a34e62b536c2016ce03bfff751b1722",
    s: "0x5440c4f8095e97e30b8133f9a2c1a539fb35cafdee77a3cb75e36257071cd054",
    to: "0x14c528d860980ed14719cf99958c3dfdbd6423e9",
    transactionIndex: 0,
    v: "0x1b",
    value: 1000000000000000000
}]
>

FromTohashなどが一致しているのが確認できると思います。

また以下の通り、ユーザ2のお金はまだ移動していないのがわかります。

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

採掘処理

ここからは図中の②にあたる反映処理になります。 反映はコンソール上でminer.start()するだけで終わりですが、折角なのでブロックが進んでいることも確認しながらやってみます。

現在のブロック番号確認

現時点でどこまでブロックが作成されているか確認するために、eth.blockNumberを実行します

> eth.blockNumber
218

トランザクションの反映

では実際にブロックチェーンに反映させて、Etherを移動させてみます

> miner.start()
> I0220 10:51:45.011261 miner/unconfirmed.go:83] 🔨  mined potential block #219 [d1156880…], waiting for 5 blocks to confirm
I0220 10:51:45.011766 miner/worker.go:517] commit new work on block 220 with 0 txs & 0 uncles. Took 412.569µs
I0220 10:51:45.020900 miner/unconfirmed.go:83] 🔨  mined potential block #219 [783c564e…], waiting for 5 blocks to confirm
I0220 10:51:45.026548 miner/unconfirmed.go:83] 🔨  mined potential block #219 [dd5581bf…], waiting for 5 blocks to confirm
I

// 動き始めたので止める
> miner.stop()
true

// ブロックチェーンの確認
> eth.blockNumber
228

// 反映されたかaccount[1]の値を確認
> eth.getBalance(eth.accounts[1])
1000000000000000000

// わかりづらいのでwei値に変換してみる
> web3.fromWei(eth.getBalance(eth.accounts[1]), "ether")
1
>

ちゃんと1weiほど移動できたのが確認できました!

【スポンサーリンク】