Remix (Browser-Solidity)のJavaScript VM上でコントラクトを生成し、そのコントラクトにehterを送金してみます。
JavaScript VMを利用すると、ブラウザー上でイーサリアムのノード無しに擬似的にコントラクトを実行することができます。またサンプルとしてあらかじめehterを保持したアカウントも用意されています。
関連ページ
Remix (Browser-Solidity)を利用する[Hello World]
Ethereumのアカウントについて
Ethereumのアカウントは、大きく2つに分類することができます。
1つ目はEOA(Externally Owned Account)と呼ばれるユーザーのアカウントで、ビットコインと同様にそのアカウントに紐づく残高と秘密鍵を有しています。2つ目はコントラクト自体のアカウントで、秘密鍵はありませんが残高を有することが可能です。
EOAからコントラクトにetherが送金されることによって、そのコントラクト内の関数が実行されていきます。これがEthereumにおいて狭義の上でのスマートコントラクトの定義と言っても良いでしょう。
今回はRemix(browser-solidity)を利用し、JavaScript VM上で作成したコントラクトに対して、ユーザーAから1ether、またユーザーBから2etherを送金してみます。
本記事の説明では下記の画像のようにJavaScript VM上でサンプル的に生成されたEOAアカウントを利用しています。ユーザーAとユーザーBは下記のアカウント(アドレス)となっているので、適宜ご自身の環境に合わせてご参照下さい。
1 2 3 4 |
ユーザーA 0xca35b7d915458ef540ade6068dfe2f44e8fa733c ユーザーB 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c |
etherを受け取るコントラクト
1 2 3 4 5 6 7 8 9 10 11 12 |
pragma solidity ^0.4.11; contract receiveEther { address public sender; uint public amount; function deposit() payable{ sender = msg.sender; amount += msg.value; } } |
8行目
msg.senderによって関数を呼び出したアカウントのアドレスを取得できます。
9行目
送金によって関数が呼び出された際に、msg.valueによってその送金額(単位はwei)を取得できます。weiはイーサリアムの最小単位で、1wei=0.000000000000000001etherです。
上記のコードを入力したら「Create」ボタンをクリックしてコントラクトを生成します。下の画像がコントラクト生成後のRemix画面です。選択されていたアカウント(0xca3…a733c)によるトランザクションを介してコントラクトが生成されるので、元々保持していた100EhterからGas分が消費されているのが分かります。
実際にコントラクトに対してユーザーAから1etherを送金してみます。Remix画面にて「Value」のフォームに1を入力したら単位をetherにして「deposit」ボタンをクリックして完了です。
「amount」ボタンをクリックするとコントラクトに送られたetherの総量が表示されます。単位がweiで表示されているのがわかります。また「sender」ボタンをクリックすると、送金したユーザーAのアドレスが表示されます。コントラクト自体のアドレスはreceiveEhter at 0x692…77b3a(memory)の部分で表示されているのが分かります。
続けてユーザーBから2etherを送ってみます。「Account」をユーザーBのアカウントに変更したら、「Value」のフォームに2を入力して「deposit」ボタンをクリックします。
再度「amount」ボタンをクリックしてetherの総量を確認してみて下さい。ユーザーAからの送金と合わせて3000000000000000000(3ether)と確認することができます。「sender」ボタンをクリックすると今度はユーザーBのアドレスが表示されます。
参照ページ・書籍
ZOOM
トランザクションレベルで理解する。イーサリアムの具体的な仕組みを解説
Medium
Sophie Wong