Macbookを持っていて日常的に使うが、ターミナルを開いて作業することはない方と、「ブロックチェーンアプリケーション開発の教科書」という技術書を読んでみました。そのとき受けた質問やつまづいた点から、初学者、初心者がハマりがちなポイントがいくつか見つかりましたので、技術書全般にある暗黙の了解的な部分も含めて、お伝えしたいと思います。
コマンドを入力するとき、> や $ はいらない
本書を読み進めると、Windowsではコマンドプロンプト、Macではターミナル(以下、用語を「ターミナル」に統一)を起動して、いわゆる黒い画面にコマンドを入力する作業が頻繁に出てきます。例えばこんな感じ。
$ mkdir ~/geth
このとき、ターミナルに入力するのは
mkdir ~/geth
のみです。$は含みません。この$はプロンプトと呼ばれる部分で、皆さんのターミナルでは、何もコマンドを入力しないでも、カーソルの左側に表示される部分が相当します。なお、geth起動後に入力するコマンドの、 > についても、入力不要です。
入力するのは基本一行
> personal.newAccount("password")
"0xf3f95gabcddeq894ufjq34jaaaaaaaaaaaaaa"
このような表記があるとき、入力するコマンドは
personal.newAccount("password")
のみです。2行目はコマンドを入力、実行(Enterキーを押す)した結果の例が表示されています。コマンドを実行したらこんな出力が出るはずですよーというのが記されているのです。ただ、例外もありまして、紙面の都合でコマンドが複数行にまたがっている場合は、全て入力する必要があります。gethの起動コマンドなどが該当します。
./geth --networkid "10" --nodiscover --datadir private_net --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" --targetgaslimit "20000000" console 2>> private_net/error.log --unlock 0xbdd56c340a347b223552cf43e1d921cd642c76e7,0xac916ecf4025a914979c4de1273e2aa4260f1218 --password ./private_net/password.txt
結構バージョンが違う
本書に限らず、開発環境やライブラリなどが、書籍発行時よりバージョンアップしていて、「コードを本に書いてある通り写したのに動かない」ことが多々あります。本書で扱っているスマートコントラクトのような、特に動きの速い技術分野については、数ヶ月単位でガラッと変化してしまいますので、そういったケースに遭遇しやすいです。
私が手にしているのは初版1刷でした。(刷数で書籍の内容が割と書き換わっています)。これを元に、本稿執筆時点(2018/12)で、気になった点とその解決方法について挙げておきます。
Remix
Solidityバージョン指定
7章にてRemixでSolidityを書きますが、Remix上で”pragma solidity”文が効きませんでした。よってコンパイラのバージョン指定がソースコード上から指定できず、コンパイルエラーが発生します。
解決するには、Remixページの右側、Compileタブをクリックし、”Select new comipler version”のリストボックスをクリック、solidityのバージョンを直に指定する必要があります。
コンストラクタの起動
コントラクトをデプロイしてもコンストラクタが動きませんでしたので、デプロイ後に手動実行しました。
Homebrewインストール
MacにてTruffleをインストールする際、Homebrewによるインストールが可能です。が、このHomebrewをインストールするためには、XCode Command Line Toolsをインストールし、インストール後にライセンス表示、同意する作業が必要になります。そして、XCode Command Line ToolsのインストールにはAppleIDとパスワードが必要です。Homebrewはパッケージ管理ツールとして便利なのでおすすめではあるのですが、設定にそこそこ手間がかかります。良好なネットワーク環境があって、30分以上かかったと思います。
ERC20トークンのコントラクト
OpenZeppelinのバージョン
刷数によって表記が違うのですが、表記通りにコマンドを実行すると、OpenZeppelinのバージョン2がインストールされることがあります。すると、書籍はバージョン1を元に書かれているため、コントラクトがさっぱり動かないという事態に陥ります。インストールされているバージョンは、以下のコマンドで確認できます。(Macの場合)
$ npm list --depth=0 | grep zeppelin
└── zeppelin-solidity@1.12.0
*zeppelin-soidityではなく、openzeppelin-solidityと表示されるかも
Windowsの場合は、grepをfindに置き換えれば良いはずです。
この、@の右側にある数字がバージョンを示しています。これが2.xxのときは、一度zeppelin-solidityをアンインストールして、再度バージョン指定してインストールします。
$ npm uninstall zeppelin-solidity
...表示省略
$ npm install zeppelin-solidity@1.12.0
StandardToken.solの位置
P.230 コード8.2.3.1: トークンのコントラクトにあるimport文にて、先ほどインストールしたzeppelin-solidityのコントラクトを読み込んでいるのですが、私の環境ではコントラクトのファイルの指定先が異なっており、コンパイルエラーになりました。私の環境で動作したコードを以下に示します。
pragma solidity ^0.4.23;
import "../node_modules/zeppelin-solidity/contracts/token/ERC20/StandardToken.sol";
contract DappsToken is StandardToken {
string public name = "NinoToken";
string public symbol = "NINO";
uint public decimals = 18;
constructor(uint initialSupply) public {
totalSupply_ = initialSupply;
balances[msg.sender] = initialSupply;
}
}
まとめ
「ブロックチェーンアプリケーション開発の教科書」を参考に、この手の技術書を読み進める上で初学者が戸惑ったポイントを、現時点での解決方法を含めて記しました。この記事が、書籍を読む上で悩んだり、困ったりしている方の一助になれれば幸いです。