HiÐΞClassic

ERC20トークンを作成する方法

YUTO
3 years ago
1 テストネット環境にする2. テスト用のイーサを手に入れる3. プログラミングをする自作の暗号資産を送金する参考資料

この記事では、イーサリアムプロトコルを用いた自作の暗号資産(ERC20トークン)の作り方を紹介します。
ERC20とは”Ethereum Request for Comments: Token Standard #20”の略称で、2015年11月に提案されたイーサリアムでトークンを発行するための規格のことです。
そのERC20を用いて開発されたトークンの総称をERC20トークンといいます。
ここではMETAMASKを準備しているものとして話を進めるので、必ずブラウザ拡張機能としてインストールしてください。

メインネットで暗号資産を作るとなると、送金手数料といった費用がかかるので、ここではテストネットを使います。
メインネットで作る事を考える場合、3. プログラミングをする へそのまま進んでください。

多分ですが、PolygonでERC20トークンを作成する方法は同じかと思いますので、その場合はMETAMASKをMaticにした上で3. プログラミングをする へそのまま進んでください。

1 テストネット環境にする

MERAMASKを起動したら、赤い四角で囲んだ部分をクリックしてください。

すると、以下の画面が表示されます。そうしたら「Ropstenテストネットワーク」をクリックします。

すると、以下の画面になります。

これで「Ropstenテストネットワーク」になっていることになります。

2. テスト用のイーサを手に入れる

以下のURLより、テスト用イーサを手に入れます。

https://faucet.metamask.io/

このURLに入ったら、以下の画面になります。

そうしたら「request 1 ether from faucet」をクリックしてください。
そうすると、以下の画面が出ますので、「Contact」をクリックしてください。

もう一度、「Contact」をクリックしてください。

数十秒待つと、1イーサもらえます。

3. プログラミングをする

ここではイーサリアム用プログラミング言語(solidity(ソリディティー))を書くことができるツールであるRimixを使っていきます。そこで、以下のURLをクリックしてください。

https://remix.ethereum.org/

アクセスしたらまず Environmentsで「SOLIDITY」選択してください。

その後、左端のファイルアイコンを選択してください。

次は「+」ボタンで新規のファイルを作成します。

すると名前がつけれられます。

ここではとりあえずerc20.sol という名前をつけます。
(名前自体はなんでもいいですが〇〇.solと必ず .sol をつけてください)

そして「OK」をクリックします。

ここから、プログラミングをしていきます。
以下のコードをコピーしてください。

pragma solidity ^0.6.0;

interface tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes calldata _extraData) external; }

contract TokenERC20 {
   string public name;
   string public symbol;
   uint8 public decimals = 18;
   uint256 public totalSupply;

   mapping (address => uint256) public balanceOf;
   mapping (address => mapping (address => uint256)) public allowance;

   event Transfer(address indexed from, address indexed to, uint256 value);
   event Approval(address indexed _owner, address indexed _spender, uint256 _value);
   event Burn(address indexed from, uint256 value);

   constructor(
       uint256 initialSupply,
       string memory tokenName,
       string memory tokenSymbol
   ) public {
       totalSupply = initialSupply * 10 ** uint256(decimals);
       balanceOf[msg.sender] = totalSupply;
       name = tokenName;
       symbol = tokenSymbol;
   }

   function _transfer(address _from, address _to, uint _value) internal {
       require(_to != address(0));
       require(balanceOf[_from] >= _value);
       require(balanceOf[_to] + _value >= balanceOf[_to]);
       uint previousBalances = balanceOf[_from] + balanceOf[_to];
       balanceOf[_from] -= _value;
       balanceOf[_to] += _value;
       emit Transfer(_from, _to, _value);
       assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
   }

   function transfer(address _to, uint256 _value) public returns (bool success) {
       _transfer(msg.sender, _to, _value);
       return true;
   }

   function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
       require(_value <= allowance[_from][msg.sender]);     // Check allowance
       allowance[_from][msg.sender] -= _value;
       _transfer(_from, _to, _value);
       return true;
   }

   function approve(address _spender, uint256 _value) public
       returns (bool success) {
       allowance[msg.sender][_spender] = _value;
       emit Approval(msg.sender, _spender, _value);
       return true;
   }

   function approveAndCall(address _spender, uint256 _value, bytes memory _extraData)
       public
       returns (bool success) {
       tokenRecipient spender = tokenRecipient(_spender);
       if (approve(_spender, _value)) {
           spender.receiveApproval(msg.sender, _value, address(this), _extraData);
           return true;
       }
   }

   function burn(uint256 _value) public returns (bool success) {
       require(balanceOf[msg.sender] >= _value);
       balanceOf[msg.sender] -= _value;
       totalSupply -= _value;
       emit Burn(msg.sender, _value);
       return true;
   }

   function burnFrom(address _from, uint256 _value) public returns (bool success) {
       require(balanceOf[_from] >= _value);
       require(_value <= allowance[_from][msg.sender]);
       balanceOf[_from] -= _value;
       allowance[_from][msg.sender] -= _value;
       totalSupply -= _value;
       emit Burn(_from, _value);
       return true;
   }
}

以上のコードを空白部分に貼り付けます(ペーストします)。

貼り付けると・・・

そうしたら、画面左側にあるSolidityマークをクリックします。

「Compile erc20.sol」をクリックします。

その後、画面左のEthereumマークをクリックします。

「Environment」の項目を「Injected Web3」に変更します。

ここがテストネットを利用している場合「Ropsten」になっていないならば、MetaMaskの設定をRopstenに変更してください。
またメインネットを利用している場合「mainnet」になっています

次に「Deploy」の右端「 v 」をクリックします。 

すると、以下のようなものが出ます。
ここで、供給量、トークン名、ティッカーシンボルを設定します。

InitialSupply
トークンの初期発行量(例. 2000)
発行したい枚数を半角数字で書くこと
tokenName
トークンの名前(例. YUTON)
好きなトークンの名前を英語で書くこと
tokenSymbol
トークンのティッカーシンボル
自分でつけたトークンの短縮表記を書きます。(例. YTN)
入力したら、「transact」をクリックし、登録します。

数分後、登録が完了すると、画面左下「Deployed Contracts」に表示されます。
これで、自作の暗号資産が誕生です!!

ここで、赤く四角で囲んだ所をクリックしてください。
ここをクリックすると、トークンコンタラクトアドレスを言われるものをコピーでき、METAMASKに発行したトークンを表示できるようになります。

自作の暗号資産を送金する

次に、METAMASKを起動し、赤い四角で囲んだ部分をクリックしてください。

すると、以下のようになります。

「トークンを追加」をクリックします。

①カスタムトークンと書かれている所をクリックします。
②トークンコンタラクトアドレスを貼り付ける

そうすると、トークンシンボルと小数点数が自動的に追加されます。
そしたら、「次へ」をクリックしてください。

「トークン を追加」をクリックします。

「送信」をクリックすると、トークンを送信できます。

ここで送信先のアドレスを入力してください。

そしたら、送金したい金額と送金手数料を設定できます。
設定したら、「次へ」をクリックしてください。

「確認」をクリックして、送金が完了です。

参考資料

誰でも簡単!オリジナル仮想通貨を発行する方法(https://note.com/toshitoissho/n/n93eadf07fd47)
「初心者向け」プログラミング未経験からERC20トークンを発行する方法(https://magazine.blockchaincodecamp.jp/erc20-no2/)


コメント
いいね
投げ銭
最新順
人気順
YUTO
3 years ago
コメント
いいね
投げ銭
最新順
人気順
トピック
アプリ

Astar Network

DFINITY / ICP

NFT

DAO

DeFi

L2

メタバース

BCG

仮想通貨 / クリプト

ブロックチェーン別

プロジェクト

目次
Tweet
ログイン