詳解 ビットコイン

―ゼロから設計する過程で学ぶデジタル通貨システム

[cover photo]
TOPICS
Database
発行年月日
PRINT LENGTH
504
ISBN
978-4-87311-908-3
原書
Grokking Bitcoin
FORMAT
Print PDF EPUB
Ebook
4,180円
Ebookを購入する
Print
4,180円

本書は、ビットコインとブロックチェーンをゼロから概念的に組み立てていきながら、その仕組みを深く理解するための解説書です。架空の会社内におけるトークンシステム構築に携わるストーリーを通じ、ゼロから徐々に追加する形で機能を積み上げることで、それぞれの機能の意味を深くはっきりと理解することができます。
技術者ではない人や、自分でゼロから作ってみる余裕のない人でも、ビットコインのようなデジタル通貨システムの設計の過程を追体験することができます。ある程度のコンピューターネットワークの知識があれば、プログラミング経験や数学の知識は不要です。

●「監訳者あとがき」より

本書『詳解 ビットコイン―ゼロから設計する過程で学ぶデジタル通貨システム』は、2019年にManning Publications社から刊行された、Kalle Rosenbaum著『Grokking Bitcoin』の全訳です。


私が、本書の監訳の依頼をいただいたとき、原著はまだ完成していませんでした。ですが、読ませていただいた未完の原稿を通して、本書でどのようにビットコインの技術を説明するのか、そのアイデアを知り、すぐにお引き受けすることを決めました。


本書では、ゼロからインクリメンタルに(徐々に追加する形で)機能を積み上げることで、何の変哲もないカフェのトークンシステムがビットコインに生まれ変わっていきます。この表現のアイデアはとてもすばらしく、読者を魅了するでしょう。同時に、これは技術を理解するために非常に適した表現方法だと言えます。私たち技術者は、まさにインクリメンタルにソフトウェアを設計するからです。ビットコインを発明した匿名の開発者サトシ・ナカモトが実際にこの順序で設計したかどうか(おそらくは異なるのですが)にかかわらず、インクリメンタルな説明では、それぞれの段階で追加される機能の意味がはっきりします。


物理学者の故リチャード・ファインマン博士は、黒板に“What I cannot create, I do not understand.”(自分で創れないとしたら、私は理解していない)という言葉を遺しました。そのすぐ下には“Know how to solve every problem that has been solved.”(今までに解かれたすべての問題の解き方を知れ)と書かれており、ファインマンが、これらの言葉を通して「どんな既存の理論的成果も自分でゼロから導けるようになれ。さもなければ本当には理解していないということだ」と伝えたかったことがわかります。


同じように、ゼロから自分で同様なソフトウェアを設計できないとすれば、その技術を本当に理解したとは言えないでしょう。私はブロックチェーンの(こともやる)研究者として、いくつかの独自の設計を発表していますが、そのことを通してさまざまな発見をし、理解を深めることができました。私自身、「自分で創れないとしたら、私は理解していない」という言葉の意味を身をもって知ったと思います。


本書では、技術者ではない人や、自分でゼロから作ってみる余裕のない人でも、ビットコインのようなデジタル通貨システムの設計の過程を追体験できます。ひとつひとつの課題を解決し、改ざんも検閲もできない仕組みとして創り上げていく、生き生きとしたストーリーを通して、誰にとってのどんな問題を解決するために、どんな仕組みの何を導入したのかが明確になります。


本書では、トークンシステムのビットコインへの改造が、社内の複数の開発者たちの手によって行われる様子が描かれていますが、現実のビットコインも、立ち起こる課題に対して多くの開発者たちがアイデアを出し合い、解決に貢献することにより成り立っています。テクノロジーが、科学(この場合コンピューターサイエンス)を応用するさまざまな人々の知恵の集積であることを、読者のみなさんは改めて知ることになるでしょう。
(中略)
ビットコインという技術の理解を出発点として、本書がプライバシー、検閲からの自由、民主主義、技術の在り方、そして広く人と社会について考えるきっかけになったとしたら、監訳者として望外の喜びです。


2020年3月 斉藤賢爾

正誤表

ここで紹介する正誤表には、書籍発行後に気づいた誤植や更新された情報を掲載しています。以下のリストに記載の年月は、正誤表を作成し、増刷書籍を印刷した月です。お手持ちの書籍では、すでに修正が施されている場合がありますので、書籍最終ページの奥付でお手持ちの書籍の刷版、刷り年月日をご確認の上、ご利用ください。

正誤表


第1刷までの修正
2023年6月更新

■P.71 監訳注
【誤】この場合の現像である公開鍵は
【正】この場合の原像である公開鍵は

■P.75 下から 3行目
【誤】ジョンのアドレスをbaset58check復号(decode)し、
【正】ジョンのアドレスをbase58check復号(decode)し、

■P.157 上から 2行目
【誤】このハッシュの現像を示せた人は、
【正】このハッシュの原像を示せた人は、

■P.190
図6.17 一番右下のテキスト
【誤】ハッシュ出力は2、0、6なので、これらのビットの値を1にする
【正】ハッシュ出力は5、0、3なので、これらのビットの値を1にする

■P.296 本文14行目
【誤】そして、指紋(fingerprint)として、鍵の16ビットSHA-1ハッシュが公開されています。
【正】そして、指紋(fingerprint)として、鍵の160ビットSHA-1ハッシュが公開されています。

■P.325 本文4行目
【誤】タイムロックとは、特定の時刻が来るまでブロックを無効のままにします。
【正】タイムロックとは、特定の時刻が来るまでトランザクションを無効のままにします。

■P.336 上から 5行目
【誤】Hの現像とジョンの署名の提示によって。
【正】Hの原像とジョンの署名の提示によって。

■P.344 下から 2行目
【誤】エンジンが指導するような
【正】エンジンが始動するような

■P.355 「9.8 まとめ」最初の項
【誤】総体ロック
【正】相対ロック

■P.411 上から6行目に
【誤】旧ノードがSetwitトランザクションを含む…
【正】旧ノードがSegwitトランザクションを含む…

目次

序文
はじめに

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章 

監訳者あとがき
索引