paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

ブラウザだけで暗号通貨Etherium上にオリジナルトークンを作る簡単な方法【PaizaCloud編】

f:id:paiza:20180302130304j:plain
Photo by Stock Catalog
秋山です。

皆さんは暗号通貨で遊んでいますか?最近は買ったり掘ったりするだけでなく、自分でコインを作ったり、ICOに投資したりするのも盛り上がっていますね。

今回は、Ethereumにおけるスマートコンストラクトについてと、実際に独自のトークンを発行してオリジナルの暗号通貨を作る方法などについて書いてみます。

■Ethereumについて

Ethereumの場合、通貨単位は eth 、手数料は gas という単位で動作しています。

Ethereumで"何か"したいときは、 gas が必要となります。 eth で gas を購入し、gasを使って "何か" をします。gas と eth の交換比率は自分で決められます。

まず、「Ethereum 上で eth を送金する」には 21000 gas かかります。

この場合、"eth を送金する"が "何か"にあたる部分となっていて、 "何か"というのは eth の送金には限りません。Ethereumでは、 Solidityというプログラミング言語で記述した処理を実行させることもできます。処理の複雑さ、作った人が決めたレートで gas の使用料は変化します。

こうした仕組みはスマートコンストラクトと呼ばれ、最近は「この仕組みを活用すれば、不動産の賃貸契約などにも使えるのでは?」みたいな話でも盛り上がってもいます。

ほかにも、企業などが独自のトークン(簡単に言うと権利証…みたいなもの)を発行して配って資金調達をする、ICO (Initial Coin Offering) というのもあります。詐欺などをはたらく人もいるため注意が必要な分野ですが、 Ethereum に繋がる人であれば、全世界から簡単に投資を募れるので、使い方を誤らなければよい仕組みだと思います。

で、これらの処理を実装するときのトークン規格が ERC20, ERC233, ERC721 とあります。

ERC20 は標準的なICOとかのトークン、 ERC233 はその機能拡張、ERC721 は少し前に流行った cryptokitty (Etherium で猫を育てる的なゲーム)で使われている特殊なトークンです。

PaizaCloudで独自のトークンを発行してみる

せっかくなのでPaizaCloud上で独自トークンを発行する流れを駆け足でやってみましょう。

PaizaCloudはこちら
https://paiza.cloud

◆必要な道具

  • Ethereum
  • ganache-cli:美味しそうな名前ですけど、ガナッシュイーサリアムのテストネットに繋ぐためのものです。
  • Truffle:Ethereum上での開発用のフレームワークのようなものです 。
  • Zeppelin Solidity:コンストラクトを作る便利なライブラリみたいなものです。別にこれがなくても開発できますが、開発が楽になるので。(自前で作って変なバグ仕込むよりは、Zeppelin Solidityを使ったほうがエコシステム的にもいいかと思います)

◆やってみる

PaizaCloudにログインして、eth-testというサーバを作ります。初期インストールは特に選択せず、他オプションもなしで大丈夫です。

ERC20のトークンを試しに作ってみるだけなので、無料プランで十分です。(今回はあくまで試しに触ってみるだけなので、本気でICOをするぞ!という人は自分で最適な環境を作ってやってくださいね…)
f:id:paiza:20180323180434p:plain


作ったPaizaCloudのサーバで、まずは

sudo npm install -g truffle ganache-cli

と必要なモノをインストールしましょう。(今回はあくまでPaizaCloud上での話ですので、手元のマシンでやりたい場合は、 sudo や -g オプションなどは適宜調整してください)

さらに

mkdir paiza_coin
cd paiza_coin
truffle init

でpaizaコインディレクトリを作って、truffle init コマンドを使ってテンプレート的なのを作ったら、Zeppelin Solidityも npm install します。

するとtruffleがこんな感じで
f:id:paiza:20180323181347p:plain
「Unbox successful. Sweet! (あま〜〜〜い!)」と言ってくれます。

npm install zeppelin-solidity@1.7.0

で、zeppelin-solidityがpackage.jsonないぞとかWARNINGを出してきますが、今回は使い捨てなので無視して大丈夫です。


では、PaizaCoinのコードを書いていきましょう。Solidityの拡張子は .sol ですので、PaizaCoin.solを作っていきます。

場所は truffle で生成された contracts というディレクトリ以下に作ります。


vim contracts/PaizaCoins.sol

pragma solidity 0.4.19;
 
import 'zeppelin-solidity/contracts/token/ERC20/MintableToken.sol';
 
contract PaizaCoin is MintableToken {
    string public name = 'Paiza Coin';
    string public symbol = '🍕';
}

Zeppelinの中に含まれるMintableToken.solを継承する形で、PaizaCoinを定義しました。トークンそのものを定義しています。

今回はあえてpublic symbolを 🍕 にしていますが、一般的には PAZ みたいな感じで大文字3文字のトークンシンボルが使われることが多いかと思います。(絵文字を使うことでトラブることがないとは言えないのでおすすめはできません)


続いて、クラウドセールを定義していきます。PaizaCoinの配り方を書いていきましょう。こちらもZeppelinのMintedCrowdsale.sol, TimedCrowdsale.sol を継承しつつざっくりと書いていきます。当然ですがPaizaCoin.solもimport しておきましょう。

vim contracts/PaizaCoinCrowdsale.sol

pragma solidity 0.4.19;
 
import './PaizaCoins.sol';
import 'zeppelin-solidity/contracts/crowdsale/emission/MintedCrowdsale.sol';
import 'zeppelin-solidity/contracts/crowdsale/validation/TimedCrowdsale.sol';
 
contract PaizaCoinCrowdsale is TimedCrowdsale, MintedCrowdsale {
    function PaizaCoinCrowdsale
        (
            uint256 _openingTime,
            uint256 _closingTime,
            uint256 _rate,
            address _wallet,
            MintableToken _token
        )
        public
        Crowdsale(_rate, _wallet, _token)
        TimedCrowdsale(_openingTime, _closingTime) {
        }
}

クラウドセールの定義として、PaizaCoinCrowdsaleには開始時間、終了時間、レート、財布のアドレス、対象トークン(ここでは先に作ったPaizaCoinを対象とします)などを書きました。

これらの .sol コードは、 Etherium ネットワーク上にデプロイしなくてはいけません。開発経験がある人は「herokuにデプロイ」とか「awsにデプロイ」的な意味でとらえてもらえばと思います。(←意味わからんという人は……とりあえずEtherium宛に「自分のプログラムを動かしてくださいね〜」と依頼する書類を作成する…みたいなことだと思ってください)

マイグレーションと呼ばれるもので、以下の場所に作ります。

vim migrations/2_deploy_contracts.js

const PaizaCoinCrowdsale = artifacts.require('./PaizaCoinCrowdsale.sol');
const PaizaCoin = artifacts.require('./PaizaCoin.sol');
 
module.exports = function(deployer, network, accounts) {
    const openingTime = web3.eth.getBlock('latest').timestamp + 2;
    const closingTime = openingTime + 86400 * 365;
    const rate = new web3.BigNumber(813);
    const wallet = accounts[1];
 
    return deployer
        .then(() => {
            return deployer.deploy(PaizaCoin);
        })
        .then(() => {
            return deployer.deploy(
                PaizaCoinCrowdsale,
                openingTime,
                closingTime,
                rate,
                wallet,
                PaizaCoin.address
            );
        });
};

この時、PaizaCoinCrowdsaleにはopeningTime, closingTimeと rate などを与えています。前者2つはそのままですが、 rate はPaizaCoinをどういったレートで販売するか?という意味になります。単位はethの最小単位1wei(0.000000000000000001eth)となっています。今回はせっかくなので、813(パイザ)weiとしておきましょう。


これをデプロイしていきましょう。まず、ganacheでテストネットワークにつなぐ準備をしておきます。

vim truffle.js

module.exports = {
  networks: {
    development: {
    host: "localhost",
    port: 8545,
    network_id: "*", // Match any network id
    }
  }
};

truffle.jsを上記のように編集して、development環境ではlocalhostの8545のテストネットにつなぐ旨を書いておきます。


そして、ganacheを別コンソールで開いて起動します。

ganache-cli

その後、以下のようにコンパイル、マイグレートを行います。

truffle compile
truffle migrate

こうすると、ganache-cli上にそれっぽいメッセージが出てEthereumのテストネットワークに無事デプロイされます。(ここでもWARNINGが出ますが、今回は使い捨てなので無視して大丈夫です)

あくまでganache-cliを起動した時に作られるテストネットワークのみでの話なので、本物のEtheriumには特に何も影響しません。(ganache-cliを終了させた場合は、truffle migrateから全ての手順をやり直してください。全てのテストネットワークのトランザクションはリセットされます)


では、作ったトークンにアクセスしたり、購入したりしてみましょう。

truffle console

とすると、ganache-cliで動いているEthereumのテストネットワークに接続できます。

さらにコンソールの中で

PaizaCoinCrowdsale.deployed().then(inst => { crowdsale = inst })

crowdsale.token().then(addr => { tokenAddress = addr })

tokenAddress

とすれば、クラウド情報からPaizaCoinのインスタンスへアクセスするためのアドレスが得られます。

次に

instancePaizaCoin = PaizaCoin.at(tokenAddress)

instancePaizaCoin.name()

instancePaizaCoin.symbol()

とするとPaizaCoinへアクセスして、nameやsymbolが取得でき、ピザの絵文字が出てくるかと思います。
f:id:paiza:20180323183137p:plain

◆残高取得してみる

前述のコードではやっていませんでしたが、Zeppelin上のERC20で定義された残高取得をしてみましょう。

ganache上のサンプルアドレスに紐付いたPaizaCoinの残高をチェックしてみます。0番目のアドレスを使って

purchaser = web3.eth.accounts[0]

instancePaizaCoin.balanceOf(purchaser).then(balance => purchaserGusTokenBalance = balance.toString(10))

とすると、0という結果が返ってきます。

PaizaCoinを実際に買う処理をしていきましょう。

instancePaizaCoin.transferOwnership(crowdsale.address)

PaizaCoinCrowdsale.deployed().then(inst => inst.sendTransaction({ from: purchaser, value: web3.toWei(0.01, "ether")}))

「0.01eth分買う」というのを、クラウドセールに依頼しています。

instancePaizaCoin.balanceOf(purchaser).then(balance => purchaserGusTokenBalance = balance.toString(10))

8130000000000000000 wei PaizaCoinを得ることができました。

weiは、ethの最小単位 0.000000000000000001 eth = 1wei と同意義です。ZeppelinのERC20では、18桁分を小数点以下と定義しています。ethと同様、18桁目でわかりやすいようにwei→ethと変換してみましょう。(1円=100銭みたいなものです)

web3.fromWei(purchaserGusTokenBalance, "ether")

8.13 PaizaCoinもらえた、ということになりました。

f:id:paiza:20180323183456p:plain

PaizaCoinを発行し、Ethereum上でPaizaCoinを手に入れることができました。

■まとめ

さらに機能追加などをして、オリジナルの機能を搭載させた「僕の考えた最強のコイン」をeth上に作ることも可能です。ただ、そこまで来ると独自でブロックチェーンをゼロから作ったほうが本気の「僕の考えた最強のコイン」という感じがしますね。

Ethereum上で作ると、開発のエコシステムとして各ライブラリが共有できる、高速で開発できる、すぐにethで買えて便利…などといったメリットがあるので、初心者でもやりやすいのではないかと思います。



PaizaCloud」は、環境構築に悩まされることなく、ブラウザだけで簡単にウェブサービスやサーバアプリケーションの開発や公開ができます。
https://paiza.cloud




paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

paizaのスキルチェック