たぶん10分くらいで簡単にできるオリジナル暗号通貨の作り方。たぶん。
暗号通貨の作り方の記事はいろんなところで書かれているけど、ハードルを下げるために、ブラウザだけで オリジナル暗号通貨を作る方法をメモしておきます。
今回作るのは、暗号通貨といっても、とても簡単な Ethereum の ERC20 準拠のスマートコントラクトを使った暗号通貨(トークン)です。簡単だけど、よくある ERC20 ベースの暗号通貨と同様に MyEtherWallet とかで送ったり受け取ったりすることができます。(そもそもスマートコントラクトって何?っていう方には、『スマートコントラクト本格入門―FinTechとブロックチェーンが作り出す近未来がわかる』という本がおすすめ。)
あと、よくあるサンプルだとトークンを購入できる手段が用意されていないので、今回はいつでもだれでもトークンを購入できる機能をトークン自体に追加してみました。(一般的には、トークンそのものとは別のプログラム - クラウドセール用のプログラム等 - がトークンを一定期間購入できる機能を持っている場合が多いです。ほんとはそのほうがいいと思う。)
なお、この記事で紹介しているのは、ぼくが書いたてきとうプログラムおよびてきとうデプロイ方法であり、何かあっても一切の責任を持てないので、あくまで遊ぶときの参考程度にしてみてください。
今回つくる暗号通貨(トークン)の仕様
今回つくる暗号通貨(トークン)の仕様はつぎのとおりとします。
- ERC20 標準に準拠。この標準に準拠しておくと、多くの ICO で発行される ERC20 トークンと同様に、MyEtherWallet 等の ERC20 をサポートしている Wallet でやりとりができる。
- 最大発行数を設けることができる。
- Ether で購入することができる。
- Ether で購入するときのレートを決めることができる。
必要なもの
- Chrome ブラウザ(Chrome 拡張機能を使用するため)
- MetaMask (Chrome 拡張機能で動くウォレット https://metamask.io)
- Remix (ブラウザ上で動く Ethereum 開発環境 https://remix.ethereum.org)
それぞれの詳細については公式サイトをみてください。
準備
MetaMask をインストール、アカウントを作って、Ether を MetaMask に送っておきます。オリジナル暗号通貨のデプロイ時に Ether が必要になるためです。0.1 Ether くらいあれば足りるかと思います。Ether を持っていない方は、暗号通貨取引所で Ether を入手してください。
Remix を開いてスマートコントラクトのコードをコピペ
まず、開発環境にコードをコピペします。実はコードはすでに出来上がっていて、スマートコントラクトの作成(デプロイ)時に、引数としてトークンの名称やその他設定を渡すだけでトークンを作ることができます。
Remix はブラウザ上で動く Ethereum の開発環境です。Solidity という JavaScript ライクな言語を使用してスマートコントラクトの開発・デプロイができます。何もダウンロードしなくても https://remix.ethereum.org にアクセスすれば使えます。
Solidity や Ethereum のスマートコントラクト開発入門には、『はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門』という本がおすすめです。(ただ、Kindle 版が固定レイアウトなので、ソフトカバー版(紙の書籍)を買った方がいいと思います。)
スマートコントラクトのコードのコピペ手順
- https://remix.ethereum.org にアクセスしたら、画面左上の + ボタンを押して、新規ファイルを作成します。
- ファイル名を入力する画面が出てくるので、 EasyToken.sol とでもしておきます。OK を押すとファイルが作成されます。
- 作成したファイルに次のコードをコピペします。
コードの解説
ほとんどの説明はコメントで書いてあるので、読んでみてください。
このコードは OpenZeppelin という Ethereum のスマートコントラクト開発を簡単にしてくれる素敵なライブラリを使っているため、とても短いです。内容を理解するためには、OpenZeppelin の github リポジトリ を読み込むといいと思います。
とりあえず、このコードで大事なところは、コンストラクタの部分です。デプロイ時に渡す引数によって、今回つくる暗号通貨の詳細を決めることになります。
デプロイ時にコンストラクタに渡す引数は次のとおりです。
- トークンの初期発行数
- トークンの最大発行数
- トークンの名称
- トークンのシンボル
- トークンとEther のレート
- 新規トークン発行時に Ether を受け取るアドレス
このコードでは、通常の ERC20 トークンがもつ機能に加えて、Ether をトークンのスマートコントラクトに送付すると、送付された Ether とレートによって計算された数のトークンが新規に発行され、Ether を送付したアカウントが、新たに発行されたのトークンを取得できるようにしています。それを実現するメソッドが、issueToken メソッドです。また、暗号通貨が際限なく発行できちゃうのもどうかと思うので、一応最大発行数を設けられるようにしています。
たとえば、1 Ether を送ると、新規に 300 トークン発行できるようにレートを設定した場合、0.01 Ether を送ると、Ether を送付したアカウントに 3 トークンが付与されます。
あ、書いてておもったけど、issueToken メソッドの実装では、トークン送受信のイベントを発火させるために、tokenを付与する際にほんとは transfer メソッドを使用したほうがいいかも。Etherscan上でTokenの所有者数を簡単にみることができるので。まぁ、でも、そもそも token を issue するコントラクトは別にしたほうがいいか。
ERC20 のドキュメントに、つぎのように記載があったので、token を issue する際に、 Trasnser event を実行するように修正しました。また、デプロイ時に最初に発行するぶんのtokenについても、Trasnser event を実行するように修正しました。
Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event.
EIPs/eip-20-token-standard.md at master · ethereum/EIPs · GitHub
Remix と MetaMask を使ってデプロイ
- Remix 画面右側パネルの Run を選択し、Environment が Injected Web3、Account が MetaMask で使用中のアカウントであることを確認します。
- 赤い Create ボタンの左側の入力フィールドに、デプロイ時の引数を入力します。
- ここで入力する引数によって、トークンの詳細が決まります。
例えば、僕が実際につくった PiyoPiyoCoin では次のとおり設定しました。(アドレスだけマスクしています。)
- トークンの初期発行数: 5000兆
- トークンの最大発行数: 5000京
- トークンの名称: PiyoPiyoCoin
- トークンのシンボル: PIYOPIYO
- トークンとEther のレート: 5000兆(1ETHあたり5000兆PIYOPIYO)
- 新規トークン発行時に Ether を受け取るアドレス: 0x*****
この設定のとおりに引数を入力する場合は、カンマ区切りで次のように入力します。
"5000000000000000", "50000000000000000000", "PiyoPiyoCoin", "PIYOPIYO", "5000000000000000", "0x*****"
- 上記を参考に引数を入力したら、Create ボタンを押します。
- すると、MetaMask のポップアップが表示されるので、Gas Limit, Gas Price、トータルのトランザクション手数料を確認して問題なければ SUBMIT を押します。
- Gas Limit は自動で計算されますが、おおよそ 2,000,000 に設定しておけば問題ないと思います。Gas Price は、Ethereum ネットワークの需要が高まっていることにより高騰しているので、40 GWEI くらいにはしておいたほうがいいと思います。
- PiyoPiyoCoin の実際のコントラクト作成時のトランザクション:
https://etherscan.io/tx/0x32eebd0bd88c054f00f3d79ac85a05cb96028c40ee3bc6d43691a6e20df1292b
トークンのコントラクトアドレスを確認
しばらくして、トランザクションが成功すると、Etherscan 上でコントラクトが作成されたことがわかります。
次のスクリーンショットの、[Contract 0x**** Created] と記載されている箇所の、0x**** がトークンのコントラクトアドレスです。
PiyoPiyoCoin の場合は、0x8fBbF6223d0dB08AbC1f5EfFF65d08E29F1D7BC1 がコントラクトアドレスです。
オリジナル暗号通貨を取得
デプロイを実行したアカウントには、デプロイ時に指定した初期発行数ぶんのトークンが付与されていますが、そのほかのアカウントは、上で確認したコントラクトアドレスに Ether を送付することで、レートに応じた数のトークンを取得することができます。
取得したトークンの残高は、ERC20 をサポートしているウォレットで確認することができます。
Ether を送付してオリジナル暗号通貨を取得する方法の詳細は、前回のエントリに書いてあります。
MetaMask での確認方法
MetaMask の TOKENS タブ => ADD TOKEN ボタンを押下、Token Contract Address という項目にトークンのコントラクトアドレスを入力すると、MetaMask でトークンの残高を知ることができます。
MyEtherWallet での確認方法
View Wallet Info ページ右下の Token Balances で Add Custom Token というボタンを押して、Token Contract Address にトークンのコントラクトアドレス、Token Symbol にトークンのシンボル、Decimals に 18 と入力するとトークンの残高を知ることができます。
おわりに
以上、書きなぐってしまいましたが、いつかもしかしたら誰かの役に立てばなあと思っています。
あと、やはり実際に手を動かして本番環境で作業をしてみると気づきが多いので、ちょっとつらいけどもう少しサラリーマンとして日本円マイニングを頑張ってこつこつ日本円を Ether に変換して、もっともっとたくさん実験したいです。
オリジナル暗号通貨(トークン)を作ること自体は非常に簡単なので、それを使った何か面白いサービスをみんなが考えたり手を動かして実験するきっかけになるといいな。