どんぐりコインを作ってみた
ICOで必要な新しい通貨の開発で、自分の中でずっともやもやしてたいくつかの疑問がちょっとはっきりしたので、 メモしながらみんなと共有できればと思います。
ICOしてる企業は自分独自のブロックチェーンを作ってその上に新しい仮想通貨を発行してる、ずっとそう思って来たが、 それがちょっと違ったみたいでした。そういう企業もあれば、既存のプラットフォーム(Ethereum)でコインを発行するのが普通だったみたいです。
以下、実際新しいトークンをEthereum上に作ってみた記事になります。
GitHub: https://github.com/dongri/DongriCoin
まず、今回の記事で使う用語、ソフトウェア、ツールをまとめます。
Ethereum (イーサリアム)
- スマートコントラクトを実行するためのプラットフォーム。
- Ethereum Virtual Machine (EVM)
- https://www.ethereum.org/
Token (トークン)
- 独自コインのこと
ERC20トークン
- ERC20 は、Ethereum ブロックチェーン上でトークンを発行する際の標準規格。
- ERC20 に準拠したトークンであれば、無数に存在する種類のトークンを同じ枠組みで価値移転することができます。
Truffle (トリュフ)
- Ethereum開発用フレームワーク。
- トークン作成、コンパイル、デプロイなど
- http://truffleframework.com/
Solidity (ソリディティ)
- スマートコントラクトを記述するための言語。
- デファクトスタンダードになりつつある。
- https://ethereum.github.io/browser-solidity/
infura.io
- Ethereumホスティングサービス
- geth(go-ethereum)でノードの同期などしなくて済む
- https://infura.io/
metamask.io
- イーサリアムウォレット
- https://metamask.io/
必要なソフトウェアはnodejsのみです。その後はnpmで必要なモジュールをインストールします。
nodejsインストール
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
$ nvm ls-remote
$ nvm instal 8.9.4
$ nvm alias default 8.9.4
$ node -v
v8.9.4
truffleインストール
$ npm instal -g truffle
プロジェクト作成
$ mkdir DongriCoin
$ cd DongriCoin
$ truffle init
$ ls -l
$ npm -f init
$ npm install zeppelin-solidity --save
$ npm install truffle-hdwallet-provider --save
contract作成
$ vim contracts/DongriCoin.sol
pragma solidity ^0.4.18;
import 'zeppelin-solidity/contracts/token/ERC20/MintableToken.sol';
contract DongriCoin is StandardToken {
string public name = "DongriCoin";
string public symbol = "DON";
uint public decimals = 18;
function DongriCoin(uint initialSupply) public {
totalSupply_ = initialSupply;
balances[msg.sender] = initialSupply;
}
}
migrate作成
$ vim migrations/2_deploy_dongri_token.js
const DongriCoin = artifacts.require('./DongriCoin.sol')
module.exports = (deployer) => {
let initialSupply = 1000000e18 // 100万(初期発行量)
deployer.deploy(DongriCoin, initialSupply)
}
develop環境にデプロイ、送金確認
$ truffle compile
$ truffle develop
truffle(develop)> migrate
truffle(develop)> token = DongriCoin.at(DongriCoin.address)
truffle(develop)> token.name()
'DongriCoin'
truffle(develop)> token.symbol()
'DON'
truffle(develop)> token.totalSupply()
BigNumber { s: 1, e: 24, c: [ 10000000000 ] }
truffle(develop)> token.balanceOf(web3.eth.coinbase)
BigNumber { s: 1, e: 24, c: [ 10000000000 ] }
truffle(develop)> token.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 24, c: [ 10000000000 ] }
truffle(develop)> token.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 0, c: [ 0 ] }
truffle(develop)> token.transfer(web3.eth.accounts[1], 20000e18)
truffle(develop)> token.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 22, c: [ 200000000 ] }
truffle(develop)> token.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 23, c: [ 9800000000 ] }
truffle(develop)> token.totalSupply()
BigNumber { s: 1, e: 24, c: [ 10000000000 ] }
truffle(develop)>
$ truffle compile
live環境にデプロイ
$ vim truffle.js
const Web3 = require("web3");
const web3 = new Web3();
const HDWalletProvider = require("truffle-hdwallet-provider");
// process.env.MNEMONIC: metamask.io 登録時の12 wordsを記載。
// process.env.INFURA_ACCESS_TOKEN: infura.io 登録で取得したaccess tokenを記載。
// process.env.FROM_ADDRESS: metamask.io でのアカウントアドレス。
var mnemonic = process.env.MNEMONIC;
var accessToken = process.env.INFURA_ACCESS_TOKEN;
var fromAddress = process.env.FROM_ADDRESS
module.exports = {
networks: {
live: {
provider: function() {
return new HDWalletProvider(
mnemonic,
"https://mainnet.infura.io/" + accessToken
);
},
network_id: "1",
from: fromAddress,
gas: 3000000,
gasPrice: web3.toWei("10", "gwei")
}
}
};
下のコマンド実行する前に、fromに書いてるアドレスに0.1ETHぐらい入れたほうがいいです。gasが足りないと失敗します。 2018/03/04 時点で2800円ぐらいでできました。
$ truffle migrate --network live
gasPrice, gasによって違うが30分前後でデプロイできるかと思います。
トークンアドレス: https://etherscan.io/token/0x3CD3Ca5b1149E4AcB964Ed1B261478049eCdd9d6
$ truffle console --network live
truffle(live)> token = DongriCoin.at("0x3CD3Ca5b1149E4AcB964Ed1B261478049eCdd9d6")
truffle(live)> token.name()
'DongriCoin'
truffle(live)> token.symbol()
'DON'
truffle(live)> token.totalSupply()
BigNumber { s: 1, e: 24, c: [ 10000000000 ] }
truffle(live)>
truffle(live)> token.balanceOf("0x3CD3Ca5b1149E4AcB964Ed1B261478049eCdd9d6")
BigNumber { s: 1, e: 24, c: [ 10000000000 ] }
truffle(live)>
Ethersanから名前で検索できるようにする
このままだとトークンはEthereum上にデプロイされてますが、ethersna.ioから見つけることができません。 ソースコードを提出してverifyすると名前が登録されて検索できるようになるらしいです。
https://etherscan.io/address/0xd1d45e794adeb5f0d6f936cb776d76c7b27cc61b#code
zeppelin-solidityを使ったソースコードをそのまま貼り付けるとbrowse-solidityでimportできないとエラーが出るので、importされたsolファイル遡って全部コードに変換して提出します。
https://gist.github.com/dongri/4b8797bb6a907d644ccbead341259b1d
いろいろ使ってるけど
truffle, zeppelin-solidity, truffle-hdwallet-providerなど使ってるけど、生のsolidity書いて、 gethでmain net環境に接続して数十GBのノード同期してそれに対してデプロイしても同じ結果になると思います。(実際試してないですが)
時間あったらクラウドセールも調べようかと思います。