イーサリアムのプライベートネット上で独自のトークンを発行してみます。
開発環境
macOS High Sierra バージョン10.13.2
Geth 1.7.3-stable
Solidityを利用してトークンを発行するためのコントラクトを作成し、Remix (Browser-Solidity)でイーサリアムのプライベートネットと接続します。環境構築等については以下の関連ページをご参照下さい。
関連ページ
Ethereumプライベートネット(Geth)とRemix (Browser-Solidity)をつなぐ
前提条件として、Gethを起動した際のアカウント(アドレス)にEtherが保有されていることを確認して下さい。コントラクトの生成やその実行の際にGas(トランザクション実行で必要となる燃料/手数料)が必要となるからです。
下記のGeth起動コマンドでは、eth.accounts[0]のアカウントをアンロック(–unlock)しています。今回はこのアカウントでコントラクトを生成します。
1 |
geth --networkid "10" --nodiscover --datadir "/Users/ユーザー名/Documents/eth_private_net" --mine --unlock 0 --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" console 2>>/Users/ユーザー名/Documents/eth_private_net/geth_err.log |
Etherが保有されているか確認
1 |
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether") |
これから作成するコントラクトとその実行内容の概略は、下記のイラストで説明しています。
各アカウントのアドレスは下記のようになっています。ご自身の環境状況に合わせてご覧下さい。
1 2 |
> eth.accounts[0] "0x324b45fda436c8161120350a918bafd59d1dbed2" |
1 2 |
> eth.accounts[1] "0x56ae470b46c9a8d02a5664d31944edbb150469bd" |
Solidityでコントラクトを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
pragma solidity ^0.4.11; contract Token { //各アドレスのトークン残高 mapping (address => uint) public balanceOf; //コンストラクタ function Token(uint _supply) { balanceOf[msg.sender] = _supply; } //トークンを送る function sendCoin(address _receiver, uint _amount) returns(bool) { if (balanceOf[msg.sender] < _amount) return false; balanceOf[msg.sender] -= _amount; balanceOf[_receiver] += _amount; return true; } } |
6行目
マッピング型(いわゆる連想配列)で、アドレスとそのアドレスが保有するトークンを管理します。
9〜11行目
コントラクトがデプロイされる際に呼ばれるコンストラクタです。トークンの総発行量を決定します。今回は引数にトークンの量である1000を入力してデプロイします(入力自体はRemix画面で行います)。
14〜19行目
トークンを送る関数です。引数に送り先のアカウントのアドレスと、トークンの量を指定します。msg.senderにはこの関数(sendCoin)を呼び出したアドレスが設定されます(本記事の説明ではeth.accounts[0]のアドレス)。
Remixの画面の様子
「Account」項目がGeth起動時のコマンドでアンロック(–unlock)したアドレス(本記事の環境ではeth.accounts[0]のアドレス)であることを確認し、「Create」に1000を入力してボタンをクリックします。
プライベートネットにコントラクトのデプロイが成功すれば、上記のような画面になります。eth.accounts[0]のアカウントに1000のトークンを設定したコントラクトが生成された状態(プライベートネットにコントラクトがデプロイされた状態)です。
実際にeth.accounts[0]アカウントに1000のトークンが保有されているかを確認します。「balanceOf」のフォームにeth.accounts[0]のアドレスを入力し、ボタンをクリックします。フォームの横に0:uint256; 1000のように表示されるはずです。
1 |
"0x324b45fda436c8161120350a918bafd59d1dbed2" |
次に1000のトークンを保有しているeth.accounts[0]から、eth.accounts[1]へ200のトークンを送ります。
「sendCoin」のフォームに下記のように、eth.accounts[1]のアドレスとトークン量である200を入力してボタンをクリックします。
1 |
"0x56ae470b46c9a8d02a5664d31944edbb150469bd",200 |
もう一度「balanceOf」をクリックして下さい(eth.accounts[0]のアドレスが入力された状態で)。トークンが800に変わっています。
また「balanceOf」にeth.accounts[1]のアドレスを入力すると、受け取った200のトークンを確認することができます。
参照ページ
Create your own CRYPTO-CURRENCY with Ethereum
block-chain.jp
Ethereum Solidity で 初めてのDappを作る
Zenport Tech Club