More Related Content
Similar to Bitcoinを技術的に理解する (20)
Bitcoinを技術的に理解する
- 5. • ビットコインで使われる暗号
– ハッシュ関数とは
– 楕円曲線公開鍵暗号(ECDSA署名)
• ビットコイン用語の説明(1)
• ビットコイン用語の説明(2)
– コインベーストランザクション
– ブロック
– ブロックマイニング
今日のテーマとアジェンダ(70~80分)
ビットコインの技術的概要は、既にご存知な方も多いでしょうから、簡
単におさらいするとして、どんなデータをどんな風に署名するのか、
ハッシュするか等、技術的に詳しく解説します。
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 4
• ビットコイン用語の説明(1)
– ウォレットとアドレスと鍵ペア
– トランザクション
– ビットコインのお金の正体
• ビットコインは仮想通貨の二重使
用みたいな問題をどのように技術
解決したのか?
• ビットコインの技術課題
– トランザクション展性
- 7. (セキュア)ハッシュ関数
こ の 夏 は 東 北 に 旅
行 に 行 き ま し た 。
こ の 夏 は 東 北 に 旅
行 に 行 き ま し た !
ハッシュ関数 ハッシュ関数
データの内容を識別するための固定の長さのデータを作る関数。
入力値の僅かな違いでも値は大きく異なり、大きなデータでも同じ固定の長さ
ハッシュ関数
23M
バイト
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 6
5291a4db88dc8f08ff0a
6e821ce1a671f8772e82
69cce7df56415d9d148a
2e7890f715d347606e05
0895eddb8c1e2d53bbcd
2e84fd83d6f918d924cb
入力データに変更や改竄がないか簡単に確認できる
電子署名や暗号通信などにも用いられる
BitCoinではデータのIDなどいろんな用途に使われる
SHA-1, MD5などが有名
一文字違うだけで全く違う値 入力データ長にかかわらず長さは同じ
- 8. ビットコインで使われるハッシュ関数
ビットコインでは2種類のハッシュ関数しか使われない
ハッシュ関数 出力長 説明
SHA-256 32バイト 米NSAが2001年に開発した米国家標準関数
RIPEMD-160 20バイト 独、ベルギーで1996年開発、ISO/IEC10118-3
ビットコインでは必ずハッシュ関数を二重にかける2通りの方法でしか使わない
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 7
データ入力 データ入力
SHA256
SHA256
SHA256
RIPEMD160
出力(32バイト) 出力(20バイト)
便宜上
本講演では
sha256d
と呼ぶ
(doubleのd)
便宜上
本講演では
hash160
と呼ぶ
- 11. 楕円曲線公開鍵暗号(1)
楕円曲線は楕円ではない
y2 = x3 + ax + b
を満たす曲線を
「楕円曲線」という
注:楕円じゃない B
C
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 10
(性質)
直線を引くと多くの場合
3つの点A, B, Cで交わる
X軸で線対称
A
D
- 14. (参考) 例えば素数p=263の場合
点をプロットするとこんな感じ n=1, 2, 3 … と軌跡を追うと
もうぐちゃぐちゃ
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 13
出典: http://www.johannes-bauer.com/compsci/ecc/
y=p/2で点が線対称になるとい
う特徴がある
これをp=256bitの巨大な整数で
やるから、もっとスゴイ事に!
- 15. 楕円曲線公開鍵暗号(4)
楕円曲線を使った公開鍵暗号
G(x,y)
p
基準点
剰余の素数
曲線定数 a
曲線定数 b
曲線パラメータ
有名な所では
NIST P-256, 384, 521
secp256p1, 521p1等
パラメータは任意で良いの
ではなく、いくつかの団体
で安全なパラメータが
数十程度定義されている
ビットコインでは
secp256k1固定で使う
gx=x79be667ef9dc…
gy=x483ada7726a3…
p=xffffffff…
a=0
b=7
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 14
n nG
秘密鍵 公開鍵
公開鍵nGとパラメータG, p, a, bから秘密鍵nを見つけるのは困難
→ 公開鍵暗号として使える!!
(特徴) データが小さい(256bitの鍵なら、公開鍵65(or33)バイト、
秘密鍵32バイト、パラメータも固定で省略してる。)
- 26. 図説:base58check encodingの
公開鍵からアドレスの生成
40 40 40 40・・・ 40 40 40 40・・・ 40
secp256k1曲線
楕円暗号
公開鍵(65byte)
ヘッダ x座標(32byte) y座標(32byte=256bit)
hash160
c4 c5 98・・・ 27
中間ハッシュ値(20byte)
c4 c5 98・・・ 27
値コピー チェックサム生成
00
ヘッダ
1byte を意味します
scriptPubKey
中のハッシュ値
チェックサム生成
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 25
4a bb 8f ・・・1a
4a bb 8f 1ac4 c5 98・・・ 27
base58エンコード
J w 1・・・ TS S u b h m g 6 i1
ヘッダ
20byte
先頭4byte
1+33byte
Bitcoinアドレス
※:ハッシュ関数を使っているので、一方向性の変換
※:ウォレットの秘密鍵エクスポートでも使われる(WIF形式)
※:X.509 公開鍵証明書の鍵識別子(SKID/AKID)の複雑版と言えなくもない
32byte
sha256d
e2
鍵ハッシュ生成
- 32. トランザクションのデータ構造(1)
0100000001aa02ce4965…
バージョン 01000000
入力数 01
前の出力ハッシュ 484d40…
前の出力インデックス 00000000入
PUSHDATA_47
ASN.1形式のECDSA署名値(R,S)
SIGHASH_ALL (全てを署名対象に)
PUSHDATA_41
トランザクションはバイト列
scriptSig スクリプト
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 31
前の出力インデックス 00000000
スクリプトバイト長 8a
署名スクリプト 473044…
シーケンス終端記号 ffffffff
入
力
①
出力数 01
出金額 626401…
スクリプトバイト長 8a
公開鍵検証スクリプト 8a
出
力
①
ブロックロック時間 00000000
EC公開鍵(x04 + X + Y)
OP_DUP
OP_HASH160
PUSHDATA 14
公開鍵ハッシュ値
OP_EQUALVERIFY
OP_CHECKSIG
scriptPubKey スクリプト
- 34. BさんがCさんに送金する
トランザクションの参照関係
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 8a
scriptSig
B秘密鍵に
よる署名値
入
力
①
バージョン 01000000
入力数 01
前の取引ハッシュ 484d40…
前の出力インデックス 0
スクリプトバイト長 8a入
力
①
AさんがBさんに3BTC送金した取引記録 Tx0 BさんがCさんに2.9995BTC送金した取引記録Tx1
2cfd73…
sha256d(Tx0)
Bの公開鍵
A秘密鍵に
よる署名値
Aの公開鍵 公開鍵
署名値
scriptSig
公開鍵
署名値
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 33
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 3.0
scriptPubKey
送金先の参照
Bさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
取引手数料 0.0005 BTC
Bの公開鍵Aの公開鍵 公開鍵公開鍵
- 35. BさんがCさんに送金する
署名済トランザクションの生成 (1/5)
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
入
力
①
BさんからCさんへの署名前の取引記録Tx1tbs
とりあえず、
BからCに送金する
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 34
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
6ab3…秘密鍵
045b3…公開鍵
BさんのECC secp256k1
BからCに送金する
署名されていない枠は作る
- 36. BさんがCさんに送金する
署名済トランザクションの生成 (2/5)
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 19入
力
①
BさんからCさんへの署名前の取引記録Tx1tbs
scriptPubKey
送金元の参照
Bさんの
公開鍵
ハッシュ
署名値はまだ
決められないので
Bさんアドの
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 35
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
送金元の参照
ハッシュ
Hash Code Type 01000000
6ab3…秘密鍵
045b3…公開鍵
BさんのECC secp256k1
Bさんアドの
公開鍵ハッシュで仮置き
(=複数入力時の場所識別)
hash160
- 37. BさんがCさんに送金する
署名済トランザクションの生成 (3/5)
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 19入
力
①
BさんからCさんへの署名前の取引記録Tx1tbs
scriptPubKey
送金元の参照
Bさんの
公開鍵
ハッシュ
3fde9e…
SHA256^2(Tx1tbs)
二重ハッシュ計算
署名入力
sha256d
仮トランザクション
全体のダブルハッシュ
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 36
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
送金元の参照
ハッシュ
Hash Code Type 01000000
ECDSA
署名器
6ab3…秘密鍵
045b3…公開鍵
BさんのECC secp256k1
- 38. BさんがCさんに送金する
署名済トランザクションの生成 (4/5)
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 19入
力
①
BさんからCさんへの署名前の取引記録Tx1tbs
scriptPubKey
送金元の参照
Bさんの
公開鍵
ハッシュ
3fde9e…
SHA256^2(Tx1tbs)
二重ハッシュ計算
署名入力
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 37
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
送金元の参照
ハッシュ
Hash Code Type 01000000
ECDSA
署名器
6ab3…秘密鍵
署名生成
045b3…公開鍵
BさんのECC secp256k1
- 39. BさんがCさんに送金する
署名済トランザクションの生成 (5/5)
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 8a
scriptSig
B秘密鍵に
よる署名値
入
力
①
BさんからCさんへの署名済取引記録Tx1
Bの公開鍵公開鍵
署名値
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 19入
力
①
BさんからCさんへの署名前の取引記録Tx1tbs
scriptPubKey
送金元の参照
Bさんの
公開鍵
ハッシュ
3fde9e…
SHA256^2(Tx1tbs)
二重ハッシュ計算
署名入力
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 38
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
Bの公開鍵公開鍵
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
送金元の参照
ハッシュ
Hash Code Type 01000000
ECDSA
署名器
6ab3…秘密鍵
署名生成
045b3…公開鍵
BさんのECC secp256k1 ※ハッシュでなく鍵そのもの
- 40. BさんがCさんに送金する
署名済トランザクションの検証(1/4)
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 8a
scriptSig
B秘密鍵に
よる署名値
入
力
①
BさんからCさんへの署名済取引記録Tx1
Bの公開鍵公開鍵
署名値
7dbc…
hash160
①公開鍵を取り出し保存
②公開鍵のダブルハッシュ
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 39
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
Bの公開鍵公開鍵
045b3…公開鍵BさんのECC secp256k1
- 41. BさんがCさんに送金する
署名済トランザクションの検証 (2/4)
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 8a
scriptSig
B秘密鍵に
よる署名値
入
力
①
BさんからCさんへの署名済取引記録Tx1
Bの公開鍵公開鍵
署名値
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 19入
力
①
BさんからCさんへの署名前の取引記録Tx1tbs
scriptPubKey
送金元の参照
Bさんの
公開鍵
ハッシュ
7dbc…
RIPEMD160(SHA256(公開鍵B))
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 40
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
Bの公開鍵公開鍵
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
送金元の参照
ハッシュ
Hash Code Type 01000000
045b3…公開鍵BさんのECC secp256k1
RIPEMD160(SHA256(
署名前テンプレの生成
- 42. BさんがCさんに送金する
署名済トランザクションの検証 (3/4)
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 8a
scriptSig
B秘密鍵に
よる署名値
入
力
①
BさんからCさんへの署名済取引記録Tx1
Bの公開鍵公開鍵
署名値
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 19入
力
①
BさんからCさんへの署名前の取引記録Tx1tbs
scriptPubKey
送金元の参照
Bさんの
公開鍵
ハッシュ
3fde9e…
SHA256^2(Tx1tbs)
二重ハッシュ計算
7dbc…
RIPEMD160(SHA256(公開鍵B))
sha256d
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 41
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
Bの公開鍵公開鍵
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
送金元の参照
ハッシュ
Hash Code Type 01000000
045b3…公開鍵BさんのECC secp256k1
RIPEMD160(SHA256(
仮テンプレ全体をsha256d
- 43. BさんがCさんに送金する
署名済トランザクションの検証 (4/4)
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 8a
scriptSig
B秘密鍵に
よる署名値
入
力
①
BさんからCさんへの署名済取引記録Tx1
Bの公開鍵公開鍵
署名値
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 19入
力
①
BさんからCさんへの署名前の取引記録Tx1tbs
scriptPubKey
送金元の参照
Bさんの
公開鍵
ハッシュ
3fde9e…
SHA256^2(Tx1tbs)
二重ハッシュ計算
署名入力
7dbc…
RIPEMD160(SHA256(公開鍵B))
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 42
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
Bの公開鍵公開鍵
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
送金元の参照
ハッシュ
Hash Code Type 01000000
ECDSA
検証器
署名検証
045b3…公開鍵BさんのECC secp256k1
RIPEMD160(SHA256(
- 44. 入力が複数ある場合の署名はどうする?
バージョン 01000000
入力数 03
前の取引ハッシュ 2cfd73…
前の出力インデックス 4
シーケンス終端記号 ffffffff
入
力
①
「入力②」に対して署名したいとする
前の取引ハッシュ 5234afbc…
前の出力インデックス 1
入
力
②
スクリプトバイト長 19
scriptPubKey Bさんの
バージョン 01000000
入力数 03
前の取引ハッシュ 2cfd73…
前の出力インデックス 4
シーケンス終端記号 ffffffff
入
力
①
前の取引ハッシュ 5234afbc…
前の出力インデックス 1
入
力
②
署名を
したい
箇所だけ
公開鍵を
仮置き
これ全体の
ハッシュを
計算し
ECDSA
署名する
署名対対象外の入力の所は空
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 43
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵ハッシュ
出
力
①
ブロックロック時間 00000000
Hash Code Type 01000000
シーケンス終端記号 ffffffff
②
前の取引ハッシュ d4210bf8…
前の出力インデックス 0
シーケンス終端記号 ffffffff
入
力
③
scriptPubKey
送金元の参照
Bさんの
公開鍵ハッシュ
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵ハッシュ
出
力
①
ブロックロック時間 00000000
Hash Code Type 01000000
シーケンス終端記号 ffffffff
②
前の取引ハッシュ d4210bf8…
前の出力インデックス 0
シーケンス終端記号 ffffffff
入
力
③
どの場所に
署名したい
のか明確に
するために
公開鍵を
仮置き
署名対対象外の入力の所は空
- 47. トランザクションの入力・出力
表現にはBitCoin Scriptが使われる
バージョン 01000000
入力数 01
前の出力ハッシュ 484d40…
前の出力インデックス 00000000入
PUSHDATA_47
ASN.1形式のECDSA署名値(R,S)
SIGHASH_ALL (全てを署名対象に)
PUSHDATA_41
EC公開鍵(x04 + X + Y)
scriptSig スクリプト
送金者署名値と送金者公開鍵が
含まれるスクリプト
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 46
前の出力インデックス 00000000
スクリプトバイト長 8a
署名スクリプト 473044…
シーケンス終端記号 ffffffff
入
力
①
出力数 01
出金額 626401…
スクリプトバイト長 19
公開鍵検証スクリプト 76a914…
出
力
①
ブロックロック時間 00000000
EC公開鍵(x04 + X + Y)
OP_DUP
OP_HASH160
PUSHDATA 14
公開鍵ハッシュ値
OP_EQUALVERIFY
OP_CHECKSIG
scriptPubKey スクリプト
受取人公開鍵の参照(hash160)
が含まれるスクリプト
- 58. ブロックのデータ構造
マジックナンバー(定数) <4> = d9b4bef9
ブロックのデータバイト数 <4>
ブロックヘッダ<80>
ブロックバージョン <4>
直前のブロックヘッダのハッシュ<32>
マークルルートハッシュ値 <32>
現在時刻(Unixオリジンの秒数) <4>
マジックナンバー(定数) <4> = d9b4bef9
ブロックのデータバイト数 <4>
ブロックヘッダ<80>
ブロックバージョン <4>
直前のブロックヘッダのハッシュ<32>
マークルルートハッシュ値 <32>
現在時刻(Unixオリジンの秒数) <4>
sha256d
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 57
ブロックヘッダ
現ターゲット(ハッシュ計算困難度) <4>
発掘で計算されたノンス <4>
トランザクション数 <1-9>
トランザクションデータ 0
トランザクションデータ 1
トランザクションデータ n
:
ブロックヘッダ
現ターゲット(ハッシュ計算困難度) <4>
発掘で計算されたノンス <4>
トランザクション数 <1-9>
トランザクションデータ 0
トランザクションデータ 1
トランザクションデータ n
:
coinbase
発掘報償金25.?BTC
coinbase
発掘報償金25.?BTC
sha256d
merkleroot
- 64. ブロックの発掘とは?
マジックナンバー(定数) <4> = d9b4bef9
ブロックのデータバイト数 <4>
ブロックヘッダ<80>
ブロックバージョン <4>
直前のブロックヘッダのハッシュ<32>
マークルルートハッシュ値 <32>
現在時刻(Unixオリジンの秒数) <4>
sha256d
root ターゲットの値によりブロックヘッダ
ハッシュ値の許容される最大値が得られる
(全P2Pネットワーク上で
発掘が10分程度で終わるように調整)
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 63
ブロックヘッダ
※時間は比較的適当でよい
現ターゲット(ハッシュ計算困難度) <4>
※約半月に1回変更になる
発掘で計算されたノンス <4>
トランザクション数 <1-9>
トランザクションデータ 0
トランザクションデータ n
:
merkleroot
表の出典:Ken Shirriff's blog
Bitcoin mining the hard way: the algorithms, protocols, and bytes
http://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html
先頭が0が16個つくために
85万回ハッシュ計算をした
- 68. プール, ASIC, FPGA, GPU, CPUによる
ブロック発掘の変遷・速度・費用感
費用
AntMiner U2 (USB)
2GH/s 45万円
Monarch (PCI)
600GH/s 22万円
AntMiner S2 (Rack)
1TH/s 27万円
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 67
速度
Minerscube 15 (Box)
15TH/s 65万円
Cpuminer
(on DELL, Linux) 3.5MH/s
2012年
FPGA時代
100-800MH/s
2014年
発掘プール
1-22PetaH/s
2011年
GPU時代
20-70MH/s
2009年
CPU時代
4-8MH/s
2013年
ASIC時代
1G-10TeraH/s
出典・参考:gizmodo:Bitcoinをざくざく掘り出す、モンスター・マシンたち(2013.04.17)
http://www.gizmodo.jp/2013/04/bitcoin_2.html
- 70. 発掘プール
(みんなで発掘作業を分担して掘れたら賞金山分け)
Bitcoin P2P
ネットワーク 共同発掘プール
全世界 約24,000人が参加 トータルで10ペタハッシュ/秒
発掘結果
(例)
賞金
(25BTC)
ノンスの計算範囲を各分担者に重ならないように作業依頼
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 69
少し難易度が低いターゲットで何回発掘できたか?がその人の貢献量
(=Share) 作業貢献に応じて発掘できた時に賞金を分配
15回 4回 3回 2回 1回
15BTC 4BTC 3BTC 2BTC 1BTC
本当のターゲット:先頭16文字がゼロ
プール参加者のターゲット:先頭10文字がゼロ
- 76. 不正利用を防ぐための仕組み(5)
作業証明(proof of work) (=コインの発掘)
花子に
1BTC渡します
番号:1234
半分以上がグルの悪者だったら、いくらでも騙せる
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 75
①取引の検証の計算コストを高くする
②取引を検証した人には報酬を与える
解決策
花子に
1BTC渡します
番号:1234
計算量が高すぎて多数派工作をすることは不可能
- 80. トランザクション展性とは何か?
トランザクションとスクリプトの図(再掲)
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 8b
scriptSig
B秘密鍵に
よる署名値
入
力
①
BさんからCさんへの署名済取引記録Tx1
Bの公開鍵公開鍵
署名値
PUSHDATA 48 (48バイトプッシュ)
ASN.1形式のECDSA署名値(R,S)
SIGHASH_ALL (全てを署名対象に)
scriptSig スクリプト
送金者署名値と送金者公開鍵が
含まれるスクリプト
48
30450221…
01
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 79
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
Bの公開鍵公開鍵 SIGHASH_ALL (全てを署名対象に)
PUSHDATA 41 (41バイトプッシュ)
EC公開鍵(x04 + X + Y)
グレーの部分は署名値で保護されているので
改竄することはできない
01
41
04dc47f1…
- 81. •例えば x48 バイトをプッシュしたい場合
① プッシュデータサイズをそのまま指定する場合
[48] (※x01-4bまでの値で使えます)
② プッシュデータサイズを1バイトで表現する場合 OP_PUSHDATA1(x4c)
[4c][48]
トランザクション展性とは何か?
スタックプッシュにはスクリプトで数種の表現方法がある
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 80
③ プッシュデータサイズを2バイトで表現する場合 OP_PUSHDATA2(x4d)
[4d][48][00]
④ プッシュデータサイズを4バイトで表現する場合 OP_PUSHDATA4(x4e)
[4e][48][00][00][00]
前のscriptSigで[48]を①~④どれで置き換えてもスクリプトの意味と処理は同じ
ただ、置き換えるとトランザクションID(=ハッシュ値)は違ってしまう
トランザクションのscriptSigの処理内容を変えずにIDを変えられる性質
=トランザクション展性(Transaction Malleability)
- 84. 代表的なトランザクション展性ポイント
バージョン 01000000
入力数 01
前の取引ハッシュ 2cfd73…
前の出力インデックス 0
スクリプトバイト長 8b
scriptSig
B秘密鍵に
よる署名値
入
力
①
BさんからCさんへの署名済取引記録Tx1
Bの公開鍵公開鍵
署名値
PUSHDATA 48 (48バイトプッシュ)
ASN.1形式のECDSA署名値(R,S)
SIGHASH_ALL (全てを署名対象に)
48
30450221…
01
先頭に余計な
データをプッシュ
しても最後2つ
しか利用しない
処理に影響のない
プログラム
(OP_DROP等)
の追加
© 2014 Fuji Xerox Co., Ltd. All rights reserved. 83
シーケンス終端記号 ffffffff
出力数 01
出金額(BTC) 2.9995
スクリプトバイト長 19
scriptPubKey
送金先の参照
Cさんの
公開鍵
ハッシュ
出
力
①
ブロックロック時間 00000000
Bの公開鍵公開鍵 SIGHASH_ALL (全てを署名対象に)
PUSHDATA 41 (41バイトプッシュ)
EC公開鍵(x04 + X + Y)
グレーの部分は署名値で保護されているので
改竄することはできない
01
41
04dc47f1…
署名値Sを
「-S」に
プッシュサイズを
1/2/3/5
バイト表現に