先の節で、採掘の報酬としてEthereumの内部通貨であるetherを取得することができました 。この節では、採掘で得たetherを他のEOAへ送金する方法と、その際に発生するトランザクションとその手数料について見ていきます。
まず最初にもう一度、今回作成したアカウントのetherの持ち高を確認しておきましょう。
> eth.accounts // 登録されている2つのアカウントを表示。['0x24afe6c0c64821349bc1bfa73110512b33fa18e1', '0x59c444d6c4f4187d1dd1875ad74a558a2a3e20b6' ]> eth.getBalance(eth.accounts[0]) // etherbaseである1番目のアカウントにetherの持ち高がある(採掘の報酬)。'72500000000000000000'> eth.getBalance(eth.accounts[1]) // 2番目のアカウントにはetherの持ち高はない。'0'
accounts[0]
のEOAは、725 ether を保有している一方で、もう一方のaccounts[1]
のEOAはetherを保有していないのがわかります。
この状態でaccounts[0]
から、accounts[1]
へ、5 ether を送金します。送金はeth.sendTransaction
コマンドを用います。ここでfrom
に送金元アドレス、to
に宛先アドレス、value
に送金額を指定します。なお、実際には送金時に送金元のアカウントのロックの解除が事前に必要なので解除を行った後に送金を行います。
> personal.unlockAccount(eth.accounts[0]) //アカウントのロック解除。パスワードを求められるので、適宜パスワードを入力する。Unlock account 24afe6c0c64821349bc1bfa73110512b33fa18e1Passphrase:true> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[1], value: web3.toWei(5, "ether")}) //送金の実行。実行結果としてトランザクションIDが返される。'0xc86c2a5bdf651f54095eca87e487d4f68f12030dd559f0377e9e7bf1566b9b28'
送金額はweiの単位での指定のため、単位変換関数であるweb.toWeiを用いています。このコマンドを実行すると、実行結果としてトランザクションIDが返されます。コマンド実行後、しばらくして送金先のether保有額を確認すると、下記のように、問題なく5 ether (= 5 × 10^18 wei) が送金されていることが分かります。
> eth.getBalance(eth.accounts[1])'5000000000000000000'
【注意】送金の際は、採掘処理をバックグラウンドで実行しておく必要があります。今回の例ではテスト・ネットでの送金であり、採掘者は自分自身しかいないため、自身が採掘を実行中でないとトランザクションが処理されません。
同じように今度は逆に、'0x59c44...'のアカウントから、'0x24afe...'に 3 ether 送金してみましょう。(ここでは省略しましたが、先と同様送金(eth.sendTransactionコマンドの実行)の前に送金元のアカウントのロック解除を行う必要があります。)
> eth.getBalance(eth.accounts[1]) //保有額を確認。最初に送金された 5 ether を保有している。'5000000000000000000'>> eth.sendTransaction({from: eth.accounts[1], to: eth.accounts[0], value: web3.toWei(3, "ether")}) // 3 ether を'0x24afe...'に送金。'0x5fd0bdcccb379a8b4034668464ad9a499a8a6b7801ed66ac23e4df3d67ec64a5'>> eth.getBalance(eth.accounts[1]) // 送金後の保有額を確認。 5 - 3 = 2 ether のはずが・・・・'1998825500779091000'
5 ether 保有していた状態から、3 ether 送金したため、'0x59c44...' のアカウントの ether保有額は 2 ether と予想されるのですが、実際には 2 ether よりも小さい額になっています。
実は、この送金額以上に引かれた差額分(1,174,499,220,909,000 wei)がトランザクションを生成した際に採掘者に対して支払うトランザクション手数料となっており、採掘者の報酬に加えられます。
ここで、トランザクションについてもう少し詳しく調べてみましょう。トランザクションの情報はeth.getTransaction(tx_id)
コマンドで調べることができます。先ほど行ったaccounts[1]
のアドレスから 3 ether 送金した際のトランザクションの情報を見てみます。パラメーター、tx_id
には、送金実行時に返されたトランザクションIDを指定します。
> eth.getTransaction('0x5fd0bdcccb379a8b4034668464ad9a499a8a6b7801ed66ac23e4df3d67ec64a5'){blockHash: '0xeef0f74bc51ecb9f3d64099fa4f3c1651af36a632380d41dd987e8e7064a5276',blockNumber: 11076,from: '0x868d840e872df5134a3be6f7b68e52cb680fe3ac',gas: 90000,gasPrice: '55928534329',hash: '0x5fd0bdcccb379a8b4034668464ad9a499a8a6b7801ed66ac23e4df3d67ec64a5',input: '0x',nonce: 0,to: '0x2efbdc840746c862b63077643e5b7dd8bebb8448',transactionIndex: 0,value: '3000000000000000000'}
主な項目について簡単に見ていきましょう。
blockHash
& blockNumber
:このトランザクションを含んだブロックのヘッダ・ハッシュとブロック高を示しています。まだこのトランザクションを含んだブロックが採掘されていないときには、これらのフィールドは空の状態で表示されます。
gas
:トランザクションの処理時のgasの使用量の「最大値」を示しています。(実際のトランザクション処理時のgasの使用量ではないので、注意してください。実際にトランザクション処理時に使用されたgasの量を知る方法は下記のTIPを参照ください。)
gasPrice
:トランザクションの処理時に採掘者に支払う1 gas 当たりの手数料(wei)を示しています。
from
& to
& value
:それぞれ、トランザクションにより送金する送金元、宛先、送金額(wei)を示しています。
上記のようにトランザクション情報で表示されるgas
の量は、トランザクションの処理時に許容する「最大」gas使用量を示していました。では、実際に今回のトランザクションにどれだけのgasを使用したのかを知るためにはどうしたらよいのでしょうか?今回のトランザクションの手数料は先に書いたとおり、1,174,499,220,909,000 wei でした。またトランザクションの情報から1 gas 当たりの手数料gasPrice
は 55,928,534,329 wei と分かるので、実際に今回のトランザクションで使用したgasの量は、(1,174,499,220,909,000 / 55,928,534,329) = 21,000 となり、 21,000 gas が使用されたことがわかります。