(資料公開版)

日本スマートフォンセキュリティ協会(JSSEC)
フィンテックセミナー

ビットコインの仕組みとセキュリティ技術2017年7月10日(月) 技術セミナー1/13:00-13:50
於：大手町 三井住友銀行東館ライジングスクエア

漆嶌 賢二

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

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

自己紹介: 漆嶌 賢二(うるしま), CISSP
・経歴・富士ゼロックス(2010〜), エントラスト(2005〜), セコム(1988〜)
・興味：
PKI, TLS暗号通信, 電子署名, SSO, 認証, 暗号,
CSIRT, 商品系CSIRT(PSIRT), インシデント対応,
脆弱性検査, フォレンジック, ビットコイン
・委員、標準化、普及啓蒙
・JNSA, CRYPTREC, 日本データ通信協会, ECOM, PKI-J, 欧ETSI 委員
IPA セキュキャン講師
・近年の主な講演/講師歴・2014/06 JNSAビットコイン勉強会 ビットコインの技術を理解する
・2014/11 Internet Week SSL/TLS設定のツボ・2015/04 JNSA PKI Day SSL生誕20年・2015/08 IPAセキュリティキャンプ ビットコインの技術解説
・2015/11 Internet Week SSL/TLS最新動向
・2017/08 IPAセキュリティキャンプ 暗号運用技術© 2017 Fuji Xerox Co., Ltd. All rights reserved.

今日のテーマ

暗号通貨と呼ばれるビットコインの、使われている暗号技術、データ構造を解説しその仕組みを知っていただく© 2017 Fuji Xerox Co., Ltd. All rights reserved.

2014年6月の勉強会での講演内容がベース
データ構造、仕組みについて踏み込んだ、おそらく日本初の資料

リンク： https://www.slideshare.net/kenjiurushima/20140602-bitcoin1-201406031222© 2017 Fuji Xerox Co., Ltd. All rights reserved.

本日のアジェンダ• ビットコインとは？
• ビットコインで使われる暗号• ビットコインの技術的な説明© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ビットコインってなに？

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

ビットコインとは？

•政府や企業が一極発行したものではない•インターネットで十分な市場を確立した•暗号技術を使った•これまでにないアイディアの仮想通貨© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ビットコインの時価総額(2017年7月現在 約1千億米ドル)
約1000億米ドル≒11兆円≒東京都の予算13兆円≒Facebook社の時価総額≒Apple社の時価総額の1/5

2015年に30億

出典：https://coinmarketcap.com/charts/© 2017 Fuji Xerox Co., Ltd. All rights reserved.

(参考) ビットコイン(BTC)/日本円 レート

2017年5月に1BTC=30万円

2015年に1BTC=2.4万円
出典：http://ビットコイン相場.com/© 2017 Fuji Xerox Co., Ltd. All rights reserved.

送金先文字列さえ知ってれば
世界中の誰にでも送れ、手数料は安かった(今はそれなり)

DH C̲ P

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

平均送金手数料の高騰(5円→最高500円)
2017年5月頃、少額決済が大量に流れ込み取引が大量停滞し、手数料が高騰
今は、やや沈静化したか？

2017年5月 一件500円

2015年頃 一件4円

出典：https://bitinfocharts.com/comparison/bitcoin-transactionfees.html© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ビットコインはとても使い方が簡単
バーコードで読んだ
1から始まる34文字の英数
字と送金額を入れれば、世界中誰にでもお金が払える© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ビットコインは2008年の謎の論文からはじまった• 中本哲史(ナカモトサトシ)という謎の人物が2008年にMetzger, Dowdeswell &Co (metzdowd.com) の暗号理論のメーリングリストに投稿した論文が始まり• 2009年にはオープンソー
ス実装 Bitcoin-Qtが開発され、最初のビットコイン通貨が発行された

出典：https://bitcoin.org/bitcoin.pdf© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ビットコイン技術を理解するのに必要な暗号技術(1/2)
ハッシュ関数© 2017 Fuji Xerox Co., Ltd. All rights reserved.

(セキュア)ハッシュ関数
データの内容を識別するための固定の長さのデータを作る関数。
入力値の僅かな違いでも値は大きく異なり、大きなデータでも同じ固定の長さ
23M
バイト

こ の 夏 は 東 北 に 旅

こ の 夏 は 東 北 に 旅

行 に 行 き ま し た 。

行 に 行 き ま し た ！

ハッシュ関数

ハッシュ関数

ハッシュ関数

5291a4db88dc8f08ff0a
6e821ce1a671f8772e82

69cce7df56415d9d148a2e7890f715d347606e05

0895eddb8c1e2d53bbcd
2e84fd83d6f918d924cb

一文字違うだけで全く違う値

入力データ長にかかわらず長さは同じ

 入力データに変更や改竄がないか簡単に確認できる
 電子署名や暗号通信などにも用いられる
 ビットコインではデータのIDなどいろんな用途に使われる
 SHA-1, MD5などが有名© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ビットコインで使われるハッシュ関数
ビットコインでは2種類のハッシュ関数しか使われない

ハッシュ関数出力長説明

SHA-256

32バイト

米NSAが2001年に開発した米国家標準関数

RIPEMD-160

20バイト

独、ベルギーで1996年開発、ISO/IEC10118-3

ビットコインでは必ずハッシュ関数を二重にかける2通りの方法でしか使わない
データ入力

便宜上
本講演では
sha256dと呼ぶ(doubleのd)

SHA256

SHA256出力(32バイト)© 2017 Fuji Xerox Co., Ltd. All rights reserved.

データ入力

便宜上
本講演では
hash160と呼ぶ

SHA256RIPEMD160

出力(20バイト)ハッシュ関数の大切な特徴(一方向性関数)
とても簡単

データ入力

ハッシュ
関数

ハッシュ値

ほぼ不可能

例えば？

ほぼ不可能
総当り攻撃でとても時間がかかる© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ハッシュ値
32バイト全部がゼロ
ハッシュ値
先頭8バイトがゼロビットコイン技術を理解するのに必要な暗号技術(2/2)
楕円曲線公開鍵暗号© 2017 Fuji Xerox Co., Ltd. All rights reserved.

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

y2 = x3 + ax + b
を満たす曲線を「楕円曲線」という
注：楕円じゃないB
A(性質)
直線を引くと多くの場合3つの点A, B, Cで交わる
X軸で線対称© 2017 Fuji Xerox Co., Ltd. All rights reserved.

D楕円曲線公開鍵暗号(2)点の足し算=2つの点から３つ目を見つけること
2つの点A,Bから3つめの交点Cを見つけそのX軸対称の点をDとする
これを

A+B=D

C

C

A=B

B

と足し算で表す
A
するとA+A+…=nA
整数と点の掛け算を定義できる© 2017 Fuji Xerox Co., Ltd. All rights reserved.

接点A=Bの場合
D

A+A=D

D

楕円曲線公開鍵暗号(3)実数ではなく整数Iを素数pで割った余りでやる
曲線上の点のx、y座標が「整数Iを素数pで割った余り」
で行う

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

素数p
4G

2G

G
基準点 3GG
素数p© 2017 Fuji Xerox Co., Ltd. All rights reserved.

n

nG

p

(参考) 例えば素数p=263の場合

点をプロットするとこんな感じ

n=1, 2, 3 … と軌跡を追うと
もうぐちゃぐちゃ

y=p/2で点が線対称になるという特徴がある

これをp=256bitの巨大な整数でやるから、もっとスゴイ事に！

出典： http://www.johannes-bauer.com/compsci/ecc/© 2017 Fuji Xerox Co., Ltd. All rights reserved.

楕円曲線公開鍵暗号(4)楕円曲線を使った公開鍵暗号
パラメータは任意で良いのではなく、いくつかの団体
で安全なパラメータが数十程度定義されている有名な所ではNIST P-256, 384, 521
secp256p1, 521p1等

秘密鍵n曲線パラメータ
基準点 G(x,y)
剰余の素数 p曲線定数 a曲線定数 b

ビットコインでは
secp256k1固定で使う
gx=x79be667ef9dc…
gy=x483ada7726a3…
p=xffffffff…
a=0
b=7

公開鍵

nG

公開鍵nGとパラメータG, p, a, bから秘密鍵nを見つけるのは困難→ 公開鍵暗号として使える！！
(特徴)データが小さい(256bなら公開65, 秘密32, パラ数byte以下© 2017 Fuji Xerox Co., Ltd. All rights reserved.

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

公開鍵

n

nG

公開鍵は二次元座標の点表現方法は2種類ある 非圧縮フォーマット
04

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

注)例は256bit鍵の場合

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

圧縮フォーマット02

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

Yが偶数の時03 公開鍵nGのX座標(32バイト) Yが奇数の時
XからYはすぐ計算可能：y2=x3+ax+b© 2017 Fuji Xerox Co., Ltd. All rights reserved.

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

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

メッセージハッシュee  HASH (m )Gから乱数k回
移動した点R rx 
R  kG    ry 

r  rx (mod n )e  dr 署名値 r, ssk (mod n )剰余の素数n)、署名値(r,s)があるとし、
検証 公開鍵Q=dG、パラメータ(生成点G,
以下の点Pを計算する。
等しければ検証成功

 px  er
P     G  Qs py  s

このとき、px = rx (mod n)ならば署名値は正しい© 2017 Fuji Xerox Co., Ltd. All rights reserved.

楕円曲線公開鍵暗号(7)なぜECDSA署名の検証はこれでよいのか？
点Pの定義より
署名値rsとメッセージ px  er
P     G  Q
ハッシュeと公開鍵Qが
p
s
s
y

正しければ、
点Pと点Rが等しいので
公開鍵Q=dGなので er G  dG
px = rx であることを示そう。

ss
共通項を括って1 e  rd Gs
署名sの定義より k e  rd G e  rd 
約分してR定義より
 kG  R

点P=点R が示されたので px = rx となる。
© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ビットコインの用語の説明(1)① ウォレットとアドレスと鍵② アドレス③ トランザクション© 2017 Fuji Xerox Co., Ltd. All rights reserved.

Bitcoinウォレットとアドレスと鍵© 2017 Fuji Xerox Co., Ltd. All rights reserved.

Bitcoinウォレット(財布)とBitcoinアドレスのイメージ
Bitcoinアドレス(小さな財布)
個々にお金が入る・口座番号(アドレス)を持つ
1hF3a…

1zUb3…

1abcde…

Bitcoinウォレット(大きな財布袋)
直接はお金は入らない© 2017 Fuji Xerox Co., Ltd. All rights reserved.

Bitcoinの取引(出入金)のイメージ
Bitcoin P2Pネットワーク③ transaction block(=送金の証拠)②有償ボランティアで送金の証拠を作りましょう

1xyz…
1abc…

アドレス間の
お金のやりとり© 2017 Fuji Xerox Co., Ltd. All rights reserved.

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

アドレス

1abcdefgabcdefgabcdefgabcdefgabcde

公開鍵

アドレス

1uvwXyzuvwXyzuvwXyzuvwXyzuvwXyzabc

公開鍵アドレスにより鍵を特定する秘密鍵

ウォレット© 2017 Fuji Xerox Co., Ltd. All rights reserved.

BitCoinアドレス© 2017 Fuji Xerox Co., Ltd. All rights reserved.

Bitcoinウォレット(財布)とBitcoinアドレスのイメージ(再掲)
Bitcoinアドレス(小さな財布)
個々にお金が入る・口座番号(アドレス)を持つ
1hF3a…

1zUb3…

1abcde…

Bitcoinウォレット(大きな財布袋)
直接はお金は入らない© 2017 Fuji Xerox Co., Ltd. All rights reserved.

Bitcoinのアドレスの特徴•アドレス毎の公開鍵から生成することができ、公開鍵を特定することができる。すなわち出金元、送金先を特定するID。
•文字 1 と33字の英数字でできた文字列(例：1abF3…)• base58checkエンコーディングを使用している•base58checkエンコーディングとは公開鍵ハッシュとチェッ
クサムをbase58エンコーディングしたもの•base58とはバイナリを58種の英数文字で表現したもの(数字10種＋大小文字26×2種−紛らわしい文字4種
エルl,アイI,オーO,ゼロ0を除く=10+26x2-4=58)
相手口座の入力ミスを防ぐことができる。
•base58はFlickrの画像のIDとしても使われている。
© 2017 Fuji Xerox Co., Ltd. All rights reserved.

図説：base58check encodingの公開鍵からアドレスの生成
y座標(32byte=256bit)
secp256k1曲線 ヘッダ x座標(32byte)
40 40 40 ・・・ 40 40 40 40 ・・・ 40 40
楕円暗号
公開鍵(65byte)
hash160

scriptPubKey
中のハッシュ値

1byte を意味します

チェックサム生成

値コピー

c4 c5 ・・・ 98 27

チェックサム生成

ヘッダ
00 c4 c5 ・・・ 98 27

中間ハッシュ値(20byte)

sha256d

鍵ハッシュ生成20byte32byte4a bb 8f 1a e2 ・・・

c4 c5 ・・・ 98 27

4a bb 8f 1a

先頭4bytebase58エンコード

Bitcoinアドレス

ヘッダ
1
J

w

S

S

u

b

h

m

g

6

i

・・・ 1

※：ハッシュ関数を使っているので、一方向性の変換※：ウォレットの秘密鍵エクスポートでも使われる(WIF形式)※：X.509 公開鍵証明書の鍵識別子(SKID/AKID)の複雑版と言えなくもない© 2017 Fuji Xerox Co., Ltd. All rights reserved.

T

1+33byteトランザクション(取引履歴)あるアドレス(小財布)からアドレスへお金が移ったという証拠データ(署名データ)です© 2017 Fuji Xerox Co., Ltd. All rights reserved.

トランザクションとは1つの小財布(アドレス)の小銭をかき集めて複数の小財布へお金の移動させる電子署名つき証拠データ
Tx1

入力

出力(送金)
出力0△さんに4BTC

Tx?入力? ◎の署名
出力1
Aさんに2BTC

Aさんの
取引記録

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

入力

出力(送金)

Tx1出力1 Aの署名

出力0
Bさんに6BTC

Tx2出力0 Aの署名
Tx2

入力
Tx?入力? △の署名
Tx?入力? △の署名

出力(送金)
出力0
Aさんに
3.0005BTC

Tx3出力0 Aの署名

出力1
Cさんに2BTC

入力8.0005BTC

出力8BTC

取引手数料= 0.0005BTC
Tx3

入力

出力(送金)

Tx?入力? ×の署名

出力0
Aさんに3BTC

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

入力合算＝出力合算＋取引手数料© 2017 Fuji Xerox Co., Ltd. All rights reserved.

大金の一部を使いたいとき
残り(おつり)を自分に送金すればよい
Aさんの取引記録
入力

Tx1

入力

出力(送金)

Tx?入力? ×の署名

出力0
Aさんに
8.0005BTC

Tx1出力0 Aの署名

出力(送金)
出力0
Bさんに0.0004BTC
出力1
Aさんに8BTC

入力8.0005BTC

出力8BTC

取引手数料= 0.0001BTC

おつりは自分(Aさん)に戻せばよい© 2017 Fuji Xerox Co., Ltd. All rights reserved.

トランザクションデータの構造© 2017 Fuji Xerox Co., Ltd. All rights reserved.

トランザクションのデータ構造(1)トランザクションはバイト列

0100000001aa02ce4965…

scriptSig スクリプト
01000000
バージョン
01
入力数
484d40…
前の出力ハッシュ
入 前の出力インデックス 00000000
力 スクリプトバイト長 8a① 署名スクリプト
473044…
シーケンス終端記号 ffffffff01
出力数626401…
出 出金額
力 スクリプトバイト長 8a① 公開鍵検証スクリプト 8a
ブロックロック時間 00000000© 2017 Fuji Xerox Co., Ltd. All rights reserved.

PUSHDATA̲47
ASN.1形式のECDSA署名値(R,S)
SIGHASH̲ALL (全てを署名対象に)

PUSHDATA̲41
EC公開鍵(x04 + X + Y)

scriptPubKey スクリプトOP̲DUPOP̲HASH160
PUSHDATA 14
公開鍵ハッシュ値
OP̲EQUALVERIFYOP̲CHECKSIG

トランザクションと生データ
BさんからCさんへの署名済取引記録Tx1
バージョン<4>
入力数<1>
前の取引ハッシュ<32>
前の出力インデックス<4>

入 スクリプトバイト長<1>
力① scriptSig 署名値
公開鍵
シーケンス終端記号<4>
出力数<1>
出 出金額(BTC) <8>
力 scriptPubKey① 送金先の参照
ブロックロック時間<4>0100000001
b3bf2c8e11766b626d40fab1bd…
01000000
8b
48 304502210089f0ff17ffd33f…
41 04dc47f1c4bf5f98e01aac27…
ffffffff
01
302dfa0200000000
1976a91406f1b6......88ac
00000000

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

BさんがCさんに送金する
トランザクションの参照関係
AさんがBさんに3BTC送金した取引記録 Tx0

01000000
バージョン
01
入力数
484d40…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 8a
力① scriptSig 署名値
公開鍵
シーケンス終端記号01
出力数
出金額(BTC)出
力 scriptPubKey① 送金先の参照

A秘密鍵に
よる署名値
Aの公開鍵
ffffffff

3.0

Bさんの
公開鍵
ハッシュ
ブロックロック時間 00000000

BさんがCさんに2.9995BTC送金した取引記録Tx1

sha256d(Tx0)
2cfd73…

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 8a
力① scriptSig 署名値
公開鍵
シーケンス終端記号01
出力数
出金額(BTC)出
力 scriptPubKey① 送金先の参照

B秘密鍵に
よる署名値
Bの公開鍵
ffffffff

2.9995

Cさんの
公開鍵
ハッシュ
ブロックロック時間 00000000
取引手数料 0.0005 BTC© 2017 Fuji Xerox Co., Ltd. All rights reserved.

BさんがCさんに送金する
署名済トランザクションの生成 (1/5)
BさんからCさんへの署名前の取引記録Tx1tbs

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入力①

とりあえず、
BからCに送金する
署名されていない枠は作る

シーケンス終端記号 ffffffff01
出力数2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000
秘密鍵 6ab3…
BさんのECC secp256k1
公開鍵 045b3…
© 2014 Fuji Xerox Co., Ltd. All rights reserved.

42

BさんがCさんに送金する
署名済トランザクションの生成 (2/5)
BさんからCさんへの署名前の取引記録Tx1tbs

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 19

署名値はまだ
決められないのでBさんアドの
公開鍵ハッシュで仮置き(=複数入力時の場所識別)力① scriptPubKey
送金元の参照

Bさんの
公開鍵
ハッシュ
シーケンス終端記号 ffffffff01
出力数2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000
01000000Hash Code Typehash160

秘密鍵 6ab3…
BさんのECC secp256k1
公開鍵 045b3…
© 2014 Fuji Xerox Co., Ltd. All rights reserved.

43

BさんがCさんに送金する
署名済トランザクションの生成 (3/5)
SHA256^2(Tx1tbs)

BさんからCさんへの署名前の取引記録Tx1tbs二重ハッシュ計算

力① scriptPubKey
送金元の参照

Bさんの
公開鍵
ハッシュ
シーケンス終端記号 ffffffff01
出力数2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000
01000000Hash Code Typesha256d
3fde9e…

署名入力

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 19

仮トランザクション
全体のダブルハッシュ

ECDSA
署名器

秘密鍵 6ab3…
BさんのECC secp256k1
公開鍵 045b3…
© 2014 Fuji Xerox Co., Ltd. All rights reserved.

44

BさんがCさんに送金する
署名済トランザクションの生成 (4/5)
BさんからCさんへの署名前の取引記録Tx1tbs
SHA256^2(Tx1tbs)
二重ハッシュ計算

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 19

署名入力

Bさんの
公開鍵
ハッシュ
シーケンス終端記号 ffffffff01
出力数2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000
01000000Hash Code Type

ECDSA
署名器

署名生成

力
① scriptPubKey
送金元の参照3fde9e…

秘密鍵 6ab3…
BさんのECC secp256k1© 2014 Fuji Xerox Co., Ltd. All rights reserved.

公開鍵 045b3…
45

BさんがCさんに送金する
署名済トランザクションの生成 (5/5)
BさんからCさんへの署名前の取引記録Tx1tbs

Bさんの
公開鍵
ハッシュ
シーケンス終端記号 ffffffff01
出力数2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000
01000000Hash Code Type署名入力

力
① scriptPubKey
送金元の参照3fde9e…

ECDSA
署名器

秘密鍵 6ab3…
BさんのECC secp256k1
公開鍵 045b3…
© 2014 Fuji Xerox Co., Ltd. All rights reserved.

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

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 8a
力① scriptSig 署名値
公開鍵
シーケンス終端記号
01
出力数

B秘密鍵に
よる署名値
Bの公開鍵
ffffffff

2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000

署名生成

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 19

SHA256^2(Tx1tbs)
二重ハッシュ計算

46※ハッシュでなく鍵そのもの

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

力① scriptSig 署名値
公開鍵
シーケンス終端記号
01
出力数

B秘密鍵に
よる署名値

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

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
8a
入 スクリプトバイト長hash160

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

Bの公開鍵
ffffffff

2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000

BさんのECC secp256k1
公開鍵© 2014 Fuji Xerox Co., Ltd. All rights reserved.

47045b3…

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 8a
力① scriptSig 署名値
公開鍵
シーケンス終端記号
01
出力数

B秘密鍵に
よる署名値
Bの公開鍵
ffffffff

BさんからCさんへの署名前の取引記録Tx1tbs

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 19
7dbc…

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

RIPEMD160(SHA256(公開鍵B))

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

2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000

力① scriptPubKey
送金元の参照

Bさんの
公開鍵
ハッシュ
シーケンス終端記号 ffffffff01
出力数2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000
01000000Hash Code Type
BさんのECC secp256k1 公開鍵署名前テンプレの生成© 2014 Fuji Xerox Co., Ltd. All rights reserved.

48

045b3…

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 8a
力① scriptSig 署名値
公開鍵
シーケンス終端記号
01
出力数

B秘密鍵に
よる署名値
Bの公開鍵
ffffffff

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 19

2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000

3fde9e…

力① scriptPubKey
送金元の参照

Bさんの
公開鍵
ハッシュ
シーケンス終端記号 ffffffff01
出力数2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000
01000000Hash Code Type
BさんのECC secp256k1 公開鍵

仮テンプレ全体をsha256d© 2014 Fuji Xerox Co., Ltd. All rights reserved.

SHA256^2(Tx1tbs)
二重ハッシュ計算

BさんからCさんへの署名前の取引記録Tx1tbs sha256d

7dbc…

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

RIPEMD160(SHA256(公開鍵B))

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

49045b3…

B秘密鍵による署名値
Bの公開鍵
ffffffff

2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000

力① scriptPubKey
送金元の参照

Bさんの
公開鍵
ハッシュ
シーケンス終端記号 ffffffff01
出力数2.9995
出金額(BTC)
出 スクリプトバイト長 19
力
Cさんの① scriptPubKey
公開鍵
送金先の参照ハッシュブロックロック時間 00000000
01000000Hash Code Type
BさんのECC secp256k1 公開鍵© 2014 Fuji Xerox Co., Ltd. All rights reserved.

50

3fde9e…

署名入力

力① scriptSig 署名値
公開鍵
シーケンス終端記号01
出力数01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 19

SHA256^2(Tx1tbs)
二重ハッシュ計算

ECDSA
検証器

署名検証

01000000
バージョン
01
入力数
2cfd73…
前の取引ハッシュ
前の出力インデックス 0
入 スクリプトバイト長 8a

BさんからCさんへの署名前の取引記録Tx1tbs

7dbc…

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

RIPEMD160(SHA256(公開鍵B))

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

045b3…

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

硬貨みたいな物じゃないらしい！

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

アドレスの取引残高の正体は何か？
取引残高を証明するのは使用されていないトランザクション出力
トランザクション出力

改竄不能な
最長ブロックチェーン
b(n)

改竄不能な
改竄不能な
トランザクション 二分木
tx④
b④

アドFからアドAへ5BTC

使われたお金tx③

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

アドHからアドAへ2BTC

5＋2＝合計7BTC© 2017 Fuji Xerox Co., Ltd. All rights reserved.

tx②

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

b③

b②

b①
b(0)

ここでちょっと質問

7500BTC(約4億円)のビットコイン(の秘密鍵)の入ったハードディスクを間違って捨てちゃったという事件

P2Pネットワークで預金残高は保証されているのに取り戻せないの？
出典： http://www.theguardian.com/technology/2013/nov/27/hard-drive-bitcoin-landfill-site© 2017 Fuji Xerox Co., Ltd. All rights reserved.

アドレスの秘密鍵をなくすとどうなる？
秘密鍵が無いと、もう誰にもお金をあげられない
アドレス
1abc…

ウォレット

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

秘密鍵が無いと、
もう換金もできないビットコインの用語の説明(2)① ブロックチェイン② コインベーストランザクション③ マイニング(発掘)© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ビットコインのブロックチェインについて© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ブロックチェインとはb(30万)

トランザクション
tx④

ブロック
チェイン

(2017年7月現在)

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

b④

tx③

tx②

tx①
ビットコインP2Pネットワーク© 2017 Fuji Xerox Co., Ltd. All rights reserved.

b③

約10分に1つブロックが増える
1ブロックで２千のトランザクションを含む

b②

b①
b(0)

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

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

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

Bさんの署名つきトランザクション
入力
Bさんには
7 BTCある

出力
Cさんに
7 BTC渡す

このトランザクションは、ただ署名しただけであって、ビットコインネットワークではこの取引を認めていない© 2017 Fuji Xerox Co., Ltd. All rights reserved.

なぜブロックチェインが必要なのか？
登録(=Proof Of Work)(=マイニング)
ビットコインP2Pネットワークのブロックチェイン

公開
登録依頼
Bさんの署名つきトランザクション
入力
Bさんには
7 BTCある

出力
Cさんに
7 BTC渡す

P2Pネットワークに受け入れてもらうことで取引が全ビットコイン利用者に受理される© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ブロックのデータ構造

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

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

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

ブロックバージョン <4>現在時刻(Unixオリジンの秒数) <4>
現ターゲット(ハッシュ計算困難度) <4>
発掘で計算されたノンス <4>
トランザクション数 <1-9>
トランザクションデータ 0

直前のブロックヘッダのハッシュ<32>
マークルルートハッシュ値 <32>
現在時刻(Unixオリジンの秒数) <4>
現ターゲット(ハッシュ計算困難度) <4>
発掘で計算されたノンス <4>
トランザクション数 <1-9>coinbase
発掘報償金25.?BTC

coinbase
発掘報償金25.?BTC

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

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

トランザクションデータ 1：：

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

トランザクションデータ n© 2017 Fuji Xerox Co., Ltd. All rights reserved.

merkle root

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

sha256d

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

ブロックヘッダ <80>

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

ブロックヘッダ <80>

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

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

バージョン<4>
入力数<1>
前の取引ハッシュ<32>
前の出力インデックス<4>

入 スクリプトバイト長<1>
力① scriptCoinbase
シーケンス終端記号<4>
出力数<1>
出 出金額(BTC) <8>
力 scriptPubKey① 送金先(発掘者)の参照
ブロックロック時間<4>© 2017 Fuji Xerox Co., Ltd. All rights reserved.

0100000001
00000000000000… (全部ゼロ)
ffffffff (全部ff)
8b
03+ブロック高+あと不明
ffffffff
01
xxxxxxxx… 25BTC+手数料になる
1976a91406f1b6......88ac
00000000全てのお金の源流はコインベーストランザクション
使われていないトランザクション出力＝誰かの口座残高

Aさんの
アドレスに
0.07BTC

発掘者5へ
25BTC

b(30万)

コインベース

Aさんへ
0.03BTC

発掘者4へ
25BTC

b④

発掘者3へ
25BTC

b③

発掘者3へ
25BTC

b②

発掘者2へ
50BTC

b①

発掘者1へ
50BTC

b(0)

Aさんへ
0.01BTC
Aさんへ
0.03BTC

お金は細かく分かれた
りくっついたりしながら利用者の元へ届く© 2017 Fuji Xerox Co., Ltd. All rights reserved.

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

マークルルートハッシュの計算ブロックに含まれる全トランザクションデータのハッシュ値を木構造で組み合わせてそれをルート値として管理する。
→ 後続ブロックを持った時点でトランザクションを改竄できなくなる
結合関数 fm =sha256d(rev(txida)+rev(txidb))
ハッシュ12345656※ rev: バイトの逆順

これがマークルルート

ハッシュ1234

ハッシュ5656

fm

fm

ハッシュ12

ハッシュ34

ハッシュ56

ハッシュ56fm

fm

fm

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

ハッシュ5

ハッシュ6

ハッシュ1
txid1

ハッシュ2
txid2

ハッシュ3
txid3

ハッシュ4
txid4

txid5

txid6

sha256dsha256dsha256dsha256dsha256dsha256d

tx1

tx2

tx3

tx4

tx5

tx6

AからBへ4BTC

FからDへ1BTC

ZからQへ1BTC

WからYへ3BTC

PからGへ9BTC

SからLへ1BTC© 2017 Fuji Xerox Co., Ltd. All rights reserved.

マークルルートハッシュのメリット
いらない部分を保管しなくて済む
例えば、tx2が自分の関連するトランザクションだとして、関係するものだけを残して後で検証したい場合、下の薄いのは消してもいつでも再検証ができる
ハッシュ12345656

ハッシュ1234

ハッシュ5656

ハッシュ12

ハッシュ1
txid1

ハッシュ34

ハッシュ2
txid2

ハッシュ3
txid3

ハッシュ56

ハッシュ56

消してしまってよい
ハッシュ4

txid4

ハッシュ5

txid5

ハッシュ6

txid6

tx1

tx2

tx3

tx4

tx5

tx6

AからBへ4BTC

FからDへ1BTC

ZからQへ1BTC

WからYへ3BTC

PからGへ9BTC

SからLへ1BTC© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ブロックの発掘© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ブロックの発掘とは？

ターゲットの値によりブロックヘッダ
ハッシュ値の許容される最大値が得られる(全P2Pネットワーク上で発掘が10分程度で終わるように調整)

マジックナンバー(定数) <4> = d9b4bef9ブロックのデータバイト数 <4>

直前のブロックヘッダのハッシュ<32>
マークルルートハッシュ値 <32>
現在時刻(Unixオリジンの秒数) <4>※時間は比較的適当でよい

sha256d

ブロックヘッダ <80>

merkle root

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

現ターゲット(ハッシュ計算困難度) <4>※約半月に1回変更になる
発掘で計算されたノンス <4>
トランザクション数 <1-9>

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

トランザクションデータ 0：
トランザクションデータ n© 2017 Fuji Xerox Co., Ltd. All rights reserved.

表の出典：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

ブロックのターゲット値の計算は？ (v1当時)
現ターゲット(ハッシュ計算困難度) <4>※約半月に1回変更になる

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

値

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

53

30

7c

18

18

7c

30

53

16進数32バイト表現のターゲット値(=hash256dの結果長と同じ)
先頭32-24=8バイトがゼロ
00

・・・

00

7c

全体でx18=24バイトになるように
30

53

00

00

00

・・・

00

00

この値「以下」になるように発掘(=ハッシュ計算)を繰り返す© 2017 Fuji Xerox Co., Ltd. All rights reserved.

難易度(Difficulty)の推移(2017年7月現在)

当然、ネット全体でのハッシュ計算速度と難易度は相関がある2017年7月
ネット全体速度：
5200ペタハッシュ/秒
難易度：
7080億

3年で65倍2016年8月
ネット全体速度：1600ペタハッシュ/秒
難易度：
2250億
2014年6月
ネット全体速度：80ペタハッシュ/秒
難易度：
110億

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

2016年、発掘プール市場における中国の台頭、2017年も続く発掘プールの中国資本は2014年40%が2016年70%になった
50%越えでビザンチン将軍問題で不正取引が可能では？
中国

プライベート

米国
中国
中国
中国
中国
2017年7月の発掘プール比率
出典：www.blocktrail.com© 2017 Fuji Xerox Co., Ltd. All rights reserved.

中国

中国の水冷による発掘施設、月2億稼ぐ施設も
出典：http://gigazine.net/news/20131126-bitcoin-mining-facility/ビットコインに対する不安© 2017 Fuji Xerox Co., Ltd. All rights reserved.

ビットコインに対する(最近の)不安① 取引き可能量が限界に近づいている(ハードフォーク、ビットコインアンリミテッド)② 手数料高騰で当初期待していた少額決済には向かない③ とある国家によるビザンチン将軍問題による不正取引の可能性④ 使われている暗号技術が危殆化したらどうするのか 不安があれば、利用者は(イーサリアムなど)他の通貨に移動すればよいのでは？ 簡単に移動できる 仕組みについては、ビットコインを維持しなければならない人
だけが苦労すればよいのでは？

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

まとめ• 本日の内容••••

最新動向をまじえた、ビットコインとは何かについて
ビットコインで使われている暗号技術
ビットコインで使われるデータ構造、仕組み
ビットコインで最近起きている不安• 古いビットコインの仕組みを学ぶことで、今後の新しいブロックチェーン技術の理解の助けになれば幸いです。

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

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