プログラミング・ビットコイン

―ゼロからビットコインをプログラムする方法

[cover photo]
TOPICS
Programming , Database
発行年月日
PRINT LENGTH
344
ISBN
978-4-87311-902-1
原書
Programming Bitcoin
FORMAT
Print PDF EPUB
Ebook
3,960円
Ebookを購入する
Print
3,960円

本書は、ひとつのビットコインライブラリに必要なすべての要素を実際にコーディングすることで、ビットコイン技術の理解を深めることを狙いとした技術学習書です。ゼロから順を追ってビットコインライブラリを作成していくことで、その内部構造を紐解き、ビットコインの動作を学ぶことができます。
本書で学び終える頃には、トランザクションの作成ができるようになるのはもちろん、必要なデータをピアから受け取り、ネットワーク経由でトランザクションを送信できるようになります。数学、パース、ネットワーク接続、ブロック検証をはじめ、それらを可能にするために必要なものすべてを網羅しています。

目次

本書によせて
はじめに

1章 有限体
    1.1 高等数学を学ぶ
    1.2 有限体の定義
    1.3 有限集合の定義
        1.3.1 Pythonによる有限体の構成
        練習問題 1
    1.4 モジュロ演算
        1.4.1 Pythonにおけるモジュロ演算
    1.5 有限体の加算と減算
        練習問題 2
        1.5.1 Pythonで加算と減算をコーディング
        練習問題 3
    1.6 有限体の乗算とべき演算
        練習問題 4
        練習問題 5
        1.6.1 Pythonで乗算をコーディング
        練習問題 6
        1.6.2 Pythonでべき乗をコーディング
        練習問題 7
    1.7 有限体上の除算
        練習問題 8
        練習問題 9
    1.8 べき演算の再定義
    1.9 まとめ

2章 楕円曲線
    2.1 定義
    2.2 Pythonで楕円曲線をコーディング
        練習問題 1
        練習問題 2
    2.3 点の加算
    2.4 点の加算の数学的解説
    2.5 点の加算のコーディング
        練習問題 3
    2.6 x1 ̸= x2 のときの点の加算
        練習問題 4
    2.7 x1 ̸= x2 のときの点の加算のコーディング
        練習問題 5
    2.8 P1 = P2 のときの点の加算
        練習問題 6
    2.9 P1 = P2 のときの点の加算のコーディング
        練習問題 7
    2.10 特殊なケース
    2.11 まとめ

3章 楕円曲線暗号
    3.1 実数上の楕円曲線
    3.2 有限体上の楕円曲線
        練習問題 1
    3.3 有限体上の楕円曲線のコーディング
    3.4 有限体における点の加算
    3.5 有限体における点の加算のコーディング
        練習問題 2
        練習問題 3
    3.6 楕円曲線のスカラー倍算
        練習問題 4
        3.6.1 スカラー倍算再び
    3.7 数学の群
        3.7.1 同一性
        3.7.2 閉包
        3.7.3 可逆性
        3.7.4 可換性
        3.7.5 結合性
        練習問題 5
    3.8 スカラー倍算のコーディング
    3.9 ビットコイン用の曲線の定義
        3.9.1 secp256k1の計算
    3.10 公開(cid:20276)暗号
    3.11 署名と検証
        3.11.1 的の書き込み
        3.11.2 検証の詳細
        3.11.3 署名の検証
        練習問題 6
        3.11.4 署名検証のプログラミング
        3.11.5 署名の詳細
        3.11.6 署名の作成
        練習問題 7
        3.11.7 メッセージの署名のプログラミング
    3.12 まとめ

4章 シリアライズ
    4.1 非圧縮SECフォーマット
        練習問題 1
    4.2 圧縮SECフォーマット
        練習問題 2
    4.3 DER署名
        練習問題 3
        4.4 Base58
        4.4.1 公開(cid:20276)の転送
        練習問題 4
        4.4.2 アドレス形式
        練習問題 5
        4.4.3 WIF
        練習問題 6

    4.5 ビッグ/リトルエンディアン再び
        練習問題 7
        練習問題 8
        練習問題 9
    4.6 まとめ

5章 トランザクション
    5.1 トランザクションのコンポーネント
    5.2 バージョン
        練習問題 1
    5.3 インプット
        5.3.1 スクリプトのパース
        練習問題 2
    5.4 アウトプット
        練習問題 3
    5.5 ロックタイム
        練習問題 4
        練習問題 5
    5.6 トランザクションのコーディング
    5.7 トランザクション手数料
        5.7.1 手数料の算出
        練習問題 6
    5.8 まとめ

6章 Script
        6.1 Scriptの仕組み
        6.2 Scriptの動作
    6.3 オペレーションの例
        6.3.1 Opcode(オプコード)のコーディング
        練習問題 1
    6.4 スクリプトフィールドのパース
        6.4.1 スクリプトのパースとシリアライズのコーディング
    6.5 スクリプトフィールドの連結
        6.5.1 連結されたコマンドセットのコーディング
    6.6 標準スクリプト
    6.7 p2pk
        6.7.1 スクリプトの評価のコーディング
        6.7.2 スタックエレメントの詳細
        練習問題 2
        6.8 p2pkの問題点
        6.9 p2pkhで問題を解決
        6.9.1 p2pkh
    6.10 スクリプトは自由に構築可能
        練習問題 3
        6.10.1 Scriptの有用性
        練習問題 4
        6.10.2 SHA-1 Piñata
    6.11 まとめ

7章 トランザクションの作成と検証
    7.1 トランザクションの検証
        7.1.1 インプットの支払い状況の確認
        7.1.2 インプットの合計額とアウトプットの合計額の確認
        7.1.3 署名の確認
        練習問題 1
        練習問題 2
        7.1.4 トランザクション全体の検証
    7.2 トランザクションの作成
        7.2.1 トランザクションの構築
        7.2.2 トランザクションの作成
        7.2.3 トランザクションへの署名
        練習問題 3
    7.3 テストネットで自分のトランザクションを作成
        練習問題 4
        練習問題 5
    7.4 まとめ

8章 Pay-to-script-hash
    8.1 ベアマルチシグ
    8.2 OP_CHECKMULTISIGのコーディング
        練習問題 1
    8.3 ベアマルチシグの問題
    8.4 Pay-to-script-hash(p2sh)
    8.5 p2shのコーディング
        8.5.1 より複雑なスクリプト
        8.5.2 アドレス
        練習問題 2
        練習問題 3
        8.5.3 p2shの署名検証
        練習問題 4
        練習問題 5
    8.6 まとめ

9章 ブロック
    9.1 コインベース・トランザクション
        練習問題 1
        9.1.1 ScriptSig
        9.1.2 BIP0034
        練習問題 2
    9.2 ブロックヘッダー
        練習問題 3
        練習問題 4
        練習問題 5
        9.2.1 バージョン
        練習問題 6
        練習問題 7
        練習問題 8
        9.2.2 前のブロック
        9.2.3 マークルルート
        9.2.4 タイムスタンプ
        9.2.5 ビット
        9.2.6 ノンス
    9.3 Proof-of-Work
        9.3.1 マイナーが新しいハッシュを生成する方法
        9.3.2 ターゲット
        練習問題 9
        9.3.3 ディフィカルティ
        練習問題 10

        9.3.4 Proof-of-Workが十分であることの確認
        練習問題 11
        9.3.5 ディフィカルティ調整
        練習問題 12
        練習問題 13
    9.4 まとめ

10章 ネットワーキング
    10.1 ネットワークメッセージ
        練習問題 1
        練習問題 2
        練習問題 3
    10.2 ペイロードのパース
        練習問題 4
    10.3 ネットワークハンドシェイク
    10.4 ネットワークへの接続
        練習問題 5
    10.5 ブロックヘッダーの取得
        練習問題 6
    10.6 ヘッダーレスポンス
    10.7 まとめ

11章 SPV(Simplified Payment Verification)
    11.1 動機
    11.2 マークルツリー
    11.3 マークルペアレント
        練習問題 1
    11.4 マークルペアレントレベル
        練習問題 2
    11.5 マークルルート
        練習問題 3
    11.6 ブロックのマークルルート
        練習問題 4
    11.7 マークルツリーの使用
    11.8 マークルブロック
        11.8.1 マークルツリー構造
        練習問題 5
        11.8.2 マークルツリーのコーディング
        11.8.3 merkleblockコマンド
        練習問題 6
        11.8.4 フラグビットとハッシュの使用
        練習問題 7
    11.9 まとめ

12章 ブルームフィルター
    12.1 ブルームフィルターとは
        練習問題 1
        12.1.1 ブルームフィルター/発展編
    12.2 BIP0037ブルームフィルター
        練習問題 2
        練習問題 3
    12.3 ブルームフィルターの読み込み
        練習問題 4
    12.4 マークルブロックの取得
        練習問題 5
    12.5 対象トランザクションの取得
        練習問題 6
    12.6 まとめ

13章 Segwit
    13.1 Pay-to-witness-pubkey-hash(p2wpkh)
        13.1.1 トランザクションマリアビリティ
        13.1.2 マリアビリティの修正
    13.2 p2wpkhトランザクション
    13.3 p2sh-p2wpkh
    13.4 p2wpkhとp2sh-p2wpkhのコーディング
    13.5 Pay-to-witness-script-hash(p2wsh)
    13.6 p2sh-p2wsh
    13.7 p2wshおよびp2sh-p2wshのコーディング
    13.8 その他の改良点
    13.9 まとめ

14章 応用トピックと次のステップ
    14.1 今後の学習ガイド
        14.1.1 ウォレット
        14.1.2 ペイメントチャネルとLightning Network
    14.2 コミュニティへの貢献
    14.3 次に取り組むプロジェクト例
        14.3.1 テストネットのウォレット
        14.3.2 ブロックエクスプローラー
        14.3.3 ウェブショップ
        14.3.4 ユーティリティライブラリ
        14.3.5 就職活動
    14.4 終わりに

付録A 解答
    1章:有限体
    2章:楕円曲線
    3章:楕円曲線暗号
    4章:シリアライズ
    5章:トランザクション
    6章:Script
    7章:トランザクションの作成と検証
    8章:Pay-to-script-hash
    9章:ブロック
    10章:ネットワーキング
    11章:SPV(Simplified Payment Verification)
    12章:ブルームフィルター

監訳者あとがき
索引