Bitcoin
https://gyazo.com/e043c2dc195ddaf6f3edf5543008e2aa
ビットコインのコンセプト
匿名性を選択できる
安全である
なりすましができない
改ざんできない
二重支払いができない
中央機関がないデジタル通貨
支払い(価値の保存と移転)に特化したとても堅牢なシステム(チューリング不完全/マルチシグ/HDウォレット/ニーモニック/Base58とか)
上記のコンセプトの実現方法
電子署名
公開鍵暗号
ハッシュ関数
ネットワーク
P2P
Proof of Work
フルノードの立て方
bitcoindとbitcoin-cliの違い
bitcoind は Bitcoinの一通りの機能を実装したしたサーバーのこと.
Bitcoinネットワーク(P2Pネットワーク)との通信のフル機能
ウォレット機能
マイニングプール
マイニング
JSON-RPC APIサーバー
bitcoin-cli は JSON-RPC を使って, bitcoind と通信し, 様々な操作を行えるツールのこと.
References:
bitcoindにcurlでアクセス
code:getblockinfo
bitcoin-cliとxargsの使用例
code:ブロック高が一番高いブロックの内容を出力する例
bitcoin-cli getbestblockhash | xargs bitcoin-cli getblock
code:最新ブロックのcoinbase txのトランザクションIDを取得する例
bitcoin-cli getblockhash 1 | xargs -IXXX bitcoin-cli getblock XXX 2 | jq ".tx0.txid" code:最新ブロックの一番初めのトランザクション内容を表示する例
bitcoin-cli getbestblockhash | xargs bitcoin-cli getblock | jq ".tx0" | xargs bitcoin-cli getrawtransaction | xargs bitcoin-cli decoderawtransaction References:
bitcoin-cliを使ってUTXOを集める
Full Node の分布図
マイナーとノードの違い
マイナーも1つのノードではあるが, マイナーの主な役割はプルーフオブワーク(PoW)を行い取引をブロックに収納しネットワークに送信すること.
マイナー以外のユーザーがノードを立ち上げる主な目的は, 取引が正しくブロックに取り込まれたかを検証しブロックチェーンに追加する.
マイナーには新規発行のビットコインの取得という経済的インセンティブがある.
ノードを立ち上げるユーザーには, 自身で取引の正当性を検証することができることと, ノードが増えることで非中央集化するネットワークのセキュリティを強化するというインセンティブがある.
Blockchainの中身をみてみる
一般的なアドレス生成の流れ
1. 秘密鍵からECDSAで公開鍵を生成
2. 公開鍵をハッシュ関数SHA-256に通しハッシュ値を得る
3. そのハッシュ値をさらにハッシュ関数RIPEMD-160に通しハッシュ値を得る
4. ハッシュ値の先頭にプレフィックスとして00を加える
5. ハッシュ関数SHA-256に通す
6. もう一度ハッシュ関数SHA-256に通す
7. 4バイトのチェックサムを一番後ろに加える
8. Base58のフォーマットでエンコーディングする
一般的なアドレス生成の図
https://gyazo.com/94776afb7efd6d030a09adba559f03c3https://gyazo.com/bb5905f26ea4ab6f7ebebd9c82a3a7c4
ビットコインにおける秘密鍵/公開鍵/アドレスの関係図
https://gyazo.com/b08fa436c74f00309c0eaeefdc537883
ウォレットにおける秘密鍵とWIFと公開鍵とアドレスの関係図
https://gyazo.com/6f7f6e4e1b9f356846e0d02463413c94
HDウォレットにおけるアドレス生成の手順
https://gyazo.com/b417f04ec3e2c2fbcc0c49ab2ccab97c
Entropy(BIP39)(128bit, 160bit, 192bit, 224bit, 256bitの長さ) ↓
Mnemonic(BIP39)(2048(11bit)個の単語群から選んだ、12個, 15個, 18個, 21個, 24個の単語群) ↓
Master Node(BIP39)(512bit(=64byte)) ↓
↓(Master Key + Chain Code)
↓
↓
アドレス
Entropyのターミナルでの作成方法
code:ターミナルでのEntropyの作成方法
// entropyの生成はmacのターミナルで
$ cat /dev/urandom |LC_ALL=C tr -dc 'a-f0-9' | fold -w 64 | head -n 1
// entropyの生成はlinuxの端末で
$ cat /dev/urandom |tr -dc a-f0-9|head -c${1:-64}
アドレスの種類
https://gyazo.com/e1de47ddbbaaee0599b7066e81edeb9f
プレフィックスの種類
単位
0.00000001 BTC = 1 Satoshi
1 BTC = 100000000 Satoshi
Scriptについて
Transaction と Script と Lightning Network について分かりやすいスライド
サトシは後に、以下の2つの理由で P2PK ではなく P2PKH を使うことを決めた。
楕円曲線暗号(公開鍵や秘密鍵 に使われれている暗号)が、楕円曲線上の離散対数問題を解くために改良されたショアのアルゴリズムによって解かれてしまうから。簡単に言うとそれが意味するのは、理論上、量子コンピューターがそう遠くない未来に 公開鍵から秘密鍵を導出できてしまう ということだ。ビットコインを使うときだけ公開鍵を公開することによって、そういった攻撃を無力化することができる(一度使われたビットコインアドレスを二度と使わない前提だが)。
ハッシュサイズがより小さくなるので(20バイトになる)、印刷するにも小さくできるしQRコードのような小さい記録媒体に埋め込むことがより簡単になる。
ScriptSig
ScriptSigはInputにあって, $ \sf{ScriptSig} \fallingdotseq \sf{Unlock Script}
ScriptSigにはSigとPubKeyがある.
そうすることでP2PKHでは, ScriptPubKeyにあるhash化されたPubKeyとScriptSigにあるPubKeyを見比べてTrueを得た後に, さらにScriptSigにあるSigとPubKeyを見比べてTrueを得ることができる.
ScriptPubKey
ScriptPubKeyはOutputにあって, $ \sf{ScriptPubKey} \fallingdotseq \sf{Lock Script}
Lockしないと誰でもBTCを取り出せてしますから.
P2SH の ScriptPubKey
code:P2SHのScriptPubKey
オンラインで Bitcoin Script の挙動を確認できるサイト
トランザクションについて
トランザクション生成と検証の仕方が分かりやすいスライド
Segwit
Segwit を分かりやすく解説した記事
P2WSH
ScriptPubKey zero [32-byte sha256(witness script)]
Base32
https://gyazo.com/3294e6225fdb813d71a72c287e00620d
Transaction Fee