Top Banner
Bitcoin勉強(技術編)セシ1 催:クセキィ協 PKI相運用WG電子署名WG Bitcoinを技術的に理解する (資料公版) © 2014 Fuji Xerox Co., Ltd. All rights reserved. 201462() 15:00-17:00 於:セコ(原宿) 漆嶌 賢 文の登商標および商標はそれぞれの所者に帰属します。 富士ゼクス株式 SkyDeskサスセタ 漆嶌賢
89

Bitcoinを技術的に理解する

May 28, 2015

Download

Internet

Kenji Urushima

日本ネットワークセキュリティ協会 PKI相互運用WG・電子署名WGの共催で2014年6月2日に行われたBitcoin勉強会の資料を公開用に手直ししたものです。長い事、電子署名を専門にしており、そのような観点でビットコインのデータや署名、ハッシュについて解説させていただきました。
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Bitcoinを技術的に理解する

Bitcoin勉強会(技術編)セッション1主催:日本ネットワークセキュリティ協会 PKI相互運用WG・電子署名WG

Bitcoinを技術的に理解する (資料公開版)

© 2014 Fuji Xerox Co., Ltd. All rights reserved.

2014年6月2日(月) 15:00-17:00於:セコムホール(原宿)

漆嶌 賢二

本文中の登録商標および商標はそれぞれの所有者に帰属します。

富士ゼロックス株式会社 SkyDeskサービスセンター 漆嶌賢二

Page 2: Bitcoinを技術的に理解する

はじめに

ビットコインにおいて、「トランザクションやブロックがどのように署名されたり、ハッシュ計算をしているの

© 2014 Fuji Xerox Co., Ltd. All rights reserved.

がどのように署名されたり、ハッシュ計算をしているのか」という良い解説書が無く、困っていたのでいろいろ調査をして資料を作成してみました。みなさんの参考になれば幸いです。

Page 3: Bitcoinを技術的に理解する

今日のテーマ

2© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 4: Bitcoinを技術的に理解する

•政府や企業が一極発行したものではない

•インターネットで流行りつつある

ビットコインとは?

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 3

•暗号技術を使った

•新しいアイディアの仮想通貨

Page 5: Bitcoinを技術的に理解する

• ビットコインで使われる暗号

– ハッシュ関数とは

– 楕円曲線公開鍵暗号(ECDSA署名)

• ビットコイン用語の説明(1)

• ビットコイン用語の説明(2)

– コインベーストランザクション

– ブロック

– ブロックマイニング

今日のテーマとアジェンダ(70~80分)

ビットコインの技術的概要は、既にご存知な方も多いでしょうから、簡単におさらいするとして、どんなデータをどんな風に署名するのか、ハッシュするか等、技術的に詳しく解説します。

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 4

• ビットコイン用語の説明(1)

– ウォレットとアドレスと鍵ペア

– トランザクション

– ビットコインのお金の正体

• ビットコインは仮想通貨の二重使

用みたいな問題をどのように技術

解決したのか?

• ビットコインの技術課題

– トランザクション展性

Page 6: Bitcoinを技術的に理解する

ビットコイン技術を理解するのに必要な暗号技術(1/2)ハッシュ関数

5© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 7: Bitcoinを技術的に理解する

(セキュア)ハッシュ関数

こ の 夏 は 東 北 に 旅

行 に 行 き ま し た 。

こ の 夏 は 東 北 に 旅

行 に 行 き ま し た !

ハッシュ関数 ハッシュ関数

データの内容を識別するための固定の長さのデータを作る関数。入力値の僅かな違いでも値は大きく異なり、大きなデータでも同じ固定の長さ

ハッシュ関数

23Mバイト

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 6

5291a4db88dc8f08ff0a

6e821ce1a671f8772e82

69cce7df56415d9d148a

2e7890f715d347606e05

0895eddb8c1e2d53bbcd

2e84fd83d6f918d924cb

� 入力データに変更や改竄がないか簡単に確認できる� 電子署名や暗号通信などにも用いられる� BitCoinではデータのIDなどいろんな用途に使われる� SHA-1, MD5などが有名

一文字違うだけで全く違う値 入力データ長にかかわらず長さは同じ

Page 8: Bitcoinを技術的に理解する

ビットコインで使われるハッシュ関数ビットコインでは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

と呼ぶ

Page 9: Bitcoinを技術的に理解する

ハッシュ関数の大切な特徴(一方向性関数)

データ入力 ハッシュ値ハッシュ関数

とても簡単

ほぼ不可能

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 8

ハッシュ値32ビット全部がゼロ

ハッシュ値先頭8バイトがゼロ

ほぼ不可能

総当り攻撃でとても時間がかかる

例えば?

Page 10: Bitcoinを技術的に理解する

ビットコイン技術を理解するのに必要な暗号技術(2/2)楕円曲線公開鍵暗号

9© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 11: Bitcoinを技術的に理解する

楕円曲線公開鍵暗号(1)楕円曲線は楕円ではない

y2 = x3 + ax + bを満たす曲線を「楕円曲線」という注:楕円じゃない B

C

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 10

(性質)

直線を引くと多くの場合3つの点A, B, Cで交わる

X軸で線対称

A

D

Page 12: Bitcoinを技術的に理解する

楕円曲線公開鍵暗号(2)点の足し算=2つの点から3つ目を見つけること

2つの点A,Bから3つめの交点Cを見つけそのX軸対称の点をDとする

①これをB

C

A=B

C

A+B=D

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 11

と足し算で表す

A

B

D D

②接点A=Bの場合

A+B=D

A+A=D

③すると

A+A+…=nA整数と点の掛け算を定義できる

Page 13: Bitcoinを技術的に理解する

楕円曲線公開鍵暗号(3)実数ではなく整数Iを素数pで割った余りでやる

曲線上の点のx、y座標が「整数Iを素数pで割った余り」で行う。実数でも余りでも性質は同じ。

4G素数p p

nG

ある点nGが与えられた時、nが大きければnGからnを求めるのは非常に難しい

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 12

G

2G

3G

4G

p

G

nGn

素数p

基準点

Page 14: Bitcoinを技術的に理解する

(参考) 例えば素数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の巨大な整数でやるから、もっとスゴイ事に!

Page 15: Bitcoinを技術的に理解する

楕円曲線公開鍵暗号(4)楕円曲線を使った公開鍵暗号

G(x,y)

p基準点

剰余の素数

曲線定数 a曲線定数 b

曲線パラメータ

有名な所ではNIST P-256, 384, 521secp256p1, 521p1等

パラメータは任意で良いのではなく、いくつかの団体

で安全なパラメータが数十程度定義されている

ビットコインではsecp256k1固定で使う

gx=x79be667ef9dc…gy=x483ada7726a3…p=xffffffff…a=0b=7

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 14

n nG秘密鍵 公開鍵

公開鍵nGとパラメータG, p, a, bから秘密鍵nを見つけるのは困難→ 公開鍵暗号として使える!!

(特徴) データが小さい(256bitの鍵なら、公開鍵65(or33)バイト、秘密鍵32バイト、パラメータも固定で省略してる。)

Page 16: Bitcoinを技術的に理解する

楕円曲線公開鍵暗号(5)ECDSA署名の生成と検証

秘密鍵d、パラメータ(生成点G, 剰余の素数n)があるとし、署名の度に乱数 k (0≦k≦n)を生成し、Gからk回移動した点Rを定義し(R=kG=(rx, ry))、署名値 r, sを求める。

)(mod

)(mod

n

nx

k

dres

rr

+=

=

生成

==

y

x

r

rkGR)(mHASHe =

メッセージハッシュeGから乱数k回移動した点R

署名値 r, s

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 15

検証 公開鍵Q=dG、パラメータ(生成点G, 剰余の素数n)、署名値(r,s)があるとし、以下の点Pを計算する。

Qs

rG

s

e

p

pP

y

x+=

=

このとき、px = rx (mod n)ならば署名値は正しい

等しければ検証成功

Page 17: Bitcoinを技術的に理解する

楕円曲線公開鍵暗号(6)なぜECDSA署名の検証はこれでよいのか?

署名値rsとメッセージハッシュeと公開鍵Qが正しければ、点Pと点Rが等しいのでpx = rx であることを示そう。

( )

dGs

rG

s

e

Qs

rG

s

e

p

pP

y

x

+=

+=

=

1

点Pの定義より

公開鍵Q=dGなので

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 16

点P=点R が示されたので px = rx となる。署名の検証はこの等式でできる。

( )

( )

RkG

Grderde

k

Grdes

==

+

+=

+=1共通項を括って

署名sの定義より

約分してR定義より

Page 18: Bitcoinを技術的に理解する

楕円曲線公開鍵暗号(7)公開鍵データの表現方法(非圧縮/圧縮)

n nG秘密鍵 公開鍵

公開鍵は二次元座標の点

公開鍵の表現方法は2種類ある

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 17

公開鍵の表現方法は2種類ある

非圧縮フォーマット

04 公開鍵nGのX座標(32バイト) 公開鍵nGのY座標(32バイト)

圧縮フォーマット

02 公開鍵nGのX座標(32バイト)

03 公開鍵nGのX座標(32バイト)

Yが偶数の時

Yが奇数の時

XからYはすぐ計算可能:y2=x3+ax+b

注)例は256bit鍵の場合

Page 19: Bitcoinを技術的に理解する

ビットコインの用語の説明(1)

① ウォレットとアドレスと鍵② アドレス② アドレス③ トランザクション

18© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 20: Bitcoinを技術的に理解する

Bitcoinウォレットとアドレスと鍵

19© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 21: Bitcoinを技術的に理解する

Bitcoinウォレット(財布)とBitcoinアドレスのイメージ

Bitcoinアドレス(小さな財布)個々にお金が入る・口座番号(アドレス)を持つ

1abcde…

1zUb3…1hF3a…

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 20

Bitcoinウォレット(大きな財布袋)直接はお金は入らない

Page 22: Bitcoinを技術的に理解する

Bitcoinの取引(出入金)のイメージ

Bitcoin P2Pネットワーク②有償ボランティアで送金の証拠を作りましょう③ transaction block

(=送金の証拠)

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 21

1abc…1xyz…

アドレス間のお金のやりとり

Page 23: Bitcoinを技術的に理解する

Bitcoinアドレスと秘密鍵/公開鍵

1abcdefgabcdefgabcdefgabcdefgabcdeアドレス

1uvwXyzuvwXyzuvwXyzuvwXyzuvwXyzabcアドレス公開鍵

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 22

ウォレット

アドレスにより鍵を特定する

秘密鍵

公開鍵

Page 24: Bitcoinを技術的に理解する

BitCoinアドレス

23© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 25: Bitcoinを技術的に理解する

•アドレス毎の公開鍵から生成することができ、公開鍵を特定することができる。すなわち出金元、送金先を特定するID。

•文字 “1” と33字の英数字でできた文字列(例:1abF3…)

•base58checkエンコーディングを使用している

•base58checkエンコーディングとは公開鍵ハッシュとチェックサムをbase58エンコーディングしたもの

Bitcoinのアドレスの特徴

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 24

クサムをbase58エンコーディングしたもの

•base58とはバイナリを58種の英数文字で表現したもの(数字10種+大小文字26×2種-紛らわしい文字4種エルl,アイI,オーO,ゼロ0を除く=10+26x2-4=58)相手口座の入力ミスを防ぐことができる。

•base58はFlickrの画像のIDとしても使われている。

Page 26: Bitcoinを技術的に理解する

図説:base58check encodingの公開鍵からアドレスの生成

40 40 40 40・・・ 40 40 40 40・・・ 40secp256k1曲線

楕円暗号公開鍵(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+33byteBitcoinアドレス※:ハッシュ関数を使っているので、一方向性の変換※:ウォレットの秘密鍵エクスポートでも使われる(WIF形式)※:X.509 公開鍵証明書の鍵識別子(SKID/AKID)の複雑版と言えなくもない

32bytesha256d

e2

鍵ハッシュ生成

Page 27: Bitcoinを技術的に理解する

トランザクション(取引履歴)

あるアドレス(小財布)からアドレスへお金が移ったという証拠データ(署名データ)ですという証拠データ(署名データ)です

26© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 28: Bitcoinを技術的に理解する

トランザクションとは

出力0Bさんに6BTC

Aさんの取引記録

入力 出力(送金)

Aの署名

Aの署名

Tx?入力?

出力0△さんに4BTC

出力1Aさんに2BTC

入力 出力(送金)

◎の署名

1つの小財布(アドレス)の小銭をかき集めて複数の小財布へお金の移動させる電子署名つき証拠データ

Tx1出力1

Tx2出力0

Tx1 Tx1の出力1のお金は使っちゃいますよという証明

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 27

入力合算=出力合算+取引手数料

取引手数料= 0.0005BTC

出力1Cさんに2BTC

入力8.0005BTC 出力8BTC

自分へのトランザクションをかき集めて、好きに分配することができる

Aの署名

Aの署名

出力0Aさんに

3.0005BTC

入力 出力(送金)

△の署名

△の署名

出力0Aさんに3BTC

入力 出力(送金)

×の署名

Tx?入力?

Tx?入力?

Tx?入力?

Tx2出力0

Tx3出力0Tx2

Tx3

Page 29: Bitcoinを技術的に理解する

大金の一部を使いたいとき

出力0Bさんに

0.0004BTC

Aさんの取引記録

入力 出力(送金)

Aの署名

出力0

入力 出力(送金)Tx1出力0

Tx1

残り(おつり)を自分に送金すればよい

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 28

取引手数料= 0.0001BTC

出力1Aさんに8BTC

入力8.0005BTC 出力8BTC

出力0Aさんに

8.0005BTC×の署名Tx?入力?

おつりは自分(Aさん)に戻せばよい

Page 30: Bitcoinを技術的に理解する

•以下の条件を満たせば取引手数料無料

– トランザクションデータが1000バイト未満の場合(一般にそう)

– 1取引中の全ての送金が0.01BTC(約600円)以上

– 取引プライオリティが十分に大きい場合

取引手数料(多分、チップみたいなもの)

https://en.bitcoin.it/wiki/Transaction_fees の定義があるが

実際には

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 29

実際には

•0〜0.001BTCの間で自由に払っているようだ

•0BTCで手数料を払わない人もいる

•0.0001〜0.0005BTC(6〜30円)ぐらいの人が多いようだ

•ウォレットクライアントで自由に設定できるようだ

•まさに、欧米流のチップの感覚なのではないかと思う

Page 31: Bitcoinを技術的に理解する

トランザクションデータの構造

30© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 32: Bitcoinを技術的に理解する

トランザクションのデータ構造(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 スクリプト

Page 33: Bitcoinを技術的に理解する

トランザクションと生データ

バージョン<4>

入力数<1>

前の取引ハッシュ<32>

前の出力インデックス<4>

スクリプトバイト長<1>

scriptSig

入力①

BさんからCさんへの署名済取引記録Tx1

署名値

01000000

01

b3bf2c8e11766b626d40fab1bd…

01000000

8b

48 304502210089f0ff17ffd33f…

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 32

scriptSig

シーケンス終端記号<4>

出力数<1>

出金額(BTC) <8>

scriptPubKey送金先の参照

出力①

ブロックロック時間 <4>

公開鍵 41 04dc47f1c4bf5f98e01aac27…

ffffffff

01

302dfa0200000000

1976a91406f1b6......88ac

00000000注意点:数値、ハッシュ値、TXIDなどはリトルエンディアン(=バイト逆順)、スクリプトの中のデータ(ASN.1署名値、公開鍵など)はビッグエンディアンで表現される。

Page 34: Bitcoinを技術的に理解する

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の公開鍵 公開鍵公開鍵

Page 35: Bitcoinを技術的に理解する

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に送金する署名されていない枠は作る

Page 36: Bitcoinを技術的に理解する

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

Page 37: Bitcoinを技術的に理解する

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

Page 38: Bitcoinを技術的に理解する

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

Page 39: Bitcoinを技術的に理解する

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 ※ハッシュでなく鍵そのもの

Page 40: Bitcoinを技術的に理解する

BさんがCさんに送金する署名済トランザクションの検証(1/4)

バージョン 01000000

入力数 01

前の取引ハッシュ 2cfd73…

前の出力インデックス 0

スクリプトバイト長 8a

scriptSig

B秘密鍵による署名値

入力①

BさんからCさんへの署名済取引記録Tx1

Bの公開鍵公開鍵

署名値

7dbc…

hash

16

0

①公開鍵を取り出し保存②公開鍵のダブルハッシュ

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 39

シーケンス終端記号 ffffffff

出力数 01

出金額(BTC) 2.9995

スクリプトバイト長 19

scriptPubKey送金先の参照

Cさんの公開鍵ハッシュ

出力①

ブロックロック時間 00000000

Bの公開鍵公開鍵

045b3…公開鍵BさんのECC secp256k1

Page 41: Bitcoinを技術的に理解する

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…

RIP

EM

D1

60

(SH

A2

56

(公開

鍵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

RIP

EM

D1

60

(SH

A2

56

(

署名前テンプレの生成

Page 42: Bitcoinを技術的に理解する

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…

RIP

EM

D1

60

(SH

A2

56

(公開

鍵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

RIP

EM

D1

60

(SH

A2

56

(

仮テンプレ全体をsha256d

Page 43: Bitcoinを技術的に理解する

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…

RIP

EM

D1

60

(SH

A2

56

(公開

鍵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

RIP

EM

D1

60

(SH

A2

56

(

Page 44: Bitcoinを技術的に理解する

入力が複数ある場合の署名はどうする?

バージョン 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

入力③

どの場所に署名したいのか明確にするために公開鍵を仮置き

署名対対象外の入力の所は空

Page 45: Bitcoinを技術的に理解する

トランザクションのデータ構造とX.509公開鍵証明書の関係

tbsCertificate(署名対象)

前の取引ハッシュ 484d40…

前の出力インデックス 0

入力①

BitCoinトランザクション

A秘密鍵による署名値

Aの公開鍵

scriptSig

公開鍵

署名値

X.509公開証明書(EE)

証明書シリアル番号

tbsCertificate(署名対象)

証明書シリアル番号

X.509公開証明書(CA)

SubjectPublicKeyInfo(CAの公開鍵)

署名で保護

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 44

scriptPubKey送金先の参照

Bさんの公開鍵ハッシュ

出力①

Aの公開鍵公開鍵

署名アルゴリズム

CAによる署名値

署名アルゴリズム

署名値

SubjectKeyIdentifier拡張

(CAの公開鍵)

署名で保護

署名で保護

同じ「色」の箇所が大体同じような機能を持っている

Page 46: Bitcoinを技術的に理解する

トランザクション入力・出力で使われるBitCoinスクリプトとは?

45© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 47: Bitcoinを技術的に理解する

トランザクションの入力・出力表現には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)が含まれるスクリプト

Page 48: Bitcoinを技術的に理解する

BitCoin Scriptとは

•BitCoinのトランザクションの入出力を表現するスクリプト言語•Forthのようなスタック言語•約90の命令(オペコード)•文、条件、四則演算、ビット演算、スタック操作、暗号プリミティブなどの命令がある。

•BitCoinのトランザクションでは極めて限定的な

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 47

•BitCoinのトランザクションでは極めて限定的な使われ方しかしないので学ぶ必要はあまりない。

•送金の証拠となるトランザクションデータ中にスクリプトを含めることを可能にし、拡張性を持たせたという意味でビットコインは世界初の画期的なサービスとなっている。

•トランザクションではPUSHDATA, DUP, HASH160, EQUALVERIFY, CHECKSIGの命令ぐらいしか出てこない。

出典:https://en.bitcoin.it/wiki/Script より

Page 49: Bitcoinを技術的に理解する

ビットコインのお金の正体って何なの?

48© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 50: Bitcoinを技術的に理解する

アドレスの取引残高の正体は何か?

アドレスFからAへ5BTC

アドレスFからAへ8BTC

トランザクション出力

使われたお金

tx④

tx③

改竄不能なトランザクション

改竄不能な二分木

b④

b③

b(n)改竄不能な

最長ブロックチェーン

取引残高を証明するのは使用されていないトランザクション出力

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 49

アドレスFからAへ8BTC

その後アドレスAからNへ8BTC

アドレスHからAへ2BTC

5+2=合計7BTC

tx②

tx①

b③

b②

b①

b(0)ビットコインP2Pネットワーク

Page 51: Bitcoinを技術的に理解する

ここでちょっと質問

7500BTC(約4億円)のビットコイン(の秘密鍵)の入ったハードディスクを

50© 2014 Fuji Xerox Co., Ltd. All rights reserved.

(の秘密鍵)の入ったハードディスクを間違って捨てちゃったという事件

出典: http://www.theguardian.com/technology/2013/nov/27/hard-drive-bitcoin-landfill-site

P2Pネットワークで預金残高は保証されているのに取り戻せないの?

Page 52: Bitcoinを技術的に理解する

アドレスの秘密鍵をなくすとどうなる?

アドレス1abc…

秘密鍵が無いと、もう誰にもお金をあげられない

秘密鍵が無いと、

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 51

ウォレット

秘密鍵が無いと、もう換金もできない

Page 53: Bitcoinを技術的に理解する

ビットコインの用語の説明(2)

① ブロックチェイン② コインベーストランザクション② コインベーストランザクション③ マイニング(発掘)

52© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 54: Bitcoinを技術的に理解する

ブロックチェインについて

53© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 55: Bitcoinを技術的に理解する

ブロックチェインとは

tx④

tx③

トランザクション

b④

b③

b(30万)

ブロックチェイン

�P2Pネットでトランザクションを改竄されないようにするための仕組み

�約10分に1つブロックが増える�1ブロックで数百のト

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 54

tx②

tx①

b③

b②

b①

b(0)ビットコインP2Pネットワーク

�1ブロックで数百のトランザクションを含む

�今30万ブロック�年5万ブロック増える�ブロックを作った人には賞金(今は25BTC)

Page 56: Bitcoinを技術的に理解する

なぜブロックチェインが必要なのか?

ビットコインP2Pネットワーク

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 55

Bさんの署名つきトランザクション

Bさんには7 BTCある

Cさんに7 BTC渡す

入力 出力

このトランザクションは、ただ署名しただけであって、ビットコインネットワークではこの取引を認めていない

Page 57: Bitcoinを技術的に理解する

なぜブロックチェインが必要なのか?

ビットコインP2Pネットワークのブロックチェイン

登録(=Proof Of Work)

(=マイニング)

公開

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 56

Bさんの署名つきトランザクション

Bさんには7 BTCある

Cさんに7 BTC渡す

入力 出力

P2Pネットワークに受け入れてもらうことで取引が全ビットコイン利用者に受理される

登録依頼

Page 58: Bitcoinを技術的に理解する

ブロックのデータ構造

マジックナンバー(定数) <4> = d9b4bef9

ブロックのデータバイト数 <4>

ブロ

ック

ヘッ

ダ<8

0> ブロックバージョン <4>

直前のブロックヘッダのハッシュ<32>

マークルルートハッシュ値 <32>

現在時刻(Unixオリジンの秒数) <4>

マジックナンバー(定数) <4> = d9b4bef9

ブロックのデータバイト数 <4>

ブロ

ック

ヘッ

ダ<8

0> ブロックバージョン <4>

直前のブロックヘッダのハッシュ<32>

マークルルートハッシュ値 <32>

現在時刻(Unixオリジンの秒数) <4>

sh

a2

56

d

© 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

sh

a2

56

d

merk

lero

ot

Page 59: Bitcoinを技術的に理解する

コインベーストランザクション(発掘者への報酬約25BTC)

バージョン<4>

入力数<1>

前の取引ハッシュ<32>

前の出力インデックス<4>

スクリプトバイト長<1>

scriptCoinbase

入力①

01000000

01

00000000000000… (全部ゼロ)

ffffffff (全部ff)

8b

03+ブロック高+あと不明

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 58

scriptCoinbase

シーケンス終端記号<4>

出力数<1>

出金額(BTC) <8>

scriptPubKey送金先(発掘者)の参照

出力①

ブロックロック時間 <4>

ffffffff

01

xxxxxxxx… 25BTC+手数料になる

1976a91406f1b6......88ac

00000000

Page 60: Bitcoinを技術的に理解する

全てのお金の源流はコインベーストランザクション

b④

b③

b(30万)

発掘者3へ

発掘者4へ25BTC

発掘者5へ25BTC

Aさんへ0.03BTC

Aさんへ0.01BTC

Aさんへ

Aさんのアドレスに0.07BTC

コインベース

使われていないトランザクション出力=誰かの口座残高

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 59

b③

b②

b①

b(0)発掘者1へ50BTC

発掘者2へ50BTC

発掘者3へ25BTC

25BTCAさんへ0.03BTC

約10分おきに発掘者に与えられる

賞金BTC

お金は細かく分かれたりくっついたりしながら利用者の元へ届く

Page 61: Bitcoinを技術的に理解する

マークルルートハッシュの計算

ブロックに含まれる全トランザクションデータのハッシュ値を木構造で組み合わせてそれをルート値として管理する。→ 後続ブロックを持った時点でトランザクションを改竄できなくなる

結合関数 fm =sha256d(rev(txida)+rev(txidb)) ※ rev: バイトの逆順

ハッシュ1234 ハッシュ5656

ハッシュ12345656 これがマークルルート

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 60

tx1

AからBへ4BTC

tx2

FからDへ1BTC

tx3

ZからQへ1BTC

tx4

WからYへ3BTC

tx5

PからGへ9BTC

tx6

SからLへ1BTC

ハッシュ1 ハッシュ2 ハッシュ3 ハッシュ4 ハッシュ5 ハッシュ6

txid1 txid2 txid3 txid4 txid5 txid6

ハッシュ12 ハッシュ34 ハッシュ56 ハッシュ56

組む相手が無ければ同じ値で

fm fm fm

fm fm

sha256d sha256d sha256d sha256d sha256d sha256d

Page 62: Bitcoinを技術的に理解する

マークルルートハッシュのメリットいらない部分を保管しなくて済む

例えば、tx2が自分の関連するトランザクションだとして、関係するものだけを残して後で検証したい場合、下の薄いのは消してもいつでも再検証ができる

ハッシュ1234 ハッシュ5656

ハッシュ12345656

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 61

tx1

AからBへ4BTC

tx2

FからDへ1BTC

tx3

ZからQへ1BTC

tx4

WからYへ3BTC

tx5

PからGへ9BTC

tx6

SからLへ1BTC

ハッシュ1 ハッシュ2 ハッシュ3 ハッシュ4 ハッシュ5 ハッシュ6

txid1 txid2 txid3 txid4 txid5 txid6

ハッシュ12 ハッシュ34 ハッシュ56 ハッシュ56

消してしまってよい

Page 63: Bitcoinを技術的に理解する

ブロックの発掘

62© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 64: Bitcoinを技術的に理解する

ブロックの発掘とは?

マジックナンバー(定数) <4> = d9b4bef9

ブロックのデータバイト数 <4>

ブロ

ック

ヘッ

ダ<8

0>

ブロックバージョン <4>

直前のブロックヘッダのハッシュ<32>

マークルルートハッシュ値 <32>

現在時刻(Unixオリジンの秒数) <4> sh

a2

56

d

root

ターゲットの値によりブロックヘッダハッシュ値の許容される最大値が得られる

(全P2Pネットワーク上で発掘が10分程度で終わるように調整)

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 63

ブロ

ック

ヘッ

※時間は比較的適当でよい

現ターゲット(ハッシュ計算困難度) <4>※約半月に1回変更になる

発掘で計算されたノンス <4>

トランザクション数 <1-9>

トランザクションデータ 0

トランザクションデータ n

merk

lero

ot

表の出典:Ken Shirriff's blogBitcoin mining the hard way: the algorithms, protocols, and byteshttp://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html

先頭が0が16個つくために85万回ハッシュ計算をした

Page 65: Bitcoinを技術的に理解する

ブロックのターゲット値の計算は?

現ターゲット(ハッシュ計算困難度) <4>※約半月に1回変更になる

ブロックヘッダ中の4バイト圧縮表現ターゲット

18 7c 30 537c3053 18

リトルエンディアンなので逆順に

桁数 値

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 64

7c 30 53 00 00 00 00 0000・・・00 ・・・

全体でx18=24バイトになるように先頭32-24=8バイトがゼロ

16進数32バイト表現のターゲット値(=hash256dの結果長と同じ)

この値「以下」になるように発掘(=ハッシュ計算)を繰り返す

Page 66: Bitcoinを技術的に理解する

難易度(Difficulty)の推移当たり前だが、ネット全体でのハッシュ計算速度と難易度は相関がある

2014年5月下旬、難易度は4年前の100億倍になった

5ヶ月で10倍

ハッシュ速度100ペタH/s

難易度120億

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 65

出典:http://bitcoin.sipa.be/

2014年1月全ネット20ペタH/s

難易度10億

5ヶ月で10倍指数関数的に増加

Page 67: Bitcoinを技術的に理解する

ブロックの発掘ってどれくらい難しいのか

• 先頭1文字だけのゼロなら16進数なので1/16確率でできる。

• 今の(2014年2月)時点の難しさならば1/1019の確率

• 地球上の全部の砂の中から特定の1粒を見つけるより難しい

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 66

出典:Ken Shirriff's blogBitcoin mining the hard way: the algorithms, protocols, and byteshttp://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html

Page 68: Bitcoinを技術的に理解する

プール, 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

Page 69: Bitcoinを技術的に理解する

現時点での発掘者比率

共同発掘

GHash.IO22 Peta H/s

33%

その他

普通のデルサーバーVMの1CPUでやったとしたら3M H/sの速度

10分に一回発掘できるとして速度比較から

BTCguild v.s. 個人のデルサーバVM2万年に一回しか勝てない

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 68

出典:blockchain.info 過去4日間のハッシュレート分布https://blockchain.info/pools?timespan=4days

共同発掘

BTCguild8 Peta H/s

13%

2万年に一回しか勝てない

全ハッシュ v.s. 個人のデルサーバーVM

15万年に一回しか勝てない

Page 70: Bitcoinを技術的に理解する

発掘プール(みんなで発掘作業を分担して掘れたら賞金山分け)

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文字がゼロ

Page 71: Bitcoinを技術的に理解する

仮想通貨で起きそうな諸問題のBitCoinならではの解決法

70© 2014 Fuji Xerox Co., Ltd. All rights reserved.

コピー容易なデジタル通貨の二重利用をどう防ぐのか?

Page 72: Bitcoinを技術的に理解する

不正利用を防ぐための仕組み(1)電子署名

太郎さんから花子さんへ5BTCあげます

文書なんで誰でも書き換えられるので「太郎さん」は言い逃れできる

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 71

太郎さんから花子さんへ5BTCあげます

太郎さんの秘密鍵で行った署名は書き換えできず「太郎さんの意図」がなければ署名できないので言い逃れ不能

Page 73: Bitcoinを技術的に理解する

不正利用を防ぐための仕組み(2)シリアル番号

1BTC渡します

1BTC渡します

1か2BTCかわからない。同じお金を2重につかえてしまう。

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 72

1か2BTCかわからない。同じお金を2重につかえてしまう。

1BTC渡します

1BTC渡します

番号が同じなら間違いだとわかる。二重に使えない。

番号:1234

番号:1234

Page 74: Bitcoinを技術的に理解する

不正利用を防ぐための仕組み(3)全ての人が参加する

花子に1BTC渡します

和子に1BTC渡します

どちらが本物かわからない。同じお金を二重利用

番号:1234

番号:1234

口座は-1or2?

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 73

どちらが本物かわからない。同じお金を二重利用

花子に1BTC渡します

番号:1234 正当な取引

和子に1BTC渡します

番号:1234 全員の前じゃない(架空取引)

Page 75: Bitcoinを技術的に理解する

不正利用を防ぐための仕組み(4)トランザクション(ブロック)をハッシュの連鎖にする

バラバラだと個別に改竄できてしまう

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 74

ハッシュの連鎖になっているなら途中の一部を書き換えることは不可能

Page 76: Bitcoinを技術的に理解する

不正利用を防ぐための仕組み(5)作業証明(proof of work) (=コインの発掘)

花子に1BTC渡します

番号:1234

半分以上がグルの悪者だったら、いくらでも騙せる

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 75

①取引の検証の計算コストを高くする②取引を検証した人には報酬を与える

解決策

花子に1BTC渡します

番号:1234

計算量が高すぎて多数派工作をすることは不可能

Page 77: Bitcoinを技術的に理解する

不正利用を防ぐための仕組み(6)ブロックチェイン最長優先のルール

どちらの枝を信じるかでお金が二重利用可能

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 76

短い方は発掘しても後で無視され徒労に終わるのでみなが最長のチェインにつながるように発掘

Page 78: Bitcoinを技術的に理解する

Transaction Malleabilityトランザクション展性とは?

最大の取引所Mt.Gox社がTransaction Malleability DoS攻撃によってダウンしたと言っていますが、詳しDoS攻撃によってダウンしたと言っていますが、詳しく解説しましょう

77© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 79: Bitcoinを技術的に理解する

トランザクション展性Transaction Malleabilityって知ってます?

出典: http://arxiv.org/pdf/1403.6676v1.pdf

「トランザクション展性を使ったDoS攻撃により預金が不正に引き出されMt.Gox社は破綻した」という噂がニュースに流れたが、スイスの研究者

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 78

出典:http://www.pcworld.com/article/2114200/malleability-attacks-not-to-blame-for-mt-goxs-missing-bitcoins-study-says.html

出典: http://www.cryptocoinsnews.com/news/malleability-bankrupt-mt-gox/2014/03/27

ニュースに流れたが、スイスの研究者の論文より、トランザクション展性と破綻に直接の関係は無くスケープゴートに使われたのでは?と言われている

Page 80: Bitcoinを技術的に理解する

トランザクション展性とは何か?トランザクションとスクリプトの図(再掲)

バージョン 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…

Page 81: Bitcoinを技術的に理解する

•例えば 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)

Page 82: Bitcoinを技術的に理解する

トランザクション展性攻撃とは?

Bitcoin P2Pネットワーク

txid’:93fb41…AからFに7BTC

scriptSig=4c48…

正しいトランザクションの登録をDoSで妨害

改竄版が誤って登録される

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 81

txid:75facd…AからFに7BTCscriptSig=48…

txid’:93fb41…AからFに7BTC

scriptSig=4c48…

盗聴とわずかな改竄(署名改竄にはあたらない)

DoSに近い大量の登録要求

以降、お釣りなどの利用の際に、エラーになる場合も

Page 83: Bitcoinを技術的に理解する

トランザクション展性攻撃とは「何か?」また「何ではないか?」

①Mt.Gox社などトランザクションIDのみで独自に送金履歴管理

している古い実装の場合に不整合が起きた

どんな問題だったのか?

公開鍵と署名値のスクリプトを意味的には同じままスクリプトを変えることにより、トランザクションIDの不一致を狙った攻撃

何が起きたか?

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 82

している古い実装の場合に不整合が起きた

②一部のウォレットアプリでID不整合によりお金の移動、口座残

高などの参照ができなくなった

③お釣りなどの利用の際に送金エラーになることが出てくる

①ほとんどの部分は署名で保護されているので、お金の盗難に結

びつく送金先、送金額の変更はできないため、直接的お金の盗

難はこの攻撃では起きない

何は起きないか?

Page 84: Bitcoinを技術的に理解する

代表的なトランザクション展性ポイント

バージョン 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

バイト表現に

Page 85: Bitcoinを技術的に理解する

(参考)他に可能なトランザクション展性

① ECDSA署名の正負ECDSA署名の値(R,S)ではSを-Sとしても署名値としては有効。

② DERエンコードされていないECDSA署名値OpenSSLではDERエンコードされていない署名値でも検証可能。0.8.0以降ではこのようなトランザクションは受理されなくなった。

③ 最初の余分なデータプッシュ最初に余分に何回データプッシュ命令を実行しても処理されない。

④ scriptSig中のPUSHでないオペレーションPUSHでないオペレーションが入っていても署名検証結果は同じとなってしまう

⑤ プッシュオペレータの表現75バイトまでそのまま、OP_PUSHDATA{1,2,4} (前述)

⑥ scriptPubKeyのオペコードの部分についてのみ、入力は整数として扱われるためゼロパディ

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 84

⑥ scriptPubKeyのオペコードの部分についてのみ、入力は整数として扱われるためゼロパディングしても値は同じとなる。

⑦ スクリプトで無視される入力scriptPubKeyにおいてOP_DROPなど無視されるオペレーションがある。

⑧ SighashフラグによるマスクSighashフラグはスクリプトの一部を無視するのに使える。

⑨ 送金者(か秘密鍵にアクセスできる人)はいつでも同じ入力と出力を使う新しい署名を生成できる。

⑩ scriptSig中のECC公開鍵において非圧縮、圧縮フォーマットを入れ替える。

参考:https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki

Page 86: Bitcoinを技術的に理解する

まとめ

85© 2014 Fuji Xerox Co., Ltd. All rights reserved.

Page 87: Bitcoinを技術的に理解する

•使われている暗号(ハッシュ、楕円曲線暗号)

•用語解説

–ウォレット、アドレス、鍵

–トランザクション

–ブロックチェイン

–マイニング

まとめ

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 86

–マイニング

•二重利用などの問題をどのように解決してきたか

•トランザクション展性

についてご紹介させて頂きました。

Page 88: Bitcoinを技術的に理解する

•個々の技術に目新しさはないが、不正利用防止や運用のために

様々な工夫がされておりオモシロイ。研究レベルではいろいろ

思いつくだろうが現実に利用されているのだから。

•ただ、トランザクションのデータ構造やプロトコルなど何とな

く稚拙に思えるところもあって、そのアンバランス感が不思議

に思える。

ビットコインに対する私見

© 2014 Fuji Xerox Co., Ltd. All rights reserved. 87

•特に、スクリプトを導入したのは失敗で、データと処理を分け

るのが基本だったのでは?(トランザクション展性問題もあるし)

•ビットコイン自体に設計上の問題があったとしても、それを解

決した第二、第三世代の暗号通貨に移行すればいいだけ。(一太

郎と同じ)

•個人的に非常に興味深いのはそれ自体価値がないハッシュ計算

が価値(通貨)を生み出している所。(証明書の鍵ID付加価値)

Page 89: Bitcoinを技術的に理解する

Xerox、Xeroxロゴ、およびFuji Xeroxロゴは、米国ゼロックス社の登録商標または商標です。