ブロックチェーンを使いたくて、スマートコントラクトをデプロイまでした話

ブロックチェーン

こんにちは、今日はブロックチェーンのお話です。私は学生の頃ブロックチェーンというものに惹かれていました。ブロックチェーンに関するブログを書いていたことがあるくらい魅了されていました。当時はその考え方や実現できることに可能性を感じていました(今も)。

今日はそんなブロックチェーンに久しぶりに触れてみようと思います。何か目的があるわけではありません。今日はEthereumのスマートコントラクトを使って独自トークンを作ってみます。

今日の目標ローカルブロックチェーンネットワークにコントラクトをデプロイすることです。

下準備

まずnpmを使うのでNode.jsを入れていきたいと思います。

sudo yum install -y nodejs

npmが利用可能となったのでnpmを使ってローカルブロックチェーン環境のganache-cliとスマートコントラクト作成のためのtruffleをインストールしていきます。

sudo npm install -g ganache-cli

ganache-cliのインストールは完了しましたが、エラーが発生してしまい起動することができません。バージョンの問題のようなので、nvmをインストールします。

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

nvm install lts
nvm use --lts

すると、

ganache-cli

Ganache CLI v6.9.1 (ganache-core: 2.10.2)

Available Accounts
==================
(0) 0x15C58Ca021EbD66c4ceb6efFbA610f21C5aa2f16 (100 ETH)
(1) 0xB86b44A0a43519493A89ce4541Eadb0B82bC0C4f (100 ETH)
(2) 0xE7B1f1a4E5fC273bef3cEd075943A5dbA542A489 (100 ETH)
(3) 0x5B10fb638A74CC8047D5822B361012bc17959444 (100 ETH)
(4) 0xC3cb6dAe0F679FD4cCbfc9a2ff0343809CBCC446 (100 ETH)
(5) 0x844E83643f34b4653AabA9018b8c3b0013c60D4F (100 ETH)
(6) 0xB0Ba8A6f5486D66DB2Ea1802D331BD0138cE5bAf (100 ETH)
(7) 0x6a00b1f05944fBc3B2FE438615DC003684497A35 (100 ETH)
(8) 0x1914c77C411A8B6617B3100e32f9B7997C37f745 (100 ETH)
(9) 0xe7Ee3643796Ac89430C5B7597CF1Ab95a2ef86Ae (100 ETH)

Private Keys
==================
(0) 0x9f93e37926b4e3fd97d2f547671faae0b2f1a90a97ebeffd6bd3feedccef176d
(1) 0x31e519de52597b3046705526d31b7dd1b8c47ac04437bf2ce6f715bd2faa15b7
(2) 0xb133a91de8b5026c457bf04d5646edcba01c3b794e269ed37136316785b38665
(3) 0xbb29264c8176f0ce4774142af65b53deaefb546c0c0143bda9c135f7263cad59
(4) 0x72fe7efce1135b85ecede0983ec5d34bb9c858e3be0583b3af2f97c458422536
(5) 0x255a2b98b874df732d3c01d3d9385a84cb174c3cf17496acfa54d1a8d161fe75
(6) 0x9af206010e816b3db6b315b6460f7232a4f753121e77aa52ef8a623ccfcd0c54
(7) 0xe0c97e8965fbda74b75880cd96e2f3b6d861e832aee01a90139599b4fe0d9993
(8) 0x46fa2fe3840846e1e0bcab30eeda15aa852ec35c6b526452846903ab719e8e3f
(9) 0xd4646118a320f01afa342e73b4d637c4e7edc8562cddb195521a57eb4a3e7265

HD Wallet
==================
Mnemonic:      lucky insane garment leaf slow awesome crunch you response caution expire shop
Base HD Path:  m/44'/60'/0'/0/{account_index}

Gas Price
==================
20000000000

Gas Limit
==================
6721975

Call Gas Limit
==================
9007199254740991

Listening on 127.0.0.1:8545

無事ganache-cliが起動し、テストアカウント等も表示されました。

次にtruffleをインストールしていきます。今回使うディレクトリを適当に作り(今回はbcディレクトリとします)。

npm install -g truffle

mkdir bc
cd bc

各種設定

プロジェクトのディレクトリに移動したので、各種の設定を行います。まずtruffleの構成を行います。

truffle init

プロジェクトのディレクトリにあるtruffle-config.jsをtruffle.jsに名前を変更しganache-cliのネットワーク構成を記述します。host、portは先ほどganache-cliを起動した際に表示されたものにします。これでtruffleからganache-cliのネットワークが利用できます。

module.exports = {
  networks: {
      development: {
      host: '127.0.0.1',
      port: 8545,
      network_id: '*'
    }
  }
};

今回はEthereumのERC20に準拠したトークンの実装を行うので、OpenZeppelinを使います。

npm install zeppelin-solidity --save

スマートコントラクトの作成

コントラクトの作成

それではスマートコントラクトを作成していきます。

truffle create contract MyToken

contractsディレクトリにMyToken.solというファイルが作成されました。そこに追加記述をしていきます。ここでは参考にさせていただいているこちらのサイトのコードをお借りします。

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

contract MyToken is StandardToken { 
  string public name = "MyToken";  
  string public symbol = "MT"; 
  uint public decimals = 18; 

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

コンパイル

このコードをコンパイルします。しかしここでエラーが発生します。progmaで指定しているsolidityのバージョンが違うぞというエラーでした。0.5.16がインストールされていたので、このバージョンを指定しなければなりません。

pragma solidity ^0.5.16;

これでいいだろうとコンパイルしましたが、また同じエラーが発生しました。importしているzeppelin-solidityディレクトリにあるsolファイルのsolidityバージョンが異なっていました。以下のディレクトリあるStandardToken.solそしてさらにStandardToken.solがimportしている以下の全てのファイルのsolidityバージョンを変更しました。

bc/node_modules/zeppelin-solidity/contracts/token/ERC20/

"./BasicToken.sol";
"./ERC20.sol";
"./ERC20Basic.sol";
"../../math/SafeMath.sol";

コンパイルが通りました!

マイグレーション・デプロイ

次にマイグレーションファイルを作成します。

truffle create migration deploy_my_token

bc/migrationsディレクトリに1587522268_deploy_my_token.jsというファイルが生成されました。このファイルに以下を記述していきます。トークンの初期発行数を指定し、myTokenに渡します。

var MyToken = artifacts.require('MyToken.sol');

module.exports = function(deployer) {
  const initialSupply = 300e18;
  deployer.deploy(MyToken, initialSupply);
};

さて、これでデプロイする準備が整いました!

truffle migrate

あれ?デプロイされないぞ…以下のようなネットワーク接続がタイムアウトしたというエラーが出てしまいました。

Error: There was a timeout while attempting to connect to the network.
       Check to see that your provider is valid.
       If you have a slow internet connection, try configuring a longer timeout in your Truffle config. Use the networks

試しにtruffle networkでネットワークを確認すると。ganache-cliのネットワークがありませんでした。ganache-cliがセッション切れで起動していなかったようです。

改めてganache-cliを起動し、マイグレーションを行うと…

invalid number value (arg="_value", coderType="uint256", value=3000000000000000000)

またまたエラーが出てしまいました。どうやらuint256で指定したinitialSupplyの数値が大きすぎるようです。1587522268_deploy_my_token.jsに記述した内容を確認し、以下を修正しました。

//修正前
const initialSupply = 300e18;
//修正後
const initialSupply = 300e10;

さて、修正をして改めてマイグレーションを行うと…

1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0xedef23db55749f9f2cad25055440887ddf3aae340d240edbc22eac2a6435e6b0
   > Blocks: 0            Seconds: 0
   > contract address:    0x2B66A4871CcFBEc36E3120579299E2676Fc4C1F6
   > block number:        1
   > block timestamp:     1587528935
   > account:             0x15C58Ca021EbD66c4ceb6efFbA610f21C5aa2f16
   > balance:             99.9967165
   > gas used:            164175 (0x2814f)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.0032835 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:           0.0032835 ETH


1587522268_deploy_my_token.js
=============================

   Deploying 'MyToken'
   -------------------
   > transaction hash:    0xaf491dfcd6dfa27a6c7a7f772ad3cb2bf894b401d7793638575c654380c91c1e
   > Blocks: 0            Seconds: 0
   > contract address:    0xecBdF1F1f8D4059161b8B88896ef4d94B23a8A21
   > block number:        3
   > block timestamp:     1587528937
   > account:             0x15C58Ca021EbD66c4ceb6efFbA610f21C5aa2f16
   > balance:             99.97196452
   > gas used:            1195258 (0x123cfa)
   > gas price:           20 gwei
   > value sent:          0 ETH
   > total cost:          0.02390516 ETH


   > Saving migration to chain.
   > Saving artifacts
   -------------------------------------
   > Total cost:          0.02390516 ETH


Summary
=======
> Total deployments:   2
> Final cost:          0.02718866 ETH

無事デプロイできました!!

おわりに

今日はEthereumを使ってブロックチェーンに触れてみました。ただデプロイまでを行っただけですが、今後もブロックチェーンネタを扱えたらいいなと思います。

まだまだ理解は追いついていないところはありますが、いろいろ試してみたいと思います。さらにweb3を使ってウェブアプリとしてEthereumに繋ぐとか色々やりたいのですが、そこまで手が回りませんでした。

今日は【IBM/MS/Oracle共催】エンジニアのためのエンタープライズブロックチェーン超入門に参加してきます。非常に楽しみです。

*実はこのウェビナーが今日開催されるため、今日の記事でブロックチェーンを扱いました。

本日も最後までご覧いただきありがとうございました。

コメント

タイトルとURLをコピーしました