今2017年のスマートコントラクトは、トークンでしたら、普通に億円単位のお金を管理しているので、セキュリティは非常に重要です。そこで出てきたのは、OpenZeppelin。
OpenZeppelinは、Zeppelin Solutionsというスマートコントラクト審査サービスを提供する組織からベストのやり方を整理した内容であり、よく使われる各種スマートコントラクトを実装してオープンソースで公開しているので、それらを継承し拡張すれば、自分のコントラクトを実装できる。
今回は、OpenZeppelinを使ってERC-20トークンを作って、送金したりしてみます。
フロント側準備
-
npm install -g truffle
でtruffleをインストールしておく -
truffle unbox tutorialtoken
でテンプレートを生成すると、下記の内容が生成される
![Screen Shot 0029-12-24 at 21.56.33.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F4777%2F4e2b4a56-2766-7502-421f-d88ddb72199e.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=18146e0d67c16701ba607f75a4130349)
-
npm install zeppelin-solidity
でOpenZeppelinの最新バージョンをインストールする
コントラクトを作る
- 下記内容で
contracts
配下ににTutorialToken.sol
作成する
pragma solidity ^0.4.17;
import 'zeppelin-solidity/contracts/token/StandardToken.sol';
contract TutorialToken is StandardToken {
string public name = 'TutorialToken';
string public symbol = 'TT';
uint public decimals = 2;
uint public INITIAL_SUPPLY = 15000;
function TutorialToken() public {
totalSupply = INITIAL_SUPPLY;
balances[msg.sender] = INITIAL_SUPPLY;
}
}
- 下記内容で
migrations
配下に2_deploy_tutorial_token.js
を作成する
var TutorialToken = artifacts.require("./TutorialToken.sol");
module.exports = function(deployer) {
deployer.deploy(TutorialToken);
};
-
truffle develop
で開発用チェーンを起動しておく -
migrate
を実行し、マイグレーションを実行する - 別のターミナルで
npm run dev
を実行し、開発用webサーバーを起動すると、下記のように設定した残高が表示されるはず。
![Screen Shot 0029-12-24 at 22.08.49.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F4777%2Ff0fb54c6-113e-5d66-1731-fc926dfe8dea.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=7da9047fe86236f7be59c10e6a686e73)
- ChromeでMetaMask をインストールして、接続先を「Custom RPC」選択し接続先アドレスに「http://localhost:9545 」を設定しておく
![Screen Shot 0029-12-24 at 22.11.30.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F4777%2F14a9df9e-1959-1ec1-988f-1910a9968602.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=05824c16c521ffc8ecd8d8045846275d)
![Screen Shot 0029-12-24 at 22.14.08.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F4777%2F954a148b-5f79-5c86-aef0-e621ede8f7e4.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=1b0ccb1363cfa475b45a2796a822ac40)
- 右上にあるユーザマックのアイコンをクリックし、新しいアカウントを作成する
![Screen Shot 0029-12-24 at 22.15.46.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F4777%2F7030fcc0-95e1-ebb8-1828-bef93a997ddd.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=dbf83ded34992b027694463aecc13f87)
- 新しく作成したアカウントのアドレスをコピーし、画面上のアドレス欄に入れて 500 TT を送信する
- 成功したらアラートメッセージが出て来る
![Screen Shot 0029-12-24 at 22.17.01.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F4777%2Fe29c8a5f-b56b-3287-1b69-ea20ca873a1f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=65b206766c0ba2f64920ee29beb5ce59)
- MetaMaskで残高を確認してみる
- アカウントのTokensタブでTTを追加すれば、残高がちゃんと表示される。
- 画像が 5.00 TT となっているのは、コントラクトで
uint public decimals = 2
を設定した影響です。
![Screen Shot 0029-12-24 at 22.38.40.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F4777%2F6283dd3c-81f8-2aef-45d3-47be7ee4869b.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=4c4fe7b5db344f895d29f5a3dc7b45ec)
- Token Contract Address は、
migrate
コマンドを実行したときのログから確認できる
![Screen Shot 0029-12-24 at 22.28.26.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F4777%2F60463232-87da-c835-8cc7-37df50474477.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=62e083d0351f26295e078fe57af13682)
まとめ
- 確認手順が少し多いですが、OpenZeppelinを使うことで、簡単かつセキュアなコントラクトを作成できた