ブロックチェーンアプリケーション開発の教科書を読んでハマったところメモ

ブロックチェーンアプリケーション開発の教科書 / 加嵜長門(著), 篠原航(著), 丸山弘詩(編集)を読みました。

  • 仮想通貨の基礎知識、事例:1-5章
  • Ethereumのスマートコントラクト実装:6-8章
  • 今現在議論となっているトピック、これからブロックチェーンがどうなっていくのか:9-11章

上記の構成になっており、仮想通貨界隈で議論されているトピックについて網羅的に記載されています。トピックの多さにびっくりしました。
特にエンジニアの方で、「ブロックチェーンや仮想通貨盛り上がってるけど何をしたらいいのかよくわからない」という場合は とりあえず本書を読んでおけばよいなという感じです。

そしてなんといっても本書のメインである「Ethereumのスマートコントラクト実装:6-8章」はひたすら丁寧に記載されています。各行の処理やこの関数で何をしてるのかなど。
まさに自分もライトニングネットワークというような用語となんとなくの意味はわかるものの、 スマートコントラクトの実装などになるとさっぱりという状態だったので、 本書を読むべきタイミングで読めたことをうれしく思います。

とても良かったのでおすすめしたいのですが、バージョン違いなどで本書通りでは動作しない箇所がありました。 自分で手を動かしてハマってしまったところをメモ代わりに残します。 途中でハマり投げ出したくなった方の一助になればと思います。

version

上述の通り、本書が書かれたタイミングからバージョンが上がってしまったことによるハマりどころもあるのかと思うので、 本記事でもバージョンを記載しておきます。 良くも悪くも発展途上のため、今後のアップデートなどで動作が変わると思うのでご注意ください。

geth

geth-darwin-amd64-1.8.1-1e67410e

npmのバージョン

> npm version
{ 'dapps-token': '1.0.0',
  npm: '5.6.0',
  ares: '1.13.0',
  cldr: '32.0.1',
  http_parser: '2.7.0',
  icu: '60.2',
  modules: '59',
  napi: '2',
  nghttp2: '1.29.0',
  node: '9.5.0',
  openssl: '1.0.2n',
  tz: '2017c',
  unicode: '10.0',
  uv: '1.19.1',
  v8: '6.2.414.46-node.18',
  zlib: '1.2.11' }

truffle

> truffle version
Truffle v4.0.6 (core: 4.0.6)
Solidity v0.4.19 (solc-js)

コマンド6.1.4.3: Gethの初期化処理

genesis.jsontypoしてしまったため、一度実行に失敗しました。 キャッシュもっているのか修正後も以下のようにFatalとなってうまくいきませんでした。 一度genesis.jsonを消してから再実行したら成功しました。

# geth --datadir ~/geth/private_net init ~/geth/private_net/genesis.json
Fatal: Failed to read genesis file: open ~/geth/private_net/genesis.json: no such file or directory

コード8.2.3.1: トークンのコントラスト

StandardToken.solがimportできませんでした。

truffle(develop)> test
Error: Could not find zeppelin-solidity/contracts/token/StandardToken.sol

本文とStandardToken.solのPATHが変わっているのでDappsToken.solを修正します。

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

上記に伴って、DappsToken.sol中のDappsTokenの引数もuintからuint256に変更します。 また、totalSupplyERC20/BasicToken.sol中でtotalSupply_となっているので修正します。

// DappsToken.sol
contract DappsToken is StandardToken {
  string public name = "DappsToken";
  string public symbol = "DTKN";
  uint public decimals = 18;
  
  function DappsToken(uint256 initialSupply) public {
    totalSupply_ = initialSupply;
    balances[msg.sender] = initialSupply;
  }
}

8-2 ERC20準拠のトークン作成のファイル位置

慣れれば当然なのでしょうが、本節で書いた各ファイルの配置は、 dapps-tokenをカレントディレクトリとして以下です。

./contracts/DappsToken.sol(コード8.2.3.1)
./migrations/2_deploy_dapps_token.js
./test/DappsTokens.js

Ropstenネットワークへのデプロイ

コード8.3.2.14の通りにgasを設定しても以下のエラーメッセージが出てきて、デプロイできませんでした。

> truffle migrate --network ropsten
Using network 'ropsten'.

Running migration: 2_deploy_dapps_token.js
  Deploying DappsToken...
  ... <hash>
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: The contract code couldn't be stored, please check your gas amount.

truffleの公式ドキュメントgithubのissueStackExchange あたりを読んでも、同じエラーメッセージなのに解決策がマチマチで、ここで一番ハマりました。 自分の場合は、2_deploy_dapps_token.jsgasと同じく truffle.jsgasも以下のように設定することでうまくいきました。

// truffle.js
module.exports = {
  networks: {
    ropsten: {
      provider: function() {
        return new HDWalletProvider(
          mnemonic,
          "https://ropsten.infura.io/" + accessToken
        );
      },
      network_id: 3,
      gas: 2000000
    }
  }
};

Tips

truffleを終了させる

truffle(develop)> .exit

truffle migrateをやり直すとき

コンパイル結果がbuild配下にあるので、削除したほうが無難です。

> rm -R build

Refs

ブロックチェーンアプリケーション開発の教科書

ブロックチェーンアプリケーション開発の教科書