Gethでetherを送金する
前回作成した環境を使い、アカウント作成/マイニング/送金まで行っていきます。
以下コマンドでGethのインストール後、テストネットに接続します。
$ docker-compose build $ docker-compose up
起動後暫くはDAGのダウンロードが行われます。
DAGは ethereumのPoWに必要なもので、詳しくは以下を参照して下さい。
Ethash DAG · ethereum/wiki Wiki · GitHub
コンテナに接続後、Gethにアタッチします。
docker exec -i -t gethdockersample_geth_1 /bin/bash geth attach ipc://eth_data/geth.ipc
アカウントの作成
以下のコマンドでアドレスを発行します。
引数に入れたパスワードを忘れるとEtherが引き出せなくなるので注意して下さい。
0xから始まる値がアドレスとなります。
> personal.newAccount("hoge1")
> 0x3f10fa5b63d60f1bc89783a11c415b99fe5aac3a
送金受信用としてもう一つアカウントを作成します。
> personal.newAccount("hoge2")
> 0xf7637d91ab359f567e97e901bf4ef75142fb6e96
ここで作成されたアドレスの情報はkeystore配下に格納されています。
以下ファイルを移動する事で別のノードへアドレスを移動することができます。
root@943656414d81:/# ll eth_private_net/keystore/ total 16 drwx------ 2 root root 4096 Aug 12 15:49 ./ drwxr-xr-x 5 root root 4096 Aug 12 15:49 ../ -rw------- 1 root root 491 Aug 12 15:49 UTC--2017-08-12T06-49-18.310228365Z--3f10fa5b63d60f1bc89783a11c415b99fe5aac3a -rw------- 1 root root 491 Aug 12 15:49 UTC--2017-08-12T06-49-22.989639328Z--f7637d91ab359f567e97e901bf4ef75142fb6e96
マイニング
以下コマンドでマイニング開始/終了が行われます。
> miner.start() true > miner.stop() true
暫く待つと最初に作成されたアドレスにマイニング報酬が付与されます。
> eth.coinbase "0x3f10fa5b63d60f1bc89783a11c415b99fe5aac3a" > eth.getBalance(eth.coinbase) 9.575e+21

送金
マイング報酬を持つアドレス 0x3f10fa5b63d60f1bc89783a11c415b99fe5aac3a から 0xf7637d91ab359f567e97e901bf4ef75142fb6e96 へEtherを送金してみます。
送信元アドレスのロックを解除します。
> personal.unlockAccount(eth.coinbase) Unlock account 3f10fa5b63d60f1bc89783a11c415b99fe5aac3a Passphrase: true
10ETHを送金します。実行後にトランザクションのアドレスが発行されます。
> eth.sendTransaction({from: eth.coinbase, to: "0xf7637d91ab359f567e97e901bf4ef75142fb6e96", value: web3.toWei(10, "ether")})
"0x161da21dfe25da7920bd084c33f66863dedac0248dd92ccb84bdd11e09c33e58"
直後に受取側の残高を確認します。
> eth.getBalance('0xf7637d91ab359f567e97e901bf4ef75142fb6e96')
0
この時点ではまだ送金トランザクションがブロックに取り込まれていないため、残高が反映されていません。 マイニングを開始し、残高を確認します。
> miner.start()
> true
> eth.getBalance('0xf7637d91ab359f567e97e901bf4ef75142fb6e96')
10000000000000000000
10000000000000000000wei がアドレスに反映されています。
weiとはetherの最小単位であり、1weiは1etherの10^-18です。
10etherを受け取ったアドレスから5etherを送り返します。
> eth.sendTransaction({from: "0xf7637d91ab359f567e97e901bf4ef75142fb6e96", to: eth.coinbase , value: web3.toWei(5, "ether")})
"0x5e92caf1391a234aefa768dc8dcd32692da4412523c8c97912d3bb4227c9f4aa"
> eth.getBalance('0xf7637d91ab359f567e97e901bf4ef75142fb6e96')
4999580000000000000
5etherに加えて送金手数料として0.00042etherが余分に支払われていることがわかります。
手数料の内訳を確認するため、送金トランザクションの詳細を確認します。
> eth.getTransaction('0x5e92caf1391a234aefa768dc8dcd32692da4412523c8c97912d3bb4227c9f4aa')
{
blockHash: "0x1e7127bdba210c3a8f75d26e5508dc9ab00a51f1534543670b7b6aedcedd7435",
blockNumber: 1924,
from: "0xf7637d91ab359f567e97e901bf4ef75142fb6e96",
gas: 90000,
gasPrice: 20000000000,
hash: "0x5e92caf1391a234aefa768dc8dcd32692da4412523c8c97912d3bb4227c9f4aa",
input: "0x",
nonce: 0,
to: "0x3f10fa5b63d60f1bc89783a11c415b99fe5aac3a",
transactionIndex: 0,
value: 5000000000000000000
}
上記で手数料に関係するのは gasと gasPrice の値です。
少しややこしいのですが
gas とはトランザクション処理時の最大の 手数料値 です。
実際に発生する料金ではなく、最大で発生する可能性のある料金です。
この値は実行されるトランザクションの内容によって変動し、estimageGasメソッドを用いて見積もる事が可能です。
gasPriceとは 1 gasが何weiかを表す値です。
この値は常に変動しており、gasPriceメソッド等を用いて確認することができます。
Ethereum Average GasPrice Chart
上記の場合は、90000(gas) * 20000000000wei(gasPrice) となり、
最大で0.0018etherの手数料が発生する可能性がある、ということになります。
今回はここまで。