詳解 ビットコイン ゼロから設計する過程で学ぶデジタル通貨システム
詳解 ビットコイン ―ゼロから設計する過程で学ぶデジタル通貨システム
オライリー・ジャパン
著者:Kalle Rosenbaum
監訳:斉藤賢爾
訳者:長尾高弘
序文
はじめに
1章 ビットコイン入門
1.1 ビットコインとは何か
1.2 ビットコインの全体像
1.2.1 ステップ❶─トランザクション
1.2.2 ステップ❷─ビットコインネットワーク
1.2.3 ステップ❸─ブロックチェーン
1.2.4 ステップ❹─ウォレット
1.3 従来のお金が抱えている問題
1.3.1 格差
1.3.2 プライバシー侵害
1.3.3 インフレ
1.3.4 国境線
1.4 ビットコインのアプローチ
1.4.1 非中央集権化
1.4.2 制限されたサプライ
1.4.3 ボーダーレス
1.5 ビットコインはどのように使われるか
1.5.1 貯蓄
1.5.2 海外への支払い
1.5.3 ショッピング
1.5.4 投資
1.5.5 通貨以外としての用途
1.5.6 ビットコインの評価方法
1.5.7 ビットコインを使うべきでないとき
1.6 その他の暗号通貨
1.7 まとめ
2章 暗号学的ハッシュ関数とデジタル署名
2.1 クッキートークンスプレッドシート
2.2 暗号学的ハッシュ
2.2.1 暗号学的ハッシュ関数が役立つのはなぜか
2.2.2 暗号学的ハッシュ関数の仕組み
2.2.3 暗号学的ハッシュ関数の性質
2.2.4 「困難」
2.2.5 よく知られているほかのハッシュ関数
2.2.6 暗号学的ハッシュの復習
2.3 演習問題
2.3.1 基本問題
2.3.2 発展問題
2.4 デジタル署名
2.4.1 デジタル署名の典型的な用途
2.4.2 クッキートークンシステムのセキュリティの向上
2.4.3 準備:ジョンが鍵ペアを生成する
2.4.4 鍵ペアについての復習
2.4.5 そもそも何の話でしたっけ?
2.4.6 ジョンが支払いに署名する
2.4.7 リサがデジタル署名を検証する
2.4.8 秘密鍵のセキュリティ
2.5 復習
2.6 演習問題
2.6.1 基本問題
2.6.2 発展問題
2.7 まとめ
3章 アドレス
3.1 クッキーの習慣
3.2 名前から公開鍵へ
3.2.1 新しい支払いのプロセス
3.3 公開鍵の短縮
3.3.1 公開鍵をハッシングして20バイトに
3.3.2 なぜSHA-256とRIPEMD-160の併用なのか
3.4 高くつく入力ミスを避ける方法
3.4.1 そもそも何の話でしたっけ?
3.4.2 base58check
3.4.3 base58checkの復号
3.5 再びプライバシーについて
3.6 復習
3.6.1 システムの変更内容
3.7 演習問題
3.7.1 基本問題
3.7.2 応用問題
3.8 まとめ
4章 ウォレット
4.1 ウォレットの最初のバージョン
4.2 秘密鍵のバックアップ
4.2.1 パスワードの強度についてひとこと
4.2.2 パスワードを使って暗号化したバックアップの問題点
4.3 階層的決定性(HD)ウォレット
4.3.1 マスター拡張秘密鍵の生成
4.3.2 子拡張秘密鍵の生成
4.3.3 そもそも何の話でしたっけ?
4.4 バックアップの話にカムバック
4.4.1 ニーモニック文
4.4.2 シードのニーモニック文への符号化
4.4.3 ニーモニック文からシードへの復号
4.5 拡張公開鍵
4.6 ハードニングされた秘密鍵の生成
4.7 公開鍵の数学的操作
4.7.1 公開鍵の乗算
4.7.2 これがなぜセキュアなのか
4.7.3 拡張公開鍵の生成
4.7.4 公開鍵の符号化方式
4.8 復習
4.8.1 システムの変更内容
4.9 演習問題
4.9.1 基本問題
4.9.2 応用問題
4.10 まとめ
5章 トランザクション
5.1 旧システムの問題点
5.2 トランザクションを使った支払い
5.2.1 ジョンがトランザクションを作成する
5.2.2 リサがトランザクションを承認する
5.2.3 検証したい人がトランザクションを検証する
5.2.4 公開鍵の公開がセキュリティに及ぼす影響
5.2.5 口座ベースのシステムと値ベースのシステム
5.3 スクリプト
5.3.1 なぜプログラムを使うのか
5.3.2 なぜ署名スクリプト、公開鍵スクリプトという名前なのか
5.3.3 そもそも何の話でしたっけ?
5.4 特殊な支払いのタイプ
5.4.1 マルチシグ
5.4.2 P2SH(pay-to-script-hash)
5.4.3 P2SHアドレス
5.5 トランザクションに含まれるその他のもの
5.6 報酬とコインの作成
5.6.1 ver.4.0からの変化
5.7 リサに対する信頼
5.8 復習
5.8.1 システムの変更内容
5.9 演習問題
5.9.1 基本問題
5.9.2 応用問題
5.10 まとめ
6章 ブロックチェーン
6.1 リサがトランザクションを削除できることについて
6.2 ブロックチェーンの構築
6.2.1 リサのブロック作成作業
6.2.2 なぜこれでトランザクションの削除からユーザーを守れるのか
6.2.3 なぜブロックチェーンを使うのか
6.3 簡易ウォレット
6.3.1 わかりにくいアドレスとしてのブルームフィルター
6.3.2 そもそも何の話でしたっけ?
6.4 マークル木
6.4.1 マークルルートの作り方
6.4.2 トランザクションがブロック内に含まれていることの証明
6.4.3 実際の仕組み
6.5 簡易ウォレットのセキュリティ
6.6 復習
6.6.1 システムの変更内容
6.7 演習問題
6.7.1 基本問題
6.7.2 応用問題
6.8 まとめ
7章 プルーフオブワーク
7.1 リサのクローン
7.1.1 ブロックの衝突
7.1.2 くじ引き方式
7.1.3 分裂が起きる確率
7.1.4 そもそも何の話でしたっけ?
7.2 本当の数値の申告を強制する仕組み
7.2.1 有効なプルーフオブワークの作り方
7.2.2 この方法がよい理由
7.2.3 ラッキーナンバー方式との比較
7.2.4 ノンスを使い切ったらどうすればよいのか
7.3 マイナーは社外へ
7.3.1 ハッシュ率の増加
7.3.2 ブロック率が高すぎるときの問題
7.3.3 解決されていない問題は何か
7.4 難易度の調整
7.4.1 タイムスタンプのルール
7.4.2 チェーンの強さと長さ
7.5 マイナーはどのような悪事を働けるか
7.5.1 二重払いが成功する状況
7.5.2 二重払い攻撃からの防御方法
7.6 トランザクション手数料
7.6.1 大きなサイズは処理に時間がかかる
7.6.2 トランザクション手数料でこの問題を解決
7.6.3 限られたブロックサイズ
7.6.4 ブロック補助金が0になるとき
7.7 復習
7.7.1 システムの変更内容
7.8 演習問題
7.8.1 基本問題
7.8.2 応用問題
7.9 まとめ
8章 ピアツーピアネットワーク
8.1 共有フォルダー
8.2 ピアツーピアネットワークを構築しよう
8.3 ふたつのピアはどのようにして情報をやり取りするのか
8.4 ネットワークプロトコル
8.4.1 ジョンがトランザクションを送る
8.4.2 トムがトランザクションを転送する
8.4.3 カフェの簡易ウォレットが通知を受け取る
8.4.4 ブロックにトランザクションを入れる
8.4.5 ウォレットに通知する
8.4.6 承認の追加
8.5 クッキートークンシステムからの卒業
8.5.1 ビットコインの現状
8.5.2 そもそも何の話でしたっけ?
8.6 ネットワークのブートストラップ
8.6.1 ステップ.─ソフトウェアの実行
8.6.2 ステップ.─ノードへの接続
8.6.3 ステップ.─同期
8.6.4 ステップ.─通常の運用
8.7 独自のフルノードの実行
8.7.1 Bitcoin Coreのダウンロード
8.7.2 ソフトウェアの検証
8.7.3 パッケージの解凍と起動
8.7.4 ブロックチェーンの初期ダウンロード
8.8 復習
8.8.1 第1部─トランザクションの流れ
8.8.2 第2部─ネットワークへの参加
8.8.3 システムの変更内容
8.9 演習問題
8.9.1 基本問題
8.9.2 応用問題
8.10 まとめ
9章 再びトランザクションについて
9.1 タイムロックされたトランザクション
9.1.1 ロックタイムの表現方法
9.1.2 相対タイムロックの指定
9.2 タイムロックされた出力
9.2.1 絶対タイムロックされた出力
9.2.2 相対タイムロックされた出力
9.2.3 アトミックスワップ
9.3 ビットコインブロックチェーンへの情報の格納
9.3.1 不必要に大きくなったUTXOセット
9.3.2 ビットコインに埋め込まれたトークン
9.3.3 オーナーの証拠を使った車の始動
9.4 処理してもらえないトランザクションの交換
9.4.1 オプトインRBF
9.4.2 親のために支払う子
9.5 さまざまな署名タイプ
9.6 復習
9.7 演習問題
9.7.1 基本問題
9.7.2 応用問題
9.8 まとめ
10章 セグウィット
10.1 セグウィットによって解決される問題
10.1.1 トランザクション展性
10.1.2 署名検証の効率の悪さ
10.1.3 帯域幅の無駄遣い
10.1.4 Script言語のアップグレードは困難
10.2 解決方法
10.2.1 セグウィットアドレス
10.2.2 セグウィット出力による支払い
10.2.3 セグウィットトランザクションの検証
10.2.4 セグウィットトランザクションのブロックへの組み込み
10.2.5 P2WSH(pay-to-witness-script-hash)
10.2.6 署名の新しいハッシング方法
10.2.7 帯域幅の節約
10.2.8 アップグレード可能なスクリプト
10.3 ウォレットの互換性
10.4 支払いタイプの復習
10.5 ブロックの限界
10.5.1 ブロックサイズの制限
10.5.2 署名演算数の制限
10.5.3 制限の緩和
10.6 復習
10.6.1 解決方法
10.7 演習問題
10.7.1 基本問題
10.7.2 応用問題
10.8 まとめ
11章 ビットコインのアップグレード
11.1 ビットコインのフォーク
11.1.1 ブロックチェーンのフォークをともなわない変更
11.1.2 ハードフォーク
11.1.3 ソフトフォーク
11.1.4 ハードフォークとソフトフォークの違い
11.2 トランザクションのリプレイ
11.2.1 リプレイプロテクション
11.3 アップグレードメカニズム
11.3.1 コインベースによるシグナリング:BIP-16
11.3.2 ブロックのバージョン番号を上げることによるシグナリング:BIP-34、66、65
11.3.3 ブロックバージョンビットによるシグナリング:BIP-9
11.3.4 BIP-9による相対ロックタイムのデプロイ
11.3.5 BIP-9によるセグウィットのデプロイ
11.3.6 UASF
11.4 復習
11.5 演習問題
11.5.1 基本問題
11.5.2 応用問題
11.6 まとめ
付録A bitcoin-cliの使い方
A.1 bitcoindとの通信
A.1.1 curlを使った方法
A.2 GUIA.3 bitcoin-cliの使い方を学ぶ
A.4 実際に使ってみましょう
A.4.1 暗号化ウォレットの作成
A.4.2 ウォレットのバックアップ
A.4.3 お金の受領
A.4.4 送金
付録B 演習問題の解答
2章
3章
4章
5章
6章
7章
8章
9章
10章
11章
監訳者あとがき
索引