概要
本書は,最初に構築されたブロックチェーンネットワークである「ビットコインネットワーク」の解説書です。利用される技術(暗号,アドレス,トランザクション,ブロック)をご自身で手を動かしながら習得できる構成です。さらに,後半ではマルチシグ(MultiSig)やコールドウォレットなどをいかに有効活用するかなど,セキュリティ対策のあるべき姿をシステムアーキテクチャや運用設計の観点から説明しています。
こんな方におすすめ
- ブロックチェーンの技術や具体的な開発/運用方法,セキュリティ問題/対策に興味のある方
- ビットコインのシステム開発を企画している方
目次
Part1 ブロックチェーンと関連技術
Chapter1 ブロックチェーンの全体像
- 1.1 ブロックチェーン
- 1.2 ビットコインネットワーク
- 1.3 Ethereum
- 1.4 ブロックチェーンネットワークの構成要素
- 1.5 ビットコインネットワークの全体図
- 1.6 BIP(Bitcoin Improvement Proposals)
Chapter2 ビットコインネットワークを利用するための環境準備
- 2.1 Ubuntuのインストール
- 2.2 Bitcoin Explorerのインストール
- 2.3 Bitcoin Coreのインストール
- 2.4 初期セットアップとtestnetへの接続
Chapter3 ビットコインネットワークを理解するための暗号技術
- 3.1 ハッシュ関数
- 3.2 公開鍵暗号
- 3.3 楕円曲線
- 3.4 デジタル署名
- 3.5 ECDSAの署名と検証の詳細
Part2 ビットコインネットワーク
Chapter4 鍵,アドレス,ウォレット
- 4.1 所有権を特定する「鍵」と「錠」
- 4.2 鍵を管理する「ウォレット」
- 4.3 ウォレットの種類
- 4.4 送金先となるアドレス
- 4.5 秘密鍵/公開鍵のフォーマット
- 4.6 非決定性ウォレットと決定性ウォレット
- 4.7 階層的決定性ウォレット(HDウォレット)
- 4.8 拡張鍵
- 4.9 強化導出鍵
- 4.10 ニモニックコード
- 4.11 BIP 0044のHDウォレット
Chapter5 トランザクション
- 5.1 トランザクションのライフサイクル
- 5.2 トランザクションの概要
- 5.3 トランザクションの構造
- 5.4 UTXOと残高
- 5.5 Locking ScriptとUnlocking Script
- 5.6 トランザクションの署名ロジック
- 5.7 トランザクションの識別子(TXID)
- 5.8 トランザクションの置換(Replace by Fee)
Chapter6 ブロックとブロックチェーン
- 6.1 ブロックの構造と識別子
- 6.2 ブロックからトランザクションを検索する(マークルツリー)
Chapter7 マイニングとコンセンサスアルゴリズム
- 7.1 ビザンチン将軍問題と分散型コンセンサス
- 7.2 PoW(Proof-Of-Work)
- 7.3 トランザクションの集積
- 7.4 マイナーの報酬トランザクション(coinbaseトランザクション)
- 7.5 チェーンの分岐(フォーク)
- 7.6 51%攻撃
Chapter8 Segregated Witness
- 8.1 SegWitが導入された背景
- 8.2 トランザクションのデータ構造の変化
- 8.3 ブロックサイズの計算方法の変更
- 8.4 witness version と witness program
- 8.5 P2WPKH(Pay to Witness Pubkey Hash)
- 8.6 P2WSH(Pay to Witness Script Hash)
- 8.7 P2SH-P2WPKH
- 8.8 P2SH-P2WSH
- 8.9 SegWitトランザクションの署名方法
- 8.10 SegWitのアドレス
- 8.11 SegWitのcoinbaseトランザクション
Chapter9 P2P
- 9.1 ノードの発見とP2Pへの参加
- 9.2 メッセージのタイプとデータ
- 9.3 ハンドシェイク
- 9.4 トランザクションの伝搬
Part3 ビットコインネットワークを体験しよう
Chapter10 ウォレット
- 10.1 ウォレットを操作するための準備
- 10.2 ウォレットファイルのダンプとバックアップ
- 10.3 アドレスの生成
- 10.4 HDウォレットの確認
- 10.5 マルチウォレットの利用
Chapter11 P2PKH,P2SH
Chapter12 P2WPKH,P2WSH
Chapter13 P2SH-P2WPKH,P2SH-P2WSH
- 13.1 P2SH-P2WPKH
- 13.2 P2SH-P2WSH
Chapter14 Locktime,Replace by Fee
- 14.1 Locktime
- 14.2 Replace by Feeを試してみよう
Chapter15 ブロック
- 15.1 ブロックを確認しよう
- 15.2 coinbaseトランザクションを確認しよう
- 15.3 ブロックハッシュを計算しよう
- 15.4 マークルルートを計算しよう
Chapter16 オリジナルウォレットで送金しよう
- 16.1 オリジナルウォレットでTXを生成・署名してみよう
- 16.2 P2Pのプロトコルを実装してトランザクションを送信する
Part4 セキュリティ
Chapter17 ホットウォレットのセキュリティ
- 17.1 秘密鍵をホットウォレットとするか検討する
- 17.2 拡張公開鍵の利用時の注意点
- 17.3 一定額を超えたらコールドウォレットで保管する
- 17.4 秘密鍵を公開サーバに保管しない
- 17.5 侵入経路を断つ
- 17.6 セグメントを分ける
- 17.7 許可する通信/起動するサービスを最小限にする
- 17.8 OSのユーザを適切に分ける
- 17.9 ファイルのアクセス権限を最小限にする
- 17.10 内部端末からの攻撃への対策
- 17.11 内部犯行対策も行う
- 17.12 マルチシグで秘密鍵を分散する
- 17.13 バックアップサイトやDRサイトのアクセスコントロール
- 17.14 JSON-RPCにIDとパスワードを設定する
- 17.15 通信の暗号化と注意点
- 17.16 ウォレットの暗号化
- 17.17 不正の検知・遮断
- 17.18 監査ログの取得
- 17.19 リリース前に本番で使うウォレットを生成しない
Chapter18 コールドウォレットのセキュリティ
- 18.1 外部の人間によるウォレットへのアクセス
- 18.2 ハードウェアウォレット接続端末への攻撃
- 18.3 担当者のアクセスコントロール
- 18.4 ニモニックコードの取り扱い
- 18.5 ホットウォレット/コールドウォレットセキュリティの総括
Chapter19 その他のセキュリティ事項
- 19.1 ユーザのプライバシーを守る
- 19.2 リスクとスピードのバランスに鑑みて承認回数を決定する
- 19.3 クライアントアプリの脆弱性と鍵管理
- 19.4 ECDSAパラメータの使い回しによる秘密鍵の漏洩
サポート
正誤表
本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。
(2018年10月10日最終更新)
P.84 図4-9-1の左から2番目の箱内
誤 |
00 || 親公開鍵 || インデックス
|
正 |
00 || 親秘密鍵 || インデックス
|
P.290 図17-2-5の左から2番目の箱内
誤 |
00 || 親公開鍵 || インデックス
|
正 |
00 || 親秘密鍵 || インデックス
|
(以下2018年7月19日更新)
P.60 リスト4-4-1の下から5~4行目のコメント
誤 |
# 剰余
# 剰余とBase58を連結して先頭に追加
|
正 |
# 商と剰余を計算
# 剰余をBase58化して先頭に追加
|
P.61 リスト4-4-2の下から6行目のコメント
誤 |
# 除外した1の数だけ0を先頭に追加
|
正 |
# 除外した1の数だけ00を先頭に追加
|
P.102 図5-3-2の説明文の4行目
誤 |
ビットコインワーク
|
正 |
ビットコインネットワーク
|
P.163 コマンド10-3-3のキャプション
誤 |
P2SH(P2PKH)アドレスを生成
|
正 |
P2SH-P2WPKHのアドレスを生成
|
P.182 本文下から2行目
P.182 コマンド11-1-12のキャプション
誤 |
送信元のアドレスを確認
|
正 |
送金元のアドレスを確認
|
P.190 コマンド11-1-24のキャプション
誤 |
署名済みトランザクションをbcit decoderawtransationで確認
|
正 |
署名済みトランザクションをbcit decoderawtransactionで確認
|
ダウンロード
本書のコマンドとリストをダウンロードできます。次のファイルをダウンロードして解凍すると「commnad」と「list」フォルダがあります。
- ダウンロード
- BitCoin20180720.zip(約60KB)
commnadフォルダには,各Chapterのファイルがあります。listフォルダには,リスト番号別のフォルダがあります。なお,コマンド4-10-1で利用する「en.txt」もlistフォルダにあります。