こんにちは、今日はブロックチェーンのお話です。私は学生の頃ブロックチェーンというものに惹かれていました。ブロックチェーンに関するブログを書いていたことがあるくらい魅了されていました。当時はその考え方や実現できることに可能性を感じていました(今も)。
今日はそんなブロックチェーンに久しぶりに触れてみようと思います。何か目的があるわけではありません。今日は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共催】エンジニアのためのエンタープライズブロックチェーン超入門に参加してきます。非常に楽しみです。
*実はこのウェビナーが今日開催されるため、今日の記事でブロックチェーンを扱いました。
本日も最後までご覧いただきありがとうございました。
コメント