· ico ethereum

どんぐりコインを作ってみた

ICOで必要な新しい通貨の開発で、自分の中でずっともやもやしてたいくつかの疑問がちょっとはっきりしたので、 メモしながらみんなと共有できればと思います。

ICOしてる企業は自分独自のブロックチェーンを作ってその上に新しい仮想通貨を発行してる、ずっとそう思って来たが、 それがちょっと違ったみたいでした。そういう企業もあれば、既存のプラットフォーム(Ethereum)でコインを発行するのが普通だったみたいです。

以下、実際新しいトークンをEthereum上に作ってみた記事になります。

GitHub: https://github.com/dongri/DongriToken

まず、今回の記事で使う用語、ソフトウェア、ツールをまとめます。

Ethereum (イーサリアム)

Token (トークン)

ERC20トークン

Truffle (トリュフ)

Solidity (ソリディティ)

infura.io

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 DongriToken
$ cd DongriToken

$ truffle init
$ ls -l

$ npm -f init
$ npm install zeppelin-solidity --save
$ npm install truffle-hdwallet-provider --save

contract作成

$ vim contracts/DongriToken.sol

pragma solidity ^0.4.18;
import 'zeppelin-solidity/contracts/token/ERC20/MintableToken.sol';

contract DongriToken is StandardToken {
  string public name = "DongriToken";
  string public symbol = "DON";
  uint public decimals = 18;

  function DongriToken(uint initialSupply) public {
    totalSupply_ = initialSupply;
    balances[msg.sender] = initialSupply;
  }
}

migrate作成

$ vim migrations/2_deploy_dongri_token.js

const DongriToken = artifacts.require('./DongriToken.sol')

module.exports = (deployer) => {
  let initialSupply = 1000000e18 // 100万(初期発行量)
  deployer.deploy(DongriToken, initialSupply)
}

develop環境にデプロイ、送金確認

$ truffle compile
$ truffle develop

truffle(develop)> migrate

truffle(develop)> token = DongriToken.at(DongriToken.address)

truffle(develop)> token.name()
'DongriToken'
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/0xd1d45e794adeb5f0d6f936cb776d76c7b27cc61b

$ truffle console --network live
truffle(live)> token = DongriToken.at("0xd1d45e794adeb5f0d6f936cb776d76c7b27cc61b")

truffle(live)> token.name()
'DongriToken'
truffle(live)> token.symbol()
'DON'
truffle(live)> token.totalSupply()
BigNumber { s: 1, e: 24, c: [ 10000000000 ] }
truffle(live)>

truffle(live)> token.balanceOf("0x75d06aef44c47ed72d26cb1038727299653a2307")
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のノード同期してそれに対してデプロイしても同じ結果になると思います。(実際試してないですが)

時間あったらクラウドセールも調べようかと思います。