書籍概要

堅牢なスマートコントラクト開発のためのブロックチェーン[技術]入門

著者
発売日
更新日

概要

ブロックチェーンの技術は,ビットコインに代表される仮想通貨に使用されるだけではありません。従来のように中央集中管理型のシステムに比べて,改ざんが難しく,かつ低予算で構築できることから,幅広い分野への応用が期待されています。例えば,地域通貨や電子クーポン,有価証券,投票,電子チケットの偽造・転売防止などです。
本書では,ブロックチェーンの暗号化技術のほか,スマートコントラクト開発で注目されるEthereum(イーサリアム)のセキュリティ対策まで言及しています。

こんな方におすすめ

  • ブロックチェーンの技術や具体的な開発方法,セキュリティ問題/対策に興味のある方
  • スマートコントラクトでシステム開発を企画している方

サンプル

目次

Part1 ブロックチェーンと関連技術
Chapter 1 ブロックチェーンの全体像

  • 1.1 ブロックチェーン
  • 1.2 ビットコインネットワーク
  • 1.3 Ethereum
  • 1.4 ブロックチェーンネットワークの構成要素

Chapter 2 ブロックチェーンを理解するための暗号技術

  • 2.1 ハッシュ関数
  • 2.2 公開鍵暗号
  • 2.3 楕円曲線暗号
  • 2.4 デジタル署名

Part2 ビットコインネットワーク
Chapter 3 お金のように扱える仕組み

  • 3.1 所有者を特定する「鍵」と「錠」
  • 3.2 送金先となる「アドレス」
  • 3.3 鍵を管理する「ウォレット」
  • 3.4 ウォレットの種類

Chapter 4 トランザクション

  • 4.1 トランザクションのライフサイクル
  • 4.2 トランザクションの概要
  • 4.3 トランザクションの構造
  • 4.4 UTXOと残高
  • 4.5 Locking ScriptとUnlocking Script

Chapter 5 ブロックとブロックチェーン

  • 5.1 ブロックの構造と識別子
  • 5.2 ブロックからトランザクションを検索する(マークルツリー)

Chapter 6 マイニングとコンセンサスアルゴリズム

  • 6.1 ビザンチン将軍問題と分散型コンセンサス
  • 6.2 Proof-Of-Work
  • 6.3 トランザクションの集積
  • 6.4 マイナーの報酬トランザクション(coinbaseトランザクション)
  • 6.5 チェーンの分岐(フォーク)
  • 6.6 51%攻撃

Part3 Ethereumとスマートコントラクト開発
Chapter 7 Ethereumとビットコインネットワークの主な違い

  • 7.1 Ethereumの特徴
  • 7.2 ネットワークの種類

Chapter 8 スマートコントラクト開発の準備とSolidityの基本文法

  • 8.1 環境構築
  • 8.2 Ethereumの公式ウォレット(Mist Wallet)
  • 8.3 Remix-Solidity IDE
  • 8.4 Solidity言語仕様

Chapter 9 スマートコントラクトの用途別サンプル

  • 9.1 サンプル(その1)-HelloEthereum
  • 9.2 サンプル(その2)-クラウドファンディング用のコントラクト
  • 9.3 サンプル(その3)-名前とアドレスを管理するコントラクト
  • 9.4 サンプル(その4)-IoTで利用するスイッチを制御するコントラクト
  • 9.5 サンプル(その5)-ECサイトで利用するコントラクト
  • 9.6 サンプル(その6)-オークションサービスで利用するコントラクト
  • 9.7 サンプル(その7)-抽選会で利用するコントラクト

Part4 スマートコントラクトのセキュリティ
Chapter 10 スマートコントラクトのセキュリティプラクティス

  • 10.1 Condition-Effects-Interactionパターン
  • 10.2 Withdrawパターン(push vs pull)
  • 10.3 Access Restrictionパターン
  • 10.4 Mortalパターン
  • 10.5 Circuit Breakerパターン

Chapter 11 スマートコントラクトの脆弱性の仕組みと攻撃

  • 11.1 Reentrancy問題
  • 11.2 Transaction-Ordering Dependence(TOD)
  • 11.3 Timestamp Dependence
  • 11.4 重要情報の取り扱い
  • 11.5 オーバーフロー

Chapter 12 事例から学ぶブロックチェーンのセキュリティ

  • 12.1 サードパーティの脆弱性(Solidity脆弱性)
  • 12.2 クライアントアプリの脆弱性と鍵管理(Jaxx脆弱性)

サポート

ダウンロード

(2018年2月28日更新)

本書のサンプルソースがダウンロードできます。

ダウンロード
samplesrc_20180228.zip(約14KB)

解凍してファイル名を参考にしてご利用ください。
2018年2月28日より前に公開していた「samplesrc_20171218.zip」に
「genesis.json」を追加しました。

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2022年7月28日最終更新)

P.12 本文 2行目

分散型(Decentrized)
分散型(Decentralized

(以下2021年11月4日更新)

P.23:本文 下から7行目

secp256k1は位相がとてつもなく大きな素数pの有限体上で
secp256k1は位数がとてつもなく大きな素数pの有限体上で

(以下2019年9月19日更新)

P.190 本文下から3行目

gasPriceを全社のgssPriceよりも高くすれば
gasPriceを全社のgasPriceよりも高くすれば

P.212 本文下から5行目(コマンド「getUsed確認」の直前)

gasUsedからもthrowされていないことがわかります。
gasUsedからもthrowされていることがわかります。

(以下2018年7月17日更新)

P.50 図4-9の説明文の4行目

ビットコインワーク
ビットコインネットワーク

P.134 図9-17のキャプション

運用イメージ
利用イメージ

P.162 本文上から7~8行目

想定していたいのですが、
想定していたのですが、

P.172 本文下から3行目

を読んだ場合
んだ場合

(以下2018年7月5日更新)

P.51 図4-10の上部の網掛け内

TxAもTxCも同じアウトプットを参照
TxAもTxBも同じアウトプットを参照

(以下2018年5月9日更新)

P.28 「公開鍵で署名データを検証する」項

Opensslで署名する際に「dgst -SHA256」を指定しており,署名時にOpensslがSHA-256化してくれるため,署名対象のmessageをsha256sumでハッシュ化する必要なく,「hashed_message.txt」と「hashed_message.sig」ファイルを生成する必要はありません。代わりに「message.txt」を署名してください。各コマンドは次のように訂正いたします。

  • メッセージのハッシュ値を生成する
    このコマンドは不要です。
  • 署名データを作成する
    
    $ openssl dgst -SHA256 -sign secp256k1-private.pem message.txt > message.sig
    
    
  • 公開鍵で署名データを検証する
    
    $ openssl dgst -SHA256 -verify secp256k1-public.pem -signature message.sig message.txt
    
    

P.29 「メッセージが改ざんされた場合を検証する」項

Opensslで署名する際に「dgst -SHA256」を指定しており,署名時にOpensslがSHA-256化してくれるため,署名対象のmessageをsha256sumでハッシュ化する必要なく,「hashed_message_kaizan.txt」と「hashed_message_kaizan.sig」ファイルを生成する必要はありません。代わりに「message_kaizan.txt」を署名してください。各コマンドは次のように訂正いたします。

  • 攻撃者のメッセージのハッシュ値を生成する
    2行目と3行目にある次のコマンドが不要です。
    
    $ sha256sum message_kaizan.txt
    $ cat hashed_message_kaizan.txt
  • 攻撃者の秘密鍵で署名する
    
    $ openssl dgst -SHA256 -sign secp256k1-private-evil.pem message_kaizan.txt >
    message_kaizan.sig
  • 公開鍵で署名データを検証する
    
    $ openssl dgst -SHA256 -verify secp256k1-public.pem -signature message_kaizan.sig message_kaizan.txt
    
  • P.53 本文の末行

    まずは、Locking Script ⇒ Unlocking Scriptの順で
    まずは、Unlocking Script Locking Scriptの順で

    P.59 表5-2の3行目

    Markle Root
    Merkle Root

    P.60 本文下から10行目

    markle tree
    merkle tree

    P.60 本文下から3行目

    Markle Root
    Merkle Root

    P.65 表6-1の3行目

    Markle Root
    Merkle Root

    (以下2018年4月16日更新)

    P.97 本文下から3行目

    オブジェクトに含まれもので、
    オブジェクトに含まれるもので、

    (以下2017年12月18日更新)

    P.52 「4.4:UTXOと残高」の上から1行目

    ここままで
    ここまで

    P.60 「5.1:ブロックの構造と識別子」の最後の行

    「6.5:チェーンの分岐(フォーク)」(P.60)で
    「6.5:チェーンの分岐(フォーク)」(P.69)で

    P.107 上から3行目

    ここままで
    ここまで

    P.107 下から2行目

    falback関数
    fallback関数

    P.133 下から10行目

    Neme Registry
    Name Registry

    P.139 SmartSwitch.solの下から15行目

    処理を更新する
    statusを更新する

    P.147 Auction.solの上から3行目

    // 最高提示額
    // 最高額提示アドレス

    P.147 Auction.solの上から4行目

    // 最高額提示アドレス
    // 最高提示額

    P.156 AuctionWithdraw.solの上から3行目

    // 最高提示額
    // 最高額提示アドレス

    P.156 AuctionWithdraw.solの上から4行目

    // 最高額提示アドレス
    // 最高提示額

    P.162 本文下から2行目

    etherを改修できるように
    etherを回収できるように

    P.165 上から1行目

    Send Funds画面(図10-6)に
    Send funds画面(図10-6)に

    P.169 上から3行目

    etherを一旦改修する必要が
    etherを一旦回収する必要が

    P.170 CircuitBreaker.solの下から4行目

    setMassage
    setMessage

    P.170 setMessage呼び出しの1行目

    cb.setMassage.sendTransaction
    cb.setMessage.sendTransaction

    P.171 setMessage呼び出しの1行目

    cb.setMassage.sendTransaction
    cb.setMessage.sendTransaction

    P.179 箇条書きの1行目

    VicimBalance
    VictimBalance

    P.179 箇条書きの2行目

    VimctimBalance
    VictimBalance

    P.228 図12-12

    異なる画面図が掲載されていました。次の画面に差し替えます。

    図12-12差し替え画像

    (以下2017年11月6日更新)

    P.9 目次(P.129)

    コンスラクトを生成する
    コントラクトを生成する

    P.15 下から2行目

    各ノートは
    ノード

    P.21 上から3行目

    VirturlBox上に
    VirtualBox上に

    P.111 下から3行目(見出し)

    ソースコードを記述してコンストラクタを指定する
    ソースコードを記述してコントラクトを指定する

商品一覧