Remixを使ってSolidityでトークンの発行&送付

4 min read読了の目安(約4000字

RemixによるSolidityでのトークンの発行、送付をやっていきたいと思います。

solidityとは

SolidityはEthereumのスマートコントラクトを記述する言語です。

Remixとは

https://remix.ethereum.org/
RemixはSolidity言語のコントラクトの作成・コンパイル・実行をする開発環境です。Webブラウザ上で開発を行うことができるので、面倒な環境構築が不要で、便利です。
今回は、基本的なコントラクトであるトークンの発行と送付をRemixでやってみたいと思います。

トークンの発行と送付

Solidityの日本語版ドキュメントを参考にしました。

https://solidity-jp.readthedocs.io/ja/latest/introduction-to-smart-contracts.html#subcurrency-example

コントラクトファイルの作成

Remix IDEのFile Exprolersから、+(Create New File)をクリックし、token.solを作成します。

そして、token.solにコントラクトを書いていきます。

コントラクトの記述

トークンの発行と送付を行うコントラクトは、ドキュメントをアレンジして、下記のようにします。

token.sol
pragma solidity ^0.5.0;
contract Token {
    address public minter;
    mapping (address => uint) public balances;
    constructor() public {
        minter = msg.sender;
    }
    function mint(address receiver, uint amount) public {
        require(msg.sender == minter);
        require(amount < 1e60);
        balances[receiver] += amount;
    }
    function send(address sender, address receiver, uint amount) public {
        require(amount <= balances[sender], "Insufficient balance.");
        balances[sender] -= amount;
        balances[receiver] += amount;
    }
}

まず、変数の定義です。address型変数minterは、コントラクトを作成したアドレスを格納するために用意したものです。mapping型変数balancesは、各アドレスの残高を格納するための連想配列です。
次に、functionを定義します。constructor()は、コントラクトが作成されたときに1回だけ実行されるfunctionです。
mint(address reciever, uint amount)では、トークンを発行する記述をします。受領者のアドレスrecieverに発行量amountを足すだけです。require文の部分は、

require(msg.sender == minter);

は、コントラクトの呼び出し元がminter(コントラクトの作成者)でない場合、コントラクトが実行されずリセットされます。
send(address sender, address receiver, uint amount)では、トークンを送付する記述をします。送付者senderのアドレスから送付量amountを引き、受領者recieverのアドレスにamountを足すだけです。require文の部分は、送付者のアドレスが送付量以下だった場合、"Insufficient balance"のメッセージとともにコントラクトがリセットされます。

コントラクトのコンパイルとデプロイ


コンパイルは、コンパイルタブから、"Compile token.sol"をクリックするだけです。
エラーがなければ、正常にコンパイルされます。

デプロイは、デプロイのタブから行います。今回はtoken.solに記述したTokenコントラクトをデプロイしますので、CONTRACTとして"Token - browser/token.sol"が選択されているか確認します。また、ENVIRONMENTは"JavaScript VM", "Injected Web3", "Web3 Provider"が選択できますが、今回はコントラクトの動作テストとして、一時的なブラウザ上のブロックチェーンである"JavaScript VM"を選択します。最後に、"Deploy"をクリックしてデプロイを行います。

コントラクトの実行


正常にデプロイされると、Deployed Contractsの欄にコントラクトが表示されます。ここから、コントラクトをインタラクティブに実行することができます。

まずは、mintを実行してみます。recieverにアドレス"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"、amountに"1000000"を入力し、"transact"をクリックします。このアドレスは、コントラクト作成者のアドレスである必要があります。
[vm] from: 0x5B3...eddC4to: Token.mint(address,uint256) 0xB30...Ea098value: 0 weidata: 0x40c...f4240logs: 0hash: 0x0c8...416d7
とコンソールに表示されました。チェックマークが出ていれば正常に実行されています。

トークンがちゃんと発行されているかどうか確認してみましょう。コントラクト中で定義したbalances変数は簡単に確認することができて、balancesの欄にアドレス"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"を入力し、"call"をクリックします。すると、0:uint256: 1000000 と表示され、該当するアドレスに1000000トークンが入っていることがわかります。

同様に、sendを実行します。今度は、1000000トークンをすでに入金している"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"をsender、"0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2"をrecieverに設定し、"transact"をクリックします。
トークンが送付されているか確認しましょう。アドレス"0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2"のbalancesを見てみると、

1000000トークンが入っていることがわかります。一方、送付元の"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4"のbalancesを見てみると、

0トークンとなっていることがわかります。

今回は、Remixでブラウザ上でSolidityによるトークンの発行&送付をトライしました。ブロックチェーン的な面白さはあまりありませんが、面倒な環境構築がいらないので、Solidityによるスマートコントラクトの勉強は始めやすいと思います。