マスタリング・イーサリアム ―スマートコントラクトとDAppの構築

Book description

イーサリアムとは、分散型アプリケーションやスマートコントラクトのアプリケーション構築を可能にするオープンソースプロジェクトです。送金、決済などの金銭取引を行う機能に加えて、ゲーム、不動産取引、身分証明など、さまざまなサービスがイーサリアムから生まれています。本書は、ビットコインの定番書『Mastering Bitcoin』の著者と、イーサリアム共同設立者でありスマートコントラクト開発言語Solidityの開発者により執筆された、イーサリアムの技術解説書。イーサリアムについて詳しく知りたいすべての人必携の一冊です。

Table of contents

  1. 表紙
  2. 本書への賛辞
  3. 日本語版への推薦文
  4. はじめに
  5. 用語集
  6. 1章 イーサリアムとは何か?
  7.  1.1 ビットコインとの比較
  8.  1.2 ブロックチェーンの構成要素
  9.  1.3 イーサリアムの誕生
  10.  1.4 イーサリアムの4つの開発段階
  11.  1.5 イーサリアム:汎用ブロックチェーン
  12.  1.6 イーサリアムの構成要素
  13.   1.6.1 参考文献
  14.  1.7 イーサリアムとチューリング完全性
  15.   1.7.1 「仕様」としてのチューリング完全性
  16.   1.7.2 チューリング完全性の意味
  17.  1.8 汎用ブロックチェーンから非中央集権型アプリケーション(DApp)へ
  18.  1.9 インターネットの第3世代
  19.  1.10 イーサリアムの開発カルチャー
  20.  1.11 なぜイーサリアムを学ぶのか?
  21.  1.12 本書で学べること
  22. 2章 イーサリアムの基礎
  23.  2.1 イーサの通貨単位
  24.  2.2 イーサリアムウォレットの選択
  25.  2.3 管理と責任
  26.  2.4 MetaMask入門
  27.   2.4.1 ウォレットの作成
  28.   2.4.2 ネットワークを切り替える
  29.   2.4.3 テスト用イーサを入手する
  30.   2.4.4 MetaMaskからイーサを送金する
  31.   2.4.5 アドレスのトランザクション履歴の確認
  32.  2.5 ワールドコンピュータ入門
  33.  2.6 外部所有アカウント(EOA)とコントラクト
  34.  2.7 シンプルなコントラクト:テスト用イーサファウセット
  35.  2.8 ファウセットコントラクトのコンパイル
  36.  2.9 ブロックチェーン上でのコントラクトの作成
  37.  2.10 コントラクトとのやり取り
  38.   2.10.1 ブロックエクスプローラでコントラクトアドレスを表示する
  39.   2.10.2 コントラクトへの入金
  40.   2.10.3 コントラクトからの引き出し
  41.  2.11 まとめ
  42. 3章 イーサリアムクライアント
  43.  3.1 イーサリアムネットワーク
  44.   3.1.1 フルノードを建てるべきか
  45.   3.1.2 フルノードの長所と短所
  46.   3.1.3 パブリックテストネットの長所と短所
  47.   3.1.4 ローカルブロックチェーンシミュレーションの長所と短所
  48.  3.2 イーサリアムクライアントの実行
  49.   3.2.1 フルノードのハードウェア要件
  50.   3.2.2 クライアント(ノード)の構築と実行のためのソフトウェア要件
  51.   3.2.3 Parity
  52.   3.2.4 Go-Ethereum(Geth)
  53.  3.3 イーサリアムベースのブロックチェーンの初回同期
  54.   3.3.1 GethまたはParityの起動
  55.   3.3.2 JSON-RPCインターフェイス
  56.  3.4 リモートイーサリアムクライアント
  57.   3.4.1 モバイル(スマートフォン)ウォレット
  58.   3.4.2 ブラウザウォレット
  59.  3.5 まとめ
  60. 4章 暗号化
  61.  4.1 鍵とアドレス
  62.  4.2 公開鍵暗号と暗号通貨
  63.  4.3 秘密鍵
  64.   4.3.1 無作為な数字から秘密鍵を生成する
  65.  4.4 公開鍵
  66.   4.4.1 楕円曲線暗号の解説
  67.   4.4.2 楕円曲線演算
  68.   4.4.3 公開鍵の生成
  69.   4.4.4 楕円曲線ライブラリ
  70.  4.5 暗号ハッシュ関数
  71.   4.5.1 イーサリアムの暗号ハッシュ関数:Keccak-256
  72.   4.5.2 どのハッシュ関数を使用しているのか
  73.  4.6 イーサリアムアドレス
  74.   4.6.1 イーサリアムアドレスフォーマット
  75.   4.6.2 ICAP(Internet Content Adaptation Protocol)
  76.   4.6.3 大文字を使用するチェックサム付き16進数エンコーディング(EIP-55)
  77.   4.6.4 EIP-55でエンコードされたアドレスのエラーを検出する
  78.  4.7 まとめ
  79. 5章 ウォレット
  80.  5.1 ウォレット技術の概要
  81.   5.1.1 非決定性(ランダム)ウォレット
  82.   5.1.2 決定性(シード)ウォレット
  83.   5.1.3 階層的決定性(HD)ウォレット(BIP-32/BIP-44)
  84.   5.1.4 シードとニーモニックコード(BIP-39)
  85.  5.2 ウォレットのベストプラクティス
  86.   5.2.1 ニーモニックコードワード(BIP-39)
  87.   5.2.2 シードからのHDウォレット生成
  88.   5.2.3 HDウォレット(BIP-32)とPath(BIP-43/44)
  89.  5.3 まとめ
  90. 6章 トランザクション
  91.  6.1 トランザクションの構造
  92.  6.2 トランザクションナンス
  93.   6.2.1 ナンスの追跡
  94.   6.2.2 ナンスの差異、複製したナンスと承認
  95.   6.2.3 並行処理、トランザクションの生成、ナンス
  96.  6.3 トランザクションガス
  97.  6.4 トランザクション受信者
  98.  6.5 トランザクションのバリューとデータ
  99.   6.5.1 バリューをEOAとコントラクトに送信する
  100.   6.5.2 データペイロードをEOAやコントラクトに送信する
  101.  6.6 特別なトランザクション:コントラクト作成
  102.  6.7 デジタル署名
  103.   6.7.1 楕円曲線デジタル署名アルゴリズム
  104.   6.7.2 デジタル署名の仕組み
  105.   6.7.3 署名の検証
  106.   6.7.4 ECDSAの数学
  107.   6.7.5 トランザクションの署名
  108.   6.7.6 生トランザクションの作成と署名
  109.   6.7.7 EIP-155による生トランザクションの作成
  110.  6.8 署名プレフィックス値(v)と公開鍵リカバリ
  111.  6.9 署名と送信の分離(オフライン署名)
  112.  6.10 トランザクションの伝播
  113.  6.11 ブロックチェーンへのレコーディング
  114.  6.12 複数署名(マルチシグ)トランザクション
  115.  6.13 まとめ
  116. 7章 スマートコントラクトとSolidity
  117.  7.1 スマートコントラクトとは何か?
  118.  7.2 スマートコントラクトのライフサイクル
  119.  7.3 イーサリアム高級言語の紹介
  120.  7.4 Solidityでのスマートコントラクトの作成
  121.   7.4.1 Solidityのバージョンの選択
  122.   7.4.2 ダウンロードとインストール
  123.   7.4.3 開発環境
  124.   7.4.4 シンプルなSolidityプログラムを書く
  125.   7.4.5 Solidityコンパイラ(solc)を使ってコンパイルする
  126.  7.5 イーサリアムコントラクトABI
  127.   7.5.1 Solidityコンパイラと言語バージョンの選択
  128.  7.6 Solidityを使ったプログラミング
  129.   7.6.1 データ型
  130.   7.6.2 定義済みのグローバル変数とグローバル関数
  131.   7.6.3 コントラクトの定義
  132.   7.6.4 関数
  133.   7.6.5 コントラクトのコンストラクタとセルフディストラクト
  134.   7.6.6 コンストラクタとセルフディストラクトをファウセットコントラクトに追加する
  135.   7.6.7 関数修飾子
  136.   7.6.8 コントラクトの継承
  137.   7.6.9 エラーハンドリング:assert、require、revert
  138.   7.6.10 イベント
  139.   7.6.11 他のコントラクトを呼び出す:send、call、callcode、delegatecall
  140.  7.7 ガスに関する検討事項
  141.   7.7.1 動的サイズの配列を避ける
  142.   7.7.2 他のコントラクトへの呼び出しを避ける
  143.   7.7.3 ガス費用の見積もり
  144.  7.8 まとめ
  145. 8章 スマートコントラクトとVyper
  146.  8.1 脆弱性とVyper
  147.  8.2 Solidityとの比較
  148.   8.2.1 修飾子
  149.   8.2.2 クラスの継承
  150.   8.2.3 インラインアセンブリ
  151.   8.2.4 関数のオーバーロード
  152.   8.2.5 変数の型キャスト
  153.   8.2.6 事前条件と事後条件
  154.  8.3 デコレータ
  155.  8.4 関数と変数の順序
  156.  8.5 コンパイル
  157.  8.6 コンパイラレベルでのオーバーフローエラーに対する保護
  158.  8.7 データの読み書き
  159.  8.8 まとめ
  160. 9章 スマートコントラクトセキュリティ
  161.  9.1 セキュリティのベストプラクティス
  162.  9.2 セキュリティリスクとアンチパターン
  163.  9.3 リエントランシー
  164.   9.3.1 脆弱性
  165.   9.3.2 予防テクニック
  166.   9.3.3 実例:The DAO
  167.  9.4 算術オーバーフロー/アンダーフロー
  168.   9.4.1 脆弱性
  169.   9.4.2 予防テクニック
  170.   9.4.3 実例:PoWHCとバッチトランスファーオーバーフロー(CVE-2018-10999)
  171.  9.5 予期せぬイーサ
  172.   9.5.1 脆弱性
  173.   9.5.2 予防テクニック
  174.   9.5.3 さらなる例
  175.  9.6 DELEGATECALL
  176.   9.6.1 脆弱性
  177.   9.6.2 予防テクニック
  178.   9.6.3 実例:パリティマルチシグウォレット(2度目のハック)
  179.  9.7 デフォルトの可視性
  180.   9.7.1 脆弱性
  181.   9.7.2 予防テクニック
  182.   9.7.3 実例:パリティマルチシグウォレット(最初のハック)
  183.  9.8 エントロピーイリュージョン
  184.   9.8.1 脆弱性
  185.   9.8.2 予防テクニック
  186.   9.8.3 実例:PRNGコントラクト
  187.  9.9 外部コントラクトの参照
  188.   9.9.1 脆弱性
  189.   9.9.2 予防テクニック
  190.   9.9.3 実例:リエントランシーハニーポット
  191.  9.10 ショートアドレス/パラメータ攻撃
  192.   9.10.1 脆弱性
  193.   9.10.2 予防テクニック
  194.  9.11 未チェックのCALL戻り値
  195.   9.11.1 脆弱性
  196.   9.11.2 予防テクニック
  197.   9.11.3 実例:EtherPotとKing of the Ether
  198.  9.12 競合状態/フロントランニング
  199.   9.12.1 脆弱性
  200.   9.12.2 予防テクニック
  201.   9.12.3 実例:ERC20とBancor
  202.  9.13 サービス拒否(DoS)
  203.   9.13.1 脆弱性
  204.   9.13.1 予防テクニック
  205.   9.13.2 実例:GovernMental
  206.  9.14 ブロックタイムスタンプ操作
  207.   9.14.1 脆弱性
  208.   9.14.2 予防テクニック
  209.   9.14.3 実例:GovernMental
  210.  9.15 慎重なコンストラクタ
  211.   9.15.1 脆弱性
  212.   9.15.2 予防テクニック
  213.   9.15.3 実例:Rubixi
  214.  9.16 未初期化ストレージポインタ
  215.   9.16.1 脆弱性
  216.   9.16.2 予防テクニック
  217.   9.16.3 実例:OpenAddressLotteryとCryptoRouletteハニーポット
  218.  9.17 浮動小数点数と精度
  219.   9.17.1 脆弱性
  220.   9.17.2 予防テクニック
  221.   9.17.3 実例:Ethstick
  222.  9.18 Tx.Origin認証
  223.   9.18.1 脆弱性
  224.   9.18.2 予防テクニック
  225.  9.19 コントラクトライブラリ
  226.  9.20 まとめ
  227. 10章 トークン
  228.  10.1 トークンの使用方法
  229.  10.2 トークンとファンジビリティ(代替可能性)
  230.  10.3 カウンターパーティリスク
  231.  10.4 トークンと内在性
  232.  10.5 トークンの使用:ユーティリティとエクイティ
  233.   10.5.1 「それはアヒルです」
  234.   10.5.2 ユーティリティトークン:誰が必要とするのか
  235.  10.6 イーサリアム上のトークン
  236.   10.6.1 ERC20トークン標準
  237.   10.6.2 独自ERC20トークンの起動
  238.   10.6.3 ERC20トークンの問題点
  239.   10.6.4 ERC223:トークンコントラクトのインターフェイス標準提案
  240.   10.6.5 ERC777:トークンコントラクトのインターフェイス標準提案
  241.   10.6.6 ERC721:ノンファンジブルトークン(Deed:証書)標準
  242.  10.7 トークン標準の使用
  243.   10.7.1 トークン標準とは何か、その目的は何か
  244.   10.7.2 トークン標準を使用すべきか
  245.   10.7.3 成熟度によるセキュリティ
  246.  10.8 トークンインターフェイス標準への拡張
  247.  10.9 トークンとICO
  248.  10.10 まとめ
  249. 11章 オラクル
  250.  11.1 オラクルの必要性
  251.  11.2 オラクルのユースケースと使用例
  252.  11.3 オラクルの設計パターン
  253.  11.4 データ認証
  254.  11.5 計算オラクル
  255.  11.6 非中央集権型オラクル
  256.  11.7 Solidityでのオラクルクライアントインターフェイス
  257.  11.8 まとめ
  258. 12章 非中央集権型アプリケーション(DApp)
  259.  12.1 DAppとは何か
  260.   12.1.1 バックエンド(スマートコントラクト)
  261.   12.1.2 フロントエンド(Webユーザーインターフェイス)
  262.   12.1.3 データストレージ
  263.   12.1.4 非中央集権型メッセージ通信プロトコル
  264.  12.2 基本的なDAppの例:オークションDApp
  265.   12.2.1 オークションDApp:バックエンドスマートコントラクト
  266.   12.2.2 オークションDApp:フロントエンドユーザーインターフェイス
  267.  12.3 オークションDAppのさらなる非中央集権化
  268.  12.4 オークションDAppのSwamへの格納
  269.   12.4.1 Swarmの準備
  270.   12.4.2 ファイルのSwamへのアップロード
  271.  12.5 ENS(Ethereum Name Service)
  272.   12.5.1 ENSの歴史
  273.   12.5.2 ENSの仕様
  274.   12.5.3 ボトムレイヤー:名前の所有者とリゾルバ
  275.   12.5.4 中間レイヤー:.ethノード
  276.   12.5.5 トップレイヤー:証書
  277.   12.5.6 名前の登録
  278.   12.5.7 ENSの名前管理
  279.   12.5.8 ENSリゾルバ
  280.   12.5.9 Swarmハッシュ(コンテンツ)への名前解決
  281.  12.6 AppからDAppへ
  282.  12.7 まとめ
  283. 13章 イーサリアム仮想マシン(EVM)
  284.  13.1 EVMとは何か
  285.   13.1.1 既存の技術との比較
  286.   13.1.2 EVM命令セット(バイトコード演算)
  287.   13.1.3 イーサリアムのステート(状態)
  288.   13.1.4 SolidityのEVMバイトコードへのコンパイル
  289.   13.1.5 コントラクトのデプロイを行うコード
  290.   13.1.6 バイトコードの逆アセンブル
  291.  13.2 チューリング完全性とガス
  292.  13.3 ガス
  293.   13.3.1 実行中のガス会計
  294.   13.3.2 ガス会計に関する考察
  295.   13.3.3 ガス費用対ガス価格
  296.   13.3.4 ブロックガス上限
  297.  13.4 まとめ
  298. 14章 コンセンサス
  299.  14.1 PoWによるコンセンサス
  300.  14.2 PoS(Proof of Stake)によるコンセンサス
  301.  14.3 Ethash:イーサリアムのPoWアルゴリズム
  302.  14.4 Casper:イーサリアムのPoSアルゴリズム
  303.  14.5 コンセンサスの原則
  304.  14.6 論争と競争
  305.  14.7 まとめ
  306. 付録A イーサリアムフォークの歴史
  307.  A.1 イーサリアムクラシック(ETC)
  308.  A.2 非中央集権型自律組織(The DAO)
  309.  A.3 リエントランシーのバグ
  310.   A.3.1 技術詳細
  311.   A.3.2 攻撃フロー
  312.  A.4 The DAOハードフォーク
  313.   A.4.1 The DAOハードフォーク年表
  314.  A.5 イーサリアムとイーサリアムクラシック
  315.   A.5.1 EVM
  316.   A.5.2 コアネットワーク開発
  317.  A.6 その他の著名なイーサリアムフォーク
  318. 付録B イーサリアムスタンダード
  319.  B.1 イーサリアム改善提案(EIP)
  320.  B.2 主要なEIPおよびERCの一覧
  321. 付録C EVMオペコードとガス消費
  322. 付録D 開発ツール、フレームワーク、ライブラリ
  323.  D.1 フレームワーク
  324.   D.1.1 Truffle
  325.   D.1.2 Embark
  326.   D.1.3 OpenZeppelin
  327.   D.1.4 ZeppelinOS
  328.  D.2 ユーティリティ
  329.   D.2.1 EthereumJS helpeth:コマンドラインユーティリティ
  330.   D.2.2 dapp.tools
  331.   D.2.3 SputnikVM
  332.  D.3 ライブラリ
  333.   D.3.1 web3.js
  334.   D.3.2 web3.py
  335.   D.3.3 EthereumJS
  336.   D.3.4 web3j
  337.   D.3.5 EtherJar
  338.   D.3.6 Nethereum
  339.   D.3.7 ethers.js
  340.   D.3.8 Emerald Platform
  341.  D.4 スマートコントラクトのテスト
  342.   D.4.1 ブロックチェーンテスト
  343.   D.4.2 Ganache:ローカルテストブロックチェーン
  344. 付録E web3.jsチュートリアル
  345.  E.1 説明
  346.  E.2 async/await(非同期)方式におけるweb3.jsとコントラクトの基本操作
  347.   E.2.1 Node.jsスクリプトの実行
  348.  E.3 デモスクリプトの確認
  349.  E.4 コントラクトのインタラクション
  350.  E.5 awaitを使った非同期操作
  351. 付録F 短縮URL一覧
  352.  F.1 スマートコントラクトセキュリティ
  353.  F.2 トークン
  354. 訳者あとがき
  355. 奥付

Product information

  • Title: マスタリング・イーサリアム ―スマートコントラクトとDAppの構築
  • Author(s): Andreas M. Antonopoulos, Gavin Wood, 宇野 雅晴, 鳩貝 淳一郎, 中城 元臣, 落合 渉悟, 落合 庸介, 小林 泰男, 土屋 春樹, 祢津 誠晃, 平山 翔, 三津澤 サルバドール将司, 山口 和輝
  • Release date: November 2019
  • Publisher(s): O'Reilly Japan, Inc.
  • ISBN: 9784873118963

You might also like

book

行動を変えるデザイン ―心理学と行動経済学をプロダクトデザインに活用する

by Stephen Wendel, 武山 政直, 相島 雅樹, 反中 望, 松村 草也

深津貴之氏推薦!「行動経済学、データ分析、サービス設計のエッセンスが高度に統合された行動変容デザインの良書です」 本書は、行動経済学と心理学をもとに、人々の行動、日常習慣を変える“行動変容”を促すプロダクトをデザインするための書籍です。主にヘルスケア(健康管理)、金融(資産管理)など、これまでITプロダクト(サービス、アプリなど)がなかなか使われてこなかった分野を対象に、ユーザーがやりたいと思っていたものの実行できなかった行動の実現を助けるプロダクトを作り出すための、実践的な視点や知識を提供します。

book

デザインスプリント ―プロダクトを成功に導く短期集中実践ガイド

by Richard Banfield, C. Todd Lombardo, Trace Wax, 安藤 幸央, 佐藤 伸哉, 牧野 聡

本書はGV(旧Google Ventures)およびGoogleで提唱しているデザイン思考「デザインスプリント」の概念とその手順を実践的に解説。デザインスプリントではプロダクトやサービスのアイデアを短時間で作り上げ、ユーザーに示して評価してもらい、アイデア創出からプロトタイピング、ユーザーテストと評価までをわずか5日間で完了させるためのプロセスが定められています。本書では組織でデザインスプリントを実践するために必要な事柄を紹介し、多くのリソースを投入する前にプロダクトやサービスのアイデアを検討し、チームメンバー、ステークホルダー、そしてユーザーを巻き込みながら短期間でより良いユーザー体験を作り上げる方法を伝授します。

book

初めてのGraphQL ―Webサービスを作って学ぶ新世代API

by Eve Porcello, Alex Banks, 尾崎 沙耶, あんどうやすし

今日では多くのWebサービスがRESTアーキテクチャスタイルで実装されています。RESTは2000年にフィールディングの論文で提唱された後に爆発的に普及し洗練されてきました。一方で、本書で紹介するGraphQLは2015年にFacebookによって公開されたRESTとは異なるアプローチのアーキテクチャです。GraphQLの最大の特徴はクエリ言語を用いてデータを操作する点です。クエリ言語の表現力の高さによりクライアントは本当に必要なリクエストを送ることができます。本書ではGraphQLの概要とGraphQLを用いたWebサービスの開発方法を実装例に沿って紹介します。認証やファイルアップロードといった実践的なトピックまで踏み込んだGraphQLの実用的な入門書です。

book

バイオインフォマティクスデータスキル ―オープンソースツールを使ったロバストで再現性のある研究

by Vince Buffalo, 片山 俊明, 川島 秀一, 鈴木 治夫, 山本 泰智, 酒匂 寛, 山村 吉信

バイオインフォマティクス(生命情報科学)とは、コンピュータによる情報解析の手法を生物学の問題に応用する学問のことを指します。本書は、基本的なプログラミングに関する知識を持ったバイオ研究者を対象に、“ロバストで再現性のある研究”のため、複雑で大規模な配列データから意味を抽出し、探索するための技術を解説します。データを処理する方法としてPython、R、Gitなどのオー プンソースツールを用いるため、次世代のデータにも適用できます。近年、ニーズが高まりつつあるバイオ分野において不可欠なデータ処理技術のすべてがこの一冊に詰まっています。