Bitcoin の基本と体験 @ DG Lab - Anditto Heristyo 2017 Digital Garage. All rights reserved. Redistribution or public display not permitted without written permission from Digital Garage.
Agenda 1. 目標 2. BC2のBitcoin 3. Bitcoin-cliの体験 4. Bitcoinの概要 2
このセッションの目標 3
目標 1. Bitcoin-cli の体験 2. Bitcoin 全般の話 全般的な話ですので 今は全部わからなくても大丈夫です 4
事前チェック - ソースコードはダウンロードしましたか? - ちゃんとコンパイル出来ましたか? - まだ問題がある方は はやめに声をかけてください 完了しなかったら続けないよ 本当に困っている人はスタッフに声をかけてください 5
BC2 の Bitcoin バージョン 6
ワークショップで使う Bitcoin https://www.github.com/dgarage/bc2 - Bitcoin Core のフォークです - 中身はほぼ同じですが 7
BC 2 バージョン BitcoinのP2Pネットワーク プライベートネットワーク マジックナンバーが異なる マイニングは難しい 簡単に設定した (10 分ごとに生成する ) 1 分にする アドレスの頭は 1 または 3 B または C になる 8
BC 2 と Bitcoin Core Bitcoin Core ネットワーク BC 2 全く別のネットワーク 9
注意点 操作は本物の bitcoind および bitcoin-cli と全く同じです 両方持っている人は間違わないように ご注意をお願いします 10
早速始めましょう! まず ターミナルを開いて bitcoind を実行します $ cd ~/bc2/src $./bitcoind -printtoconsole あるいは : $./bitcoind -daemon 11
最初の出力 - ウォレット ( 秘密鍵 ) の作成 - ネットワークに繋ぐ - ブロック情報の更新 12
確認 別のウインドウで : $./bitcoin-cli getblockchaininfo 13
(BC 2 )Bitcoin をゲットしましょう! アドレスを作成します : $./bitcoin-cli getnewaddress 14
Bitcoin をゲットしましょう! 出力されたアドレスはここに入力してください : http://172.16.120.201:8888/faucet.html 出力された TxID をどこかに保存してください 残高のチェック : $./bitcoin-cli getbalance 何が出ましたか? 15
Mempool トランザクション (Tx) が有効であれば Mempool に入れます そして ノードに送信します $./bitcoin-cli getrawmempool 16
マイニングします $./bitcoin-cli generate 1 ( マイニングは後ほど説明します ) $./bitcoin-cli generate 1 50000000 もう一度やってみると : $./bitcoin-cli getbalance 17
BTC を送ってみよう もう一度アドレスを作成して グループ内の人にアドレスを聞いて 送ってみてください 一番シンプルなやり方 : $./bitcoin-cli sendtoaddress < アドレス > < 金額 > 18
ブロックチェーン エクスプローラ BC 2 は : http://explorer.bc-2.jp Bitcoin は : 検索すれば色々と見つかります 19
データの信用性 結局自分のデータしか信用できません でも 他の人に頼らなくて 自分のデータがあるからこそ分散台帳技術 (Distributed Ledger Technology ) には価値があります 20
bitcoin-cli のコマンド $./bitcoin-cli help $./bitcoin-cli help < コマンド > https://en.bitcoin.it/wiki/original_bitcoin_client/api_calls_list 注意点 : ウォレットの account 系のコマンドはバグっています 21
Bitcoin の概要 22
3 つのネットワーク 23
Bitcoin のネットワーク Peer-to-Peer (P2P) Icon by Creative Stall From Noun Project 24
3 つのネットワーク 1. Mainnet - メインネットワーク $ bitcoin-cli < コマンド > 注意点 Mainnet はリアルなお金なので 気をつけてください 25
3 つのネットワーク 2. Testnet - テストネットワーク $ bitcoin-cli -testnet < コマンド > - 機能などは Mainnet とほぼ同じ - マイニングの難しさは低く設定されている - BTC は価値が無い ( だから価値がある ) - よく壊れている 26
3 つのネットワーク 3. Regtest - Regression Test 用のネットワーク $ bitcoin-cli -regtest < コマンド > - 自分のローカル環境のみ - 自分でマイニングしないといけない 27
ブロックチェーンの中身 28
ブロックチェーン ブロック 44121 ブロック 44122 ブロック 44123 もっと詳しく見よう 29
ブロックの中身 マジックナンバー 4 bytes ブロックサイズ 4 bytes ブロックヘッダー 80 bytes トランザクションの数 1-9 bytes 全トランザクションのデータ もっと詳しく見よう $./bitcoin-cli getbestblockhash $./bitcoin-cli getblock 30
ブロックのヘッダー hashprevblock hashmerkleroot Bits Nonce バージョン 4 bytes 前ブロックヘッダーの 256-bit ハッシュ 32 bytes トランザクションデータの MerkleRoot 32 bytes タイムスタンプ 4 bytes ターゲット ( 難しさ ) 4 bytes 32-bit の数値 4 bytes $./bitcoin-cli getbestblockhash $./bitcoin-cli getblockheader 31
Merkle Root https://ja.wikipedia.org/wiki/ ハッシュ木 Tx 1 Tx 2 Tx 3 Tx 4 32
マイニング 33
マイニング Bitcoin Core の場合 自分の Regtest ネットワークであれば 先ほどと同じく : $./bitcoin-cli -regtest generate 1 34
ASIC マイニング Application Specific Integrated Circuit Bitcoin( あるいは他のコイン ) のためだけの IC 例えば Antminer S9 は 14TH/s 一方 現在私たちのネットワークは : $./bitcoin-cli getmininginfo Antminer S9 https://www.bitmain.com/ 35
マイニング ( 実際は ) 一番大きなマイナー Antpool 2015 年 2 月の記事 http://qntra.net/2015/02/inside-the-bitcoin-mine-of-antpool-bw-com/ 36
マイニングのインセンティブ リソースを大量に使ってまで何故マイニングするのでしょう? 1. Block Reward( 報酬 ) a. 現在は12.5 BTC b. CoinbaseのTxになる (TxInが無い) 2. Transaction Fee ( 手数料 ) a. ブロック全 Txのデータから集める b. Block Reward は4 年毎に半減し2140 年頃ゼロになる 37
マイニングプール 基本的に : 参加者のプロセッシングパワーを合わせて 目指すハッシュ値が出る確率を高め マイニングで獲得した報酬や手数料を分配します 仕組みはマイニングプール毎に様々なので ここでは説明しません 38
Proof of Work 39
Proof of Work(PoW) ブロックのハッシュ < ターゲット 例えば : 0x0000000000000000029d053e0ebe6a40db0fb47c5b24e30dbd751f0d767cfcda < 0x00000000FFFF0000000000000000000000000000000000000000000000000000 40
もっと説明すると 1. 出力したハッシュの値は完全ランダム 2. 1 番目のビットが 0 である確率は1/2 3. 2 番目のビットも 0 である確率は更に1/2( つまり1/4) 4.... 考え方 : コインを投げ続けて 何回も勝ち続けている 0x0000000000000000029d053e0... 41
Proof of Work(PoW) $./bitcoin-cli getdifficulty $./bitcoin-cli getblockchaininfo difficulty = 最大のターゲット / 現在のターゲット https://en.bitcoin.it/wiki/difficulty あるいは : $./bitcoin-cli getblocktemplate $./bitcoin-cli convertcompact <bits> #BC2 のみ 42
Proof of Work(PoW) - Hashcash (Adam Back, 1997) (https://en.wikipedia.org/wiki/hashcash) - BTC Mainnet :1 ブロック 10 分ぐらい - 2016 ブロックごとに再計算 (2 週間分 ) - BC 2 : 1 ブロック 1 分ぐらい - 60 ブロックごとに再計算 (1 時間分 ) 43
Proof of Work(PoW) ブロックのデータを作成 ハッシュ 結果はターゲット範囲ですか? Nonce++ はい ブロックを完成して 送信する 44
Proof of Work(PoW) ブロックのデータを作成 ハッシュ 結果はターゲット範囲ですか? Nonce++ 32-bit Nonce が限界になったら? ( よくあること ) ExtraNonce( 時間 ++) 未来時間は 2 時間まで許されている MerkleRoot の一番左の Tx を変更 (Coinbase Tx) はい ブロックを完成して 送信する 45
トランザクション (Tx) 46
トランザクションの中身 前の Tx TxIn 0 TxIn 1... バージョン 4 bytes TxIn の数 1-9 bytes TxIn 0 TxIn 1... TxOut の数 1-9 bytes TxOut 0 TxOut 1... ロックタイム 4 bytes 午後のセッションで詳しく見ましょう TxOut 0 TxOut 1... 47
TxIn の中身 前の Tx のハッシュ 32 bytes その Tx の TxOut のインデックス 4 bytes TxIn- スクリプトの長さ 1-9 bytes scriptsig TxIn- スクリプト シーケンス番号 (0xFFFFFFFF) 4 bytes scriptsig Unlocking Script 48
TxOut の中身 バリュー 8 bytes TxOut- スクリプトの長さ 1-9 bytes scriptpubkey ロックのスクリプト scriptpubkey Locking Script 49
UTXO Unspent Transaction Output まだ使われてない / 他のTxInとして使えるTxOut ネットワーク全体のUTXO 情報 : $./bitcoin-cli gettxoutsetinfo 50
手数料 (Transaction Fee) Tx 1A1AAA... 1 BTC Tx 1B2BBB... 0.99998 BTC 余り / 手数料 0.00002 BTC 任意の値ですが 手数料を高く設定する理由は : 1. Txのサイズが大きい 2. 早めにブロックに入れて欲しい 51
トランザクションの流れ 1. Txの作成 2. Verify 3. ノードに送信する 4. 他のノードもVerifyする 5. Mempoolに入る 6. ノードの中にマイナーがいたらブロック作成時に組み入れる 7. ブロック作成が成功したら ブロックチェーンに入る (confirmation=1) 8. その後ブロックが積み重なっていくとconfirmationの回数も上がる 52
ブロックチェーン Block 44121 Block 44122 Block 44123 Tx Tx Tx Tx ブロックと Tx の連鎖であり ブロックとブロックの連鎖である 53
コンセンサス 54
コンセンサス 複数の意味があります : - プロトコル? - デベロッパー? 基本的に : 皆が持っているブロックを同じにするためのルール 55
考え方 望ましい ( 正しい ) 行動のほうがインセンティブが高い 例 : Tx をわざと却下するより OKを出したほうが儲かる Tx 送信 マイナー A マイナー B Fee をもらう 56
考え方 例 : マイナーはブロックを却下するより 一番長い連鎖を作った方が儲かる マイナー A マイナー C マイナー B 57
コンセンサス - どのチェーンが一番正しい? - どういうブロックが有効 ( あるいは無効 )? - どのトランザクションが有効 ( あるいは無効 )? 2 日目にデモがあります! 58
アドレス 59
Bitcoin アドレス Mainnet の場合は現在 : - P2PKH (Pay to Public Key Hash) - P2SH (Pay to Script Hash) 60
Bitcoin アドレスの基本的な作り方 Private Key (ECDSA) Public Key RIPEMD160( SHA256( Key ) ) SHA256( SHA256( X ) ) バージョン + 160-bitデータ Checksum Main: 1 Test: m/n 0 160-bitデータ 4-byteデータ Base58 Encode 最初の 4-byte 1 アドレス 61
注意点 アドレスを使うのは 1 回のみ!(Address Re-use) 先ほども毎回 getnewaddress をやるべき 問題 : 匿名性 セキュリティ... 62
Address Re-use 問題 例 : 1. あなたのウォレットの残高はバレています 2. あなたの全てのTxがバレています 3. 自分が今はOKでも 次のTxを持ってる人は違うかも 別のセッションで もっと詳しく説明します 63
よくある間違い - アドレスは 口座 ではありません - アドレスにある金額は残高ではありません Tx 1A1AAA... 1 BTC Tx 1B2BBB... 0.5 BTC 残高 :0.5 BTC 1C3CCC... 0.5 BTC 64
UTXO モデル Tx1 Tx2 Tx3... 自分のウォレット ネットワークの UTXO Set 65
なぜ UTXO モデル? 1. アカウンティング a. 通知 b. インプットとアウトプットの管理 2. セキュリティ a. ダブルスペンド攻撃の防止 b. プライバシー 3. スケーラビリティなど アカウントモデルとは別のパラダイム 66
ウォレット 67
ウォレット Bitcoin はオープンなシステムなので 鍵の管理システムは一番重要なセキュリティのポイント 注意 自分で鍵を管理していないことは自分のお金では無いのと同じです 68
よくあるパターン ユーザがエクスチェンジ ( 交換所 ) で円から BTC に交換した後 秘密鍵をそのまま同じサービスに放置する Exchange Service BTC 1 つの解決方法 : 交換後に自分のウォレットに移動する 今までの大きな事件 :MtGox Bitfinex など 69
自分の Bitcoind のウォレットの場合 - 環境にウイルス Malware キーロガーなどが無いことを確認する - ハードディスクを暗号化する - ウォレットの暗号化 : - $./bitcoin-cli encryptwallet PASSPHRASE - $./bitcoin-cli walletpassphrase PASSPHRASE TIMEOUT カリキュラムの都合上 BC2 ではウォレットの暗号化は 行わないでください 70
HD (Hierarchical Deterministic) ウォレット BIP 32 71
ハードウェア ウォレット https://www.ledgerwallet.com/ https://trezor.io/ 72
ハードウェア ウォレット メリット : 1. 秘密鍵をハードウェア外に持ち出せない 2. HDウォレットなので ハードウェアを無くしてもウォレットを再 現することが出来る 3. Plausible Deniability / 犠牲ウォレット (Ledgerのみ) 73
anditto@dglab.com github.com/anditto 74