Book description
イーサリアムとは、分散型アプリケーションやスマートコントラクトのアプリケーション構築を可能にするオープンソースプロジェクトです。送金、決済などの金銭取引を行う機能に加えて、ゲーム、不動産取引、身分証明など、さまざまなサービスがイーサリアムから生まれています。本書は、ビットコインの定番書『Mastering Bitcoin』の著者と、イーサリアム共同設立者でありスマートコントラクト開発言語Solidityの開発者により執筆された、イーサリアムの技術解説書。イーサリアムについて詳しく知りたいすべての人必携の一冊です。
Table of contents
- 表紙
- 本書への賛辞
- 日本語版への推薦文
- はじめに
- 用語集
- 1章 イーサリアムとは何か?
- 1.1 ビットコインとの比較
- 1.2 ブロックチェーンの構成要素
- 1.3 イーサリアムの誕生
- 1.4 イーサリアムの4つの開発段階
- 1.5 イーサリアム:汎用ブロックチェーン
- 1.6 イーサリアムの構成要素
- 1.6.1 参考文献
- 1.7 イーサリアムとチューリング完全性
- 1.7.1 「仕様」としてのチューリング完全性
- 1.7.2 チューリング完全性の意味
- 1.8 汎用ブロックチェーンから非中央集権型アプリケーション(DApp)へ
- 1.9 インターネットの第3世代
- 1.10 イーサリアムの開発カルチャー
- 1.11 なぜイーサリアムを学ぶのか?
- 1.12 本書で学べること
- 2章 イーサリアムの基礎
- 2.1 イーサの通貨単位
- 2.2 イーサリアムウォレットの選択
- 2.3 管理と責任
- 2.4 MetaMask入門
- 2.4.1 ウォレットの作成
- 2.4.2 ネットワークを切り替える
- 2.4.3 テスト用イーサを入手する
- 2.4.4 MetaMaskからイーサを送金する
- 2.4.5 アドレスのトランザクション履歴の確認
- 2.5 ワールドコンピュータ入門
- 2.6 外部所有アカウント(EOA)とコントラクト
- 2.7 シンプルなコントラクト:テスト用イーサファウセット
- 2.8 ファウセットコントラクトのコンパイル
- 2.9 ブロックチェーン上でのコントラクトの作成
- 2.10 コントラクトとのやり取り
- 2.10.1 ブロックエクスプローラでコントラクトアドレスを表示する
- 2.10.2 コントラクトへの入金
- 2.10.3 コントラクトからの引き出し
- 2.11 まとめ
- 3章 イーサリアムクライアント
- 3.1 イーサリアムネットワーク
- 3.1.1 フルノードを建てるべきか
- 3.1.2 フルノードの長所と短所
- 3.1.3 パブリックテストネットの長所と短所
- 3.1.4 ローカルブロックチェーンシミュレーションの長所と短所
- 3.2 イーサリアムクライアントの実行
- 3.2.1 フルノードのハードウェア要件
- 3.2.2 クライアント(ノード)の構築と実行のためのソフトウェア要件
- 3.2.3 Parity
- 3.2.4 Go-Ethereum(Geth)
- 3.3 イーサリアムベースのブロックチェーンの初回同期
- 3.3.1 GethまたはParityの起動
- 3.3.2 JSON-RPCインターフェイス
- 3.4 リモートイーサリアムクライアント
- 3.4.1 モバイル(スマートフォン)ウォレット
- 3.4.2 ブラウザウォレット
- 3.5 まとめ
- 4章 暗号化
- 4.1 鍵とアドレス
- 4.2 公開鍵暗号と暗号通貨
- 4.3 秘密鍵
- 4.3.1 無作為な数字から秘密鍵を生成する
- 4.4 公開鍵
- 4.4.1 楕円曲線暗号の解説
- 4.4.2 楕円曲線演算
- 4.4.3 公開鍵の生成
- 4.4.4 楕円曲線ライブラリ
- 4.5 暗号ハッシュ関数
- 4.5.1 イーサリアムの暗号ハッシュ関数:Keccak-256
- 4.5.2 どのハッシュ関数を使用しているのか
- 4.6 イーサリアムアドレス
- 4.6.1 イーサリアムアドレスフォーマット
- 4.6.2 ICAP(Internet Content Adaptation Protocol)
- 4.6.3 大文字を使用するチェックサム付き16進数エンコーディング(EIP-55)
- 4.6.4 EIP-55でエンコードされたアドレスのエラーを検出する
- 4.7 まとめ
- 5章 ウォレット
- 5.1 ウォレット技術の概要
- 5.1.1 非決定性(ランダム)ウォレット
- 5.1.2 決定性(シード)ウォレット
- 5.1.3 階層的決定性(HD)ウォレット(BIP-32/BIP-44)
- 5.1.4 シードとニーモニックコード(BIP-39)
- 5.2 ウォレットのベストプラクティス
- 5.2.1 ニーモニックコードワード(BIP-39)
- 5.2.2 シードからのHDウォレット生成
- 5.2.3 HDウォレット(BIP-32)とPath(BIP-43/44)
- 5.3 まとめ
- 6章 トランザクション
- 6.1 トランザクションの構造
- 6.2 トランザクションナンス
- 6.2.1 ナンスの追跡
- 6.2.2 ナンスの差異、複製したナンスと承認
- 6.2.3 並行処理、トランザクションの生成、ナンス
- 6.3 トランザクションガス
- 6.4 トランザクション受信者
- 6.5 トランザクションのバリューとデータ
- 6.5.1 バリューをEOAとコントラクトに送信する
- 6.5.2 データペイロードをEOAやコントラクトに送信する
- 6.6 特別なトランザクション:コントラクト作成
- 6.7 デジタル署名
- 6.7.1 楕円曲線デジタル署名アルゴリズム
- 6.7.2 デジタル署名の仕組み
- 6.7.3 署名の検証
- 6.7.4 ECDSAの数学
- 6.7.5 トランザクションの署名
- 6.7.6 生トランザクションの作成と署名
- 6.7.7 EIP-155による生トランザクションの作成
- 6.8 署名プレフィックス値(v)と公開鍵リカバリ
- 6.9 署名と送信の分離(オフライン署名)
- 6.10 トランザクションの伝播
- 6.11 ブロックチェーンへのレコーディング
- 6.12 複数署名(マルチシグ)トランザクション
- 6.13 まとめ
- 7章 スマートコントラクトとSolidity
- 7.1 スマートコントラクトとは何か?
- 7.2 スマートコントラクトのライフサイクル
- 7.3 イーサリアム高級言語の紹介
- 7.4 Solidityでのスマートコントラクトの作成
- 7.4.1 Solidityのバージョンの選択
- 7.4.2 ダウンロードとインストール
- 7.4.3 開発環境
- 7.4.4 シンプルなSolidityプログラムを書く
- 7.4.5 Solidityコンパイラ(solc)を使ってコンパイルする
- 7.5 イーサリアムコントラクトABI
- 7.5.1 Solidityコンパイラと言語バージョンの選択
- 7.6 Solidityを使ったプログラミング
- 7.6.1 データ型
- 7.6.2 定義済みのグローバル変数とグローバル関数
- 7.6.3 コントラクトの定義
- 7.6.4 関数
- 7.6.5 コントラクトのコンストラクタとセルフディストラクト
- 7.6.6 コンストラクタとセルフディストラクトをファウセットコントラクトに追加する
- 7.6.7 関数修飾子
- 7.6.8 コントラクトの継承
- 7.6.9 エラーハンドリング:assert、require、revert
- 7.6.10 イベント
- 7.6.11 他のコントラクトを呼び出す:send、call、callcode、delegatecall
- 7.7 ガスに関する検討事項
- 7.7.1 動的サイズの配列を避ける
- 7.7.2 他のコントラクトへの呼び出しを避ける
- 7.7.3 ガス費用の見積もり
- 7.8 まとめ
- 8章 スマートコントラクトとVyper
- 8.1 脆弱性とVyper
- 8.2 Solidityとの比較
- 8.2.1 修飾子
- 8.2.2 クラスの継承
- 8.2.3 インラインアセンブリ
- 8.2.4 関数のオーバーロード
- 8.2.5 変数の型キャスト
- 8.2.6 事前条件と事後条件
- 8.3 デコレータ
- 8.4 関数と変数の順序
- 8.5 コンパイル
- 8.6 コンパイラレベルでのオーバーフローエラーに対する保護
- 8.7 データの読み書き
- 8.8 まとめ
- 9章 スマートコントラクトセキュリティ
- 9.1 セキュリティのベストプラクティス
- 9.2 セキュリティリスクとアンチパターン
- 9.3 リエントランシー
- 9.3.1 脆弱性
- 9.3.2 予防テクニック
- 9.3.3 実例:The DAO
- 9.4 算術オーバーフロー/アンダーフロー
- 9.4.1 脆弱性
- 9.4.2 予防テクニック
- 9.4.3 実例:PoWHCとバッチトランスファーオーバーフロー(CVE-2018-10999)
- 9.5 予期せぬイーサ
- 9.5.1 脆弱性
- 9.5.2 予防テクニック
- 9.5.3 さらなる例
- 9.6 DELEGATECALL
- 9.6.1 脆弱性
- 9.6.2 予防テクニック
- 9.6.3 実例:パリティマルチシグウォレット(2度目のハック)
- 9.7 デフォルトの可視性
- 9.7.1 脆弱性
- 9.7.2 予防テクニック
- 9.7.3 実例:パリティマルチシグウォレット(最初のハック)
- 9.8 エントロピーイリュージョン
- 9.8.1 脆弱性
- 9.8.2 予防テクニック
- 9.8.3 実例:PRNGコントラクト
- 9.9 外部コントラクトの参照
- 9.9.1 脆弱性
- 9.9.2 予防テクニック
- 9.9.3 実例:リエントランシーハニーポット
- 9.10 ショートアドレス/パラメータ攻撃
- 9.10.1 脆弱性
- 9.10.2 予防テクニック
- 9.11 未チェックのCALL戻り値
- 9.11.1 脆弱性
- 9.11.2 予防テクニック
- 9.11.3 実例:EtherPotとKing of the Ether
- 9.12 競合状態/フロントランニング
- 9.12.1 脆弱性
- 9.12.2 予防テクニック
- 9.12.3 実例:ERC20とBancor
- 9.13 サービス拒否(DoS)
- 9.13.1 脆弱性
- 9.13.1 予防テクニック
- 9.13.2 実例:GovernMental
- 9.14 ブロックタイムスタンプ操作
- 9.14.1 脆弱性
- 9.14.2 予防テクニック
- 9.14.3 実例:GovernMental
- 9.15 慎重なコンストラクタ
- 9.15.1 脆弱性
- 9.15.2 予防テクニック
- 9.15.3 実例:Rubixi
- 9.16 未初期化ストレージポインタ
- 9.16.1 脆弱性
- 9.16.2 予防テクニック
- 9.16.3 実例:OpenAddressLotteryとCryptoRouletteハニーポット
- 9.17 浮動小数点数と精度
- 9.17.1 脆弱性
- 9.17.2 予防テクニック
- 9.17.3 実例:Ethstick
- 9.18 Tx.Origin認証
- 9.18.1 脆弱性
- 9.18.2 予防テクニック
- 9.19 コントラクトライブラリ
- 9.20 まとめ
- 10章 トークン
- 10.1 トークンの使用方法
- 10.2 トークンとファンジビリティ(代替可能性)
- 10.3 カウンターパーティリスク
- 10.4 トークンと内在性
- 10.5 トークンの使用:ユーティリティとエクイティ
- 10.5.1 「それはアヒルです」
- 10.5.2 ユーティリティトークン:誰が必要とするのか
- 10.6 イーサリアム上のトークン
- 10.6.1 ERC20トークン標準
- 10.6.2 独自ERC20トークンの起動
- 10.6.3 ERC20トークンの問題点
- 10.6.4 ERC223:トークンコントラクトのインターフェイス標準提案
- 10.6.5 ERC777:トークンコントラクトのインターフェイス標準提案
- 10.6.6 ERC721:ノンファンジブルトークン(Deed:証書)標準
- 10.7 トークン標準の使用
- 10.7.1 トークン標準とは何か、その目的は何か
- 10.7.2 トークン標準を使用すべきか
- 10.7.3 成熟度によるセキュリティ
- 10.8 トークンインターフェイス標準への拡張
- 10.9 トークンとICO
- 10.10 まとめ
- 11章 オラクル
- 11.1 オラクルの必要性
- 11.2 オラクルのユースケースと使用例
- 11.3 オラクルの設計パターン
- 11.4 データ認証
- 11.5 計算オラクル
- 11.6 非中央集権型オラクル
- 11.7 Solidityでのオラクルクライアントインターフェイス
- 11.8 まとめ
- 12章 非中央集権型アプリケーション(DApp)
- 12.1 DAppとは何か
- 12.1.1 バックエンド(スマートコントラクト)
- 12.1.2 フロントエンド(Webユーザーインターフェイス)
- 12.1.3 データストレージ
- 12.1.4 非中央集権型メッセージ通信プロトコル
- 12.2 基本的なDAppの例:オークションDApp
- 12.2.1 オークションDApp:バックエンドスマートコントラクト
- 12.2.2 オークションDApp:フロントエンドユーザーインターフェイス
- 12.3 オークションDAppのさらなる非中央集権化
- 12.4 オークションDAppのSwamへの格納
- 12.4.1 Swarmの準備
- 12.4.2 ファイルのSwamへのアップロード
- 12.5 ENS(Ethereum Name Service)
- 12.5.1 ENSの歴史
- 12.5.2 ENSの仕様
- 12.5.3 ボトムレイヤー:名前の所有者とリゾルバ
- 12.5.4 中間レイヤー:.ethノード
- 12.5.5 トップレイヤー:証書
- 12.5.6 名前の登録
- 12.5.7 ENSの名前管理
- 12.5.8 ENSリゾルバ
- 12.5.9 Swarmハッシュ(コンテンツ)への名前解決
- 12.6 AppからDAppへ
- 12.7 まとめ
- 13章 イーサリアム仮想マシン(EVM)
- 13.1 EVMとは何か
- 13.1.1 既存の技術との比較
- 13.1.2 EVM命令セット(バイトコード演算)
- 13.1.3 イーサリアムのステート(状態)
- 13.1.4 SolidityのEVMバイトコードへのコンパイル
- 13.1.5 コントラクトのデプロイを行うコード
- 13.1.6 バイトコードの逆アセンブル
- 13.2 チューリング完全性とガス
- 13.3 ガス
- 13.3.1 実行中のガス会計
- 13.3.2 ガス会計に関する考察
- 13.3.3 ガス費用対ガス価格
- 13.3.4 ブロックガス上限
- 13.4 まとめ
- 14章 コンセンサス
- 14.1 PoWによるコンセンサス
- 14.2 PoS(Proof of Stake)によるコンセンサス
- 14.3 Ethash:イーサリアムのPoWアルゴリズム
- 14.4 Casper:イーサリアムのPoSアルゴリズム
- 14.5 コンセンサスの原則
- 14.6 論争と競争
- 14.7 まとめ
- 付録A イーサリアムフォークの歴史
- A.1 イーサリアムクラシック(ETC)
- A.2 非中央集権型自律組織(The DAO)
- A.3 リエントランシーのバグ
- A.3.1 技術詳細
- A.3.2 攻撃フロー
- A.4 The DAOハードフォーク
- A.4.1 The DAOハードフォーク年表
- A.5 イーサリアムとイーサリアムクラシック
- A.5.1 EVM
- A.5.2 コアネットワーク開発
- A.6 その他の著名なイーサリアムフォーク
- 付録B イーサリアムスタンダード
- B.1 イーサリアム改善提案(EIP)
- B.2 主要なEIPおよびERCの一覧
- 付録C EVMオペコードとガス消費
- 付録D 開発ツール、フレームワーク、ライブラリ
- D.1 フレームワーク
- D.1.1 Truffle
- D.1.2 Embark
- D.1.3 OpenZeppelin
- D.1.4 ZeppelinOS
- D.2 ユーティリティ
- D.2.1 EthereumJS helpeth:コマンドラインユーティリティ
- D.2.2 dapp.tools
- D.2.3 SputnikVM
- D.3 ライブラリ
- D.3.1 web3.js
- D.3.2 web3.py
- D.3.3 EthereumJS
- D.3.4 web3j
- D.3.5 EtherJar
- D.3.6 Nethereum
- D.3.7 ethers.js
- D.3.8 Emerald Platform
- D.4 スマートコントラクトのテスト
- D.4.1 ブロックチェーンテスト
- D.4.2 Ganache:ローカルテストブロックチェーン
- 付録E web3.jsチュートリアル
- E.1 説明
- E.2 async/await(非同期)方式におけるweb3.jsとコントラクトの基本操作
- E.2.1 Node.jsスクリプトの実行
- E.3 デモスクリプトの確認
- E.4 コントラクトのインタラクション
- E.5 awaitを使った非同期操作
- 付録F 短縮URL一覧
- F.1 スマートコントラクトセキュリティ
- F.2 トークン
- 訳者あとがき
- 奥付
Product information
- Title: マスタリング・イーサリアム ―スマートコントラクトとDAppの構築
- Author(s):
- Release date: November 2019
- Publisher(s): O'Reilly Japan, Inc.
- ISBN: 9784873118963
You might also like
book
行動を変えるデザイン ―心理学と行動経済学をプロダクトデザインに活用する
深津貴之氏推薦!「行動経済学、データ分析、サービス設計のエッセンスが高度に統合された行動変容デザインの良書です」 本書は、行動経済学と心理学をもとに、人々の行動、日常習慣を変える“行動変容”を促すプロダクトをデザインするための書籍です。主にヘルスケア(健康管理)、金融(資産管理)など、これまでITプロダクト(サービス、アプリなど)がなかなか使われてこなかった分野を対象に、ユーザーがやりたいと思っていたものの実行できなかった行動の実現を助けるプロダクトを作り出すための、実践的な視点や知識を提供します。
book
デザインスプリント ―プロダクトを成功に導く短期集中実践ガイド
本書はGV(旧Google Ventures)およびGoogleで提唱しているデザイン思考「デザインスプリント」の概念とその手順を実践的に解説。デザインスプリントではプロダクトやサービスのアイデアを短時間で作り上げ、ユーザーに示して評価してもらい、アイデア創出からプロトタイピング、ユーザーテストと評価までをわずか5日間で完了させるためのプロセスが定められています。本書では組織でデザインスプリントを実践するために必要な事柄を紹介し、多くのリソースを投入する前にプロダクトやサービスのアイデアを検討し、チームメンバー、ステークホルダー、そしてユーザーを巻き込みながら短期間でより良いユーザー体験を作り上げる方法を伝授します。
book
初めてのGraphQL ―Webサービスを作って学ぶ新世代API
今日では多くのWebサービスがRESTアーキテクチャスタイルで実装されています。RESTは2000年にフィールディングの論文で提唱された後に爆発的に普及し洗練されてきました。一方で、本書で紹介するGraphQLは2015年にFacebookによって公開されたRESTとは異なるアプローチのアーキテクチャです。GraphQLの最大の特徴はクエリ言語を用いてデータを操作する点です。クエリ言語の表現力の高さによりクライアントは本当に必要なリクエストを送ることができます。本書ではGraphQLの概要とGraphQLを用いたWebサービスの開発方法を実装例に沿って紹介します。認証やファイルアップロードといった実践的なトピックまで踏み込んだGraphQLの実用的な入門書です。
book
バイオインフォマティクスデータスキル ―オープンソースツールを使ったロバストで再現性のある研究
バイオインフォマティクス(生命情報科学)とは、コンピュータによる情報解析の手法を生物学の問題に応用する学問のことを指します。本書は、基本的なプログラミングに関する知識を持ったバイオ研究者を対象に、“ロバストで再現性のある研究”のため、複雑で大規模な配列データから意味を抽出し、探索するための技術を解説します。データを処理する方法としてPython、R、Gitなどのオー プンソースツールを用いるため、次世代のデータにも適用できます。近年、ニーズが高まりつつあるバイオ分野において不可欠なデータ処理技術のすべてがこの一冊に詰まっています。