Home > [動画付]自分で始めるICO!スマートコントラクトを自分で作ろう。 ローカル環境構築、仮想通貨(暗号通貨)発行、送金etc

ブログ

[動画付]自分で始めるICO!スマートコントラクトを自分で作ろう。 ローカル環境構築、仮想通貨(暗号通貨)発行、送金etc

高木
Teburaを運営しておりますセームページ代表 高木 aka TeburaNinjaです。今日は、サンフランシスコから帰ってきて、現地で暗号通貨ハッカソンに参加して、自分でもトークン発行が出来るようになったので、初回として、ローカルPCにテスト環境を構築したいと思います。
高木
わかんなかったらお気軽にこちらの記事にコメント下さい。KanaeCoinが必要な方もコメント頂ければ無料で送ります。

KanaeCoin (KC) ERC20 Token Tracker
https://etherscan.io/token/0xe6559191220fa874026a8506969a844171b79cd4

高木
まずは、環境として、下記をインストール。
    PCはMac OS10.9.5
    Nodejsは8以上の安定バージョン。※僕は昔インストールした0.?だったのでエラーが出ました。
    NPM(Node Package Manager)Nodejs入れたら勝手にインストールされる。多分。。。
    Geth
    TestRPC
    動画も作りました。OSが、cent osになります。

高木
1. まずプロジェクトフォルダを作る。Macのターミナルを開いて、cd コマンドで移動して好きな場所へmkdirコマンドで、プロジェクトフォルダを作りましょう。pwdを使うとrootフォルダから自分の場所がわかって便利!ちなみにかなえは、奥さんの名前ですw右下のチャットの人が奥さんです。
takagiakihiro-no-MacBook-Pro:test1 takagiakihiro$ cd ..
takagiakihiro-no-MacBook-Pro:~ takagiakihiro$ mkdir kanaecoin
takagiakihiro-no-MacBook-Pro:~ takagiakihiro$ cd kanaecoin
高木
これで、kanaecoinといプロジェクトフォルダが出来ました。次は、truffleとnpmの初期設定を行いましょう。コマンドの意味は、init=初期設定/initializeで フォルダにtruffleフレームワークをインストールするてことだと思います。多分。
takagiakihiro-no-MacBook-Pro:kanaecoin takagiakihiro$ truffle init
Downloading...
Unpacking...
Setting up...
Unbox successful. Sweet!

Commands:

  Compile:        truffle compile
  Migrate:        truffle migrate
  Test contracts: truffle test

高木
成功すれば、Downloading が始まって、上記の文章が表示されます。詰まったらエラー文でぐぐってみてください。updateが激しいので期間指定をしてググったほうがいいかも。

高木
次に、npmをインストール。
これは、-f(force/強制)を付けたほうが良いぽい。

takagiakihiro-no-MacBook-Pro:kanaecoin takagiakihiro$ npm init -f
npm WARN using --force I sure hope you know what you are doing.
Wrote to /Users/takagiakihiro/kanaecoin/package.json:

{
  "name": "kanaecoin",
  "version": "1.0.0",
  "description": "",
  "main": "truffle-config.js",
  "directories": {
    "test": "test"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

高木
warn(注意)が出るけど、無視しちゃって良いと思います。多分。。

高木
次に、npmを使ってzeppelinを保存。

takagiakihiro-no-MacBook-Pro:kanaecoin takagiakihiro$ npm install zeppelin-solidity --save
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN kanaecoin@1.0.0 No description
npm WARN kanaecoin@1.0.0 No repository field.
+ zeppelin-solidity@1.4.0
added 1 package in 3.517s

高木
今度は、kanecoinプロジェクトフォルダの中に出来てる、contractsフォルダに、MyToken.solを移動する

高木
そして、MyToken.solを編集。

pragma solidity ^0.4.18;
import "zeppelin-solidity/contracts/token/StandardToken.sol";

contract KanaeContract is StandardToken { //MyTokenをコントラクト名KanaeContractに編集
  string public name = "KanaeCoin"; //MyTokenをKanaeCoinに編集
  string public symbol = "KC"; //シンボルのMTをKCに編集
  uint public decimals = 18;

  function KanaeContract(uint initialSupply) public { //MyTokenをコントラクト名KanaeContractに編集
    totalSupply = initialSupply;
    balances[msg.sender] = initialSupply;
  }
}

高木
その後に、MyToken.solのファイル名も、コントラクト名のKanaeContractに編集

高木
その後に、2_deploy_my_token.jsをmigrationフォルダに置いて、下記のように編集。

const KanaeContract = artifacts.require('./KanaeContract.sol') //MyTokenから名前を変更したので、MyTokenを全てKanaeContractに変更

module.exports = (deployer) => {
  let initialSupply = 100000e18 //初期発行数を決定。最初50000だったがわかりにくいので10万に変更しました。
  deployer.deploy(KanaeContract, initialSupply) //ここも忘れずKanaeContractに変更。
}
高木
ここで、pwdコマンドで現在の場所を確認しましょう。何もなければ下のはず。
takagiakihiro-no-MacBook-Pro:kanaecoin takagiakihiro$ pwd
/Users/takagiakihiro/kanaecoin
高木
ファイル編集後、コンパイルを実行
 truffle compile
Compiling ./contracts/KanaeContract.sol...
Compiling ./contracts/Migrations.sol...
Compiling zeppelin-solidity/contracts/math/SafeMath.sol...
Compiling zeppelin-solidity/contracts/token/BasicToken.sol...
Compiling zeppelin-solidity/contracts/token/ERC20.sol...
Compiling zeppelin-solidity/contracts/token/ERC20Basic.sol...
Compiling zeppelin-solidity/contracts/token/StandardToken.sol...
Writing artifacts to ./build/contracts
高木
次は、truffleを使って開発ネットワークを構築
takagiakihiro-no-MacBook-Pro:kanaecoin takagiakihiro$ truffle develop
Truffle Develop started at http://localhost:9545/

Accounts:
(0) 0x627306090abab3a6e1400e9345bc60c78a8bef57
(1) 0xf17f52151ebef6c7334fad080c5704d77216b732
(2) 0xc5fdf4076b8f3a5357c5e395ab970b5b54098fef
(3) 0x821aea9a577a9b44299b9c15c88cf3087f3b5544
(4) 0x0d1d4e623d10f9fba5db95830f7d3839406c6af2
(5) 0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e
(6) 0x2191ef87e392377ec08e7c08eb105ef5448eced5
(7) 0x0f4f2ac550a1b4e2280d04c21cea7ebd822934b5
(8) 0x6330a553fc93768f612722bb8c2ec78ac90b3bbc
(9) 0x5aeda56215b167893e80b4fe645ba6d5bab767de

Mnemonic: candy maple cake sugar pudding cream honey rich smooth crumble sweet treat
高木
成功すれば、(0)-(9)までのアカウントが出来て、(0)のアカウントを使ってる状態になります。その後migrate。
truffle(develop)> migrate
Using network 'develop'.

Running migration: 1_initial_migration.js
  Deploying Migrations...
  ... 0xb218591a56a0d282a24c7a8e8de6809967c2c9f877ec18a8ba6e486a7e1eeee0
  Migrations: 0x8cdaf0cd259887258bc13a92c0a6da92698644c0
Saving successful migration to network...
長文が続く
  sendTransaction: [Function],
  send: [Function],
  allEvents: [Function: bound ],
  address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
  transactionHash: null }
高木
今度は、冒頭の文が、truffle developになってます。その後に自分で作ったcontractにパスを通す。
truffle(develop)> KanaeContract = KanaeContract.at(KanaeContract.address)
TruffleContract {
  constructor: 
   { [Function: TruffleContract]
     _static_methods: 
長文が続く
 sendTransaction: [Function],
  send: [Function],
  allEvents: [Function: bound ],
  address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
  transactionHash: null }

高木
ちゃんと先程修正したsolファイルが適用されてるか確認
truffle(develop)> KanaeContract.name()
'KanaeCoin'
truffle(develop)> KanaeContract.symbol()
'KC'
高木
アカウントの総発行量、次に残高を確認。(0)が発行者なので、そちらを確認
truffle(develop)> KanaeContract.totalSupply() //総発行量の確認
BigNumber { s: 1, e: 23, c: [ 1000000000 ] }
truffle(develop)> KanaeContract.balanceOf(web3.eth.accounts[0]) 0の残高確認
BigNumber { s: 1, e: 23, c: [ 1000000000 ] }
truffle(develop)> KanaeContract.balanceOf(web3.eth.accounts[1]) 1の残高確認
BigNumber { s: 1, e: 0, c: [ 0 ] }
truffle(develop)> KanaeContract.balanceOf('0x627306090abab3a6e1400e9345bc60c78a8bef57') 0のアドレスを直接打って、シングルクォーテーションで囲っても確認できる。
BigNumber { s: 1, e: 23, c: [ 1000000000 ] }

高木
今ログインしてるアカウント(0)からアカウント(1)へ10000KCを送金してみる。
truffle(develop)> KanaeContract.transfer(web3.eth.accounts[1], 10000e18)
{ tx: '0xd8a127e743b33ce21872cea49bac004e359860269738e2f1defbf6b80fd10faf',
  receipt: 
   { transactionHash: '0xd8a127e743b33ce21872cea49bac004e359860269738e2f1defbf6b80fd10faf',
     transactionIndex: 0,
     blockHash: '0x4c7aee1919299f3f7b6c616511334dee12414b05fb927f0f92383bc46aa30da6',
     blockNumber: 5,
     gasUsed: 51967,
     cumulativeGasUsed: 51967,
     contractAddress: null,
     logs: [ [Object] ] },
  logs: 
   [ { logIndex: 0,
       transactionIndex: 0,
       transactionHash: '0xd8a127e743b33ce21872cea49bac004e359860269738e2f1defbf6b80fd10faf',
       blockHash: '0x4c7aee1919299f3f7b6c616511334dee12414b05fb927f0f92383bc46aa30da6',
       blockNumber: 5,
       address: '0x345ca3e014aaf5dca488057592ee47305d9b3e10',
       type: 'mined',
       event: 'Transfer',
       args: [Object] } ] }
高木
最後に送金ができたか(0)と(1)の残高確認
truffle(develop)> KanaeContract.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 22, c: [ 100000000 ] }
truffle(develop)> KanaeContract.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 22, c: [ 900000000 ] }
高木
以上になります。簡単でしたか?難しかったですか?
今度は、独自仮想通貨をライブネットワークに公開する手順など情報発信していきたいと思いますので、投げ銭を頂けますともっと頑張ります。

ビットコインアドレス
39vF92UaQNvrokXFqvYQCg7yY7Pnwc499y

ETHアドレス
0x624eC975Fc69d164b23D1Ff4961E2B7589102737

高木
RippleのCEO Bradとご飯食べたので、Rippleでも募集します!

XRPアドレス
rDz28ZDdsi2rLe1DtDuhowVuiDtAFLa8UE

高木

心配な方は、小刻みに送って、コメント頂ければ受取確認もさせて頂きます。最後に、我々は、MIT(マサチューセッツ工科大学)コンテストや大阪市などのベンチャー支援プログラムに選ばれたプロダクトでICOを行う予定です。ご興味あればご覧下さい。https://tebura.ninja/ico/?lang=ja

2 Comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です