Truffleを実行すると発生するeth-block-tracerのSyntaxErrorの解決方法
# 目次
async awaitCurrentBlockが認識出来ないというSyntaxErrorが発生し、truffle developが実行出来ないエラーの修正方法を紹介します.
# 問題
、async awaitCurrentBlock
が認識出来ないというSyntaxErrorが発生し、truffle develop
が実行出来ない.
その原因と対策です.
# 発生環境
以下の記事で作っているUbuntu17.10環境です.
5分でできるEthereum開発を快適にする仮想マシンの作成
truffleとInfura.ioを使うためのライブラリインストールコマンドは以下の通りです.
sudo apt-get update
sudo apt-get install -y nodejs npm
npm install truffle
npm install truffle-hdwallet-provider
それぞれのバージョン.
- node: 6.11.4
- npm: 3.5.2
- truffle: 4.1.7
- truffle-hdwallet-provider: 0.0.5
# 原因
原因は2つありました.
- NodeJSのバージョンが7.6未満でasync/awaitを使えないこと
- 5月1日にtruffle-hdwallet-providerの内容が大幅に変わり、async/awaitを使うようになったこと
2日前の5月1日にtruffle-hdwallet-provider@0.0.4と0.0.5が公開されていました.
npmではバージョン無指定では最新の安定版がインストールされます.
そのため4月30日と5月1日で↓の通り、バージョンが大きく進歩してコードは全く別物となっていました.
※1つのライブラリのバージョンが上がると依存しているライブラリのバージョンもあがります.
# 4月末まで
- truffle-hdwallet-provider@0.0.3
- web3-provider-engine@8.6.1
- (eth-block-trackerは不使用)
# 5月から
- truffle-hdwallet-provider@0.0.5
- web3-provider-engine@14.0.5
- eth-block-tracker@3.0.0
# 対策
- nodejs8系をインストールする
一番良い対策として、可能ならば新しいバージョンに揃えましょう.
async/awaitを使えるようにnodejsのバージョンを7.6以上に上げましょう.
以下のコマンドでUbuntuにnodejs 8系がインストールできます.
※g++などが足りないとエラーが出る場合は別途インストールして下さい.
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
- truffle, truffle-hdwallet-providerをバージョン固定でインストール
ライブラリのインストール時は常にバージョンを指定しましょう.
今回のような予期せぬエラーを防ぐために、バージョン以降のタイミングは自分でコントロールできるようにしておきましょう.
以下のコマンドで5月3日現在の最新版を固定でインストールします.
npm install truffle@4.1.17
npm install truffle-hdwallet-provider@0.0.5
# 参考
2日前5月1日に公開されていたnpmライブラリ
https://www.npmjs.com/package/truffle-hdwallet-provider
そこでweb3-provider-engine@14.0.5を使うようにする変更が入った.
web3-provider-engine@8.6.1は2017/7/29にマージ.
eth-block-trackerのasyncの行がマージされたのは2017/9/23.
https://github.com/MetaMask/eth-block-tracker/commit/b61c15a1c2048393539ecc6cf8c4edd548b0f863
つまり、web3-provider-engine@8.6.1では今回SyntaxErrorが出ていたeth-block-trackerがまだ導入されていなかった.
なんとも変化が速い分野ならではの現象でした.