Share
Embed
Transcript
47 slides
-
C O NTENT 1 はじめに • 本講座は、実際のビットコインの技術的な仕組みに焦点を当てたものであり、 ビットコインの投資や取引に関する情報提供を目的としたものではありませ ん。 •
わかりやすさのために簡略化した説明があります。詳細な挙動等については、 別ソースなどをご参照ください。 2 -
C O NTENT 1 ビットコインの成り立ち 信頼できる第三者を必要としない、電子通貨システム • 2008/10: サトシ・ナカモト氏が発表した論文 Bitcoin
: Peer-to-Peer Electroric Cash System(ビットコイン:P2P電子現金シ ステム) が起源。 • 2009 年 1 月: Bitcoin Core という OSS の参照実装が作られ、Bitcoin の運 用開始 4 -
C O NTENT 1 ビットコインのモチベーション 「信頼できる第三者を必要としない、電子通貨システム」の実現 • いままでの仕組みだと、二重支払い問題の解決を信頼できる第三者なしで実 現できていなかった •
二重支払いを解決する方法は「全体で共通の台帳を持つこと」に帰着するが、 分散ネットワークで実現するには課題があった Alice Bob Charlie 100 100 100 二重支払い 5 -
C O NTENT 1 Bitcoin の台帳の概要 参加者(ノード)が行った取引(トランザクション)は、ブロックと呼ばれるデータ構造に 記録され、鎖状につながれる。台帳は全ノードで共有される。 ブロック n-1
取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ ブロック n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ ブロック n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ 6 -
C O NTENT 1 Bitcoin ネットワーク ビットコインのネットワークはピア・ツー・ピア(P2P) 全てのノードは台帳を共有しており、全てのノードがトランザクションとブロックをブ ロードキャストし、受け取ることができる ノード
台帳 ビットコイン クライアント ノード 台帳 ビットコイン クライアント ノード 台帳 ビットコイン クライアント ノード 台帳 ビットコイン クライアント トランザクション トランザクション ブロック ブロック 7 -
C O NTENT 1 トランザクションの流れ ノード Newトランザクション Alice to Bob
ノード ノード ノード Tx ノード 検証 ノード Tx Tx Tx Tx トランザクションを作成したら、ノードにブロードキャストする。各ノードは検証しOKで あればプールし、別のノードに送る 8 -
C O NTENT 1 ブロックの流れ New #nブロック #nブロック 検証 →
つなげる マイナーノードによってブロックをまとめる競争をし、まとめられたらブロードキャス ト。各ノードが検証しOKであれば台帳にブロックをつなげる。 マイナーノード 台帳 マイナーノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 #nブロック 9 -
C O NTENT 1 トランザクション、ブロックの流れ 1. Alice → Bob へトランザクション(Tx)
を作成する 2. Tx をビットコインネットワークにブロードキャストする 3. 各ノードで Tx を検証し問題なければをプールに保管し、別ノードに渡す 4. マイナーノードによって約 10 分毎にブロックに取引がまとめられ、 マイニングできた(ブロックにうまくまとめられた) マイナーからブロックが別のノー ドに伝搬される 5. 各ノードが新しいブロックを検証し、問題なければ自分の台帳に取り込む 6. 別のノードにブロックをブロードキャストする 1-6 を繰り返して後続のブロックが伸びていく 10 -
C O NTENT 1 ビットコインアドレス ビットコインアドレスは、トランザクションの送信受信の際の宛先 ビットコインアドレスは基本的に使い捨てが推奨 後述するトランザクションの種類によって先頭が異なる(1, 3, m,
n, bc1 など) ex. 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2 秘密鍵 公開鍵 ビットコインアド レス 楕円曲線暗号 アルゴリズム ハッシュ関数 Prefix付与 etc レガシーな送金で利用されるビットコインアドレスの生成 12 -
C O NTENT 1 トランザクションの構造 トランザクションは input, output という 2
つの領域を持つ output のうちまだ input として利用されていないものを UTXO : Unspent Transaction Output (未使用残高) と言う Tx 1 Input Output Tx 2 Input Output Alice: 5 BTC Tx1 の Alice 宛 の Output Bob: 3 BTC Alice: 1.99 BTC Tx 4 Input Output Tx2 の Bob 宛 Charlie: 8.99 BTC Tx 3 Input Output Bob: 6 BTC Tx3 の Bob 宛 差額は手数料としてマイナーの報 酬になる(後述) 13 -
C O NTENT 1 Bob に送られた UTXO を Bob だけが使えるよ
うにするには? → UTXO にはロックがかかっている 14 -
C O NTENT 1 Tx のデータ構造 15 ※ SegWit では
witness, marker, flag が追加される -
C O NTENT 1 Input, Output の詳細 Input のデータ構造 Output
のデータ構造 = ScriptSig = ScriptPubKey 16 -
C O NTENT 1 Lock と Unlock: 簡易な例 UTXO を
input に使うには、適切な Unlocking Script を入れる必要がある。 間違った Unlocking Script だと他のノードで Tx の検証時に弾かれてしまう。 Tx n Input Output UTXO: Alice Unlocking Script Alice 署名 Bob: 3 BTC Locking Script Bob 公開鍵 Tx m Input Output UTXO: Bob Unlocking Script Bob 署名 Charlie: 3 BTC Locking Script Charlie 公開鍵 原始的な送金取引の場合 (P2PK) : Tx m の検証 Tx n の Bob 公開鍵で、Tx m の Bob の署名を検証する 17 -
C O NTENT 1 署名の検証 Tx m の特定部位 署名 ハッシュ値
復号したハッシュ値 Bob 秘密鍵 暗号化 Bob 公開鍵 1 2 復号化 ハッシュ化 Tx n Output Bob: 3 BTC Locking Script Bob 公開鍵 Tx m Input UTXO: Bob Unlocking Script Bob 署名 原始的な送金取引の場合 (P2PK) : Tx m の検証 Tx n の Bob 公開鍵で、Tx m の Bob の署名を検証する。Bob 宛に送られた UTXO を、Bob の秘密鍵を持っている人が使用したのか検証する。 18 -
C O NTENT 1 トランザクションの検証 1. トランザクションの Input が未使用であること 2.
トランザクションの Input の合計額が、Output の合計額を超えないこと 3. トランザクションの Unlocking Script(ScriptSig) で、前のトランザクションの ScriptPubKey(Locking Script) を案ロックできること • 最終的に True または 0 以外の数値 1 つになれば、トランザクションは有効と みなされる 19 -
C O NTENT 1 ビットコインスクリプト ビットコインの Tx の入力と出力を制御するためのスクリプティング言語 どんな条件下で UTXO
を利用できるかを記述できる • ビットコインスクリプトはスタックベースの言語 • 非常にシンプルな命令のセット(opcodes)のみをサポート ◦ 複製、比較演算、署名の検証など LIFO: Last In First Out 22 -
C O NTENT 1 Lock Script, Unlocking Script をあわせて演算し True
または 0 以外の数値 1 つになれば アンロック成功とする 23 -
C O NTENT 1 標準的なスクリプト 25 スクリプトのタイプ 説明 P2PK (Pay
to Public Key) 送金先が公開鍵そのものの場合に使われます。一度使われたら アドレスは公開されます。 P2PKH (Pay to Public Key Hash) 送金先が公開鍵のハッシュ(ビットコインアドレス)の場合に使わ れます。この方法が最も一般的で、アドレスは使用されるまで秘 密です。 P2SH (Pay to Script Hash) 送金先がスクリプトのハッシュの場合に使われます。このスクリ プトは送金時ではなく、使用(受け取り)時に提供します。複雑な スクリプトを使用する際に使われます。 P2WPKH (Pay to Witness Public Key Hash) SegWit に対応した P2PKH P2WSH (Pay to Witness Script Hash) SegWit に対応した P2SH -
C O NTENT 1 ビットコインスクリプトの例: P2PK 原始的な送金取引の場合 (P2PK) Locking Script
<Bobの公開鍵> OP_CHECKSIG Unlocking Script <Bobの署名> Tx n Output Bob: 3 BTC Locking Script Bob 公開鍵 Tx m Input UTXO: Bob Unlocking Script Bob 署名 26 -
C O NTENT 1 ビットコインスクリプトの例: P2PK <Bobの署名> <Bobの公開鍵> OP_CHECKSIG Bob
署名 Bob 署名 Bob 公開鍵 1 OP_CHECKSIG 27 -
C O NTENT 1 ビットコインスクリプトの例: P2PKH Tx n Output Bob:
3 BTC Locking Script Bob 公開鍵 ハッシュ値 レガシーな送金取引の場合 (P2PKH) : Tx m の検証 Locking Script OP_DUP OP_HASH160 <Bobの公開鍵ハッシュ値 > OP_EQUALVERIFY OP_CHECKSIG Unlocking Script <Bobの署名> <Bobの公開鍵> Tx m Input UTXO: Bob Unlocking Script Bob 公開鍵 Bob 署名 28 -
C O NTENT 1 ビットコインスクリプトの例: P2PKH <Bobの署名> <Bobの公開鍵> OP_DUP OP_HASH160
<Bobの公開鍵ハッシュ値> OP_EQUALVERIFY OP_CHECKSIG Bob 署名 Bob 署名 Bob 公開鍵 OP_DUP Bob 署名 Bob 公開鍵 Bob 公開鍵 OP_HASH160 Bob 署名 Bob 公開鍵 Bob 公開鍵 ハッシュ値 Bob 署名 Bob 公開鍵 Bob 公開鍵 ハッシュ値 Bob 公開鍵 ハッシュ値 OP_EQUALVERIFY Bob 署名 Bob 公開鍵 Bob 署名 OP_CHECKSIG 29 -
C O NTENT 1 トランザクションの流れ ノード Newトランザクション Alice to Bob
ノード ノード ノード Tx ノード 検証 ノード Tx Tx Tx Tx トランザクションを作成したら、ノードにブロードキャストする。各ノードはLocking, Unlocking Script を検証しOKであればプールし別のノードに送る 30 -
C O NTENT 1 Bitcoin の台帳の概要 参加者(ノード)が行った取引(トランザクション)は、ブロックと呼ばれるデータ構造に 記録され、鎖状につながれる。台帳は全ノードで共有される。 ブロック n-1
取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ ブロック n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ ブロック n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ 32 -
C O NTENT 1 ブロックのデータ構造 キー 説明 値の例 Version ブロックのバージョン番号です。様々なバージョンが存在し、プロ
トコルのアップデートに対応する 1, 2, 3, 4 Previous Block Hash 直前のブロックのハッシュ値です。これによりブロックがチェーン の一部となる 0000000000000b628877727028b4d17b9 60a8dd59575b9a9c3 Merkle Root ブロックに含まれるすべてのトランザクションから生成される Merkle木のルートハッシュ 3a1b9e330d7884938b6b77ac2eb19b616 1b5e4c9a57b2c25d5 Timestamp ブロックが生成された時間の UNIXタイムスタンプ( 1970年1月1 日からの経過秒数) 1594678430 Difficulty Target ブロックを生成するのに必要な難易度を示すターゲット値 0x1b0404cb Nonce ブロックヘッダーのハッシュ値が難易度ターゲット以下になるよう 調整するための値。 Number Used Once 2504433986 Transaction List ブロックに含まれるすべてのトランザクションのリスト [Transaction 1, Transaction 2, ... , Transaction N] 33 -
C O NTENT 1 マイニング ビットコインネットワーク上で新しいトランザクションを承認し、ブロックを作成するプ ロセス。約 10 分ごとにブロックにまとめられる。 ブロック
n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ 1. トランザクションの集約 マイナーノードは、ブロックに取り込まれていない Tx を集めてブロック にまとめる。このとき Tx の検証も行う。 2. nonce の発見 ← PoW(Proof of Work) マイナーノードは、新しいブロックに nonce を加えてハッシュ値を計算 する。特定の難易度ターゲットを下回るようなハッシュ値 (nonce)を見 つける必要がある。 3. ブロックの伝搬、検証、追加 適切な nonce を見つけ出したマイナーは、そのブロックをネットワーク にブロードキャストする。他のマイナーやノードがそのブロックを検証 し、問題がなければ各ノードが台帳に新たなブロックとして追加してい く。 34 -
C O NTENT 1 nonce の発見 新しいブロックに nonce を加えてハッシュ値を計算する 難易度ターゲットを下回るようなハッシュ値になる
nonce を見つける ブロック n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ 35 https://www.investopedia.com/tech/how-does-bitcoin-mining-work/ -
C O NTENT 1 ブロックの流れ New #nブロック #nブロック 検証 →
つなげる マイナーノードによってブロックをまとめる競争をし、まとめられたらブロードキャス ト。各ノードが検証しOKであれば台帳にブロックをつなげる。 マイナーノード 台帳 マイナーノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 #nブロック 36 -
C O NTENT 1 マイナーの報酬 トランザクション手数料 • トランザクションに含まれる手数料の合計 • トランザクションは
Output が若干 Input よりも少なくなるように作成 ※ トランザクションサイズあたりの手数料が高いものが優先されやすい マイニング報酬 • コインベーストランザクションと呼ばれるトランザクションが発行され、マイナー は UTXO を使用できる(通貨発行益) • 21万ブロック(約4年)ごとに発行額は半減している (現在6.25BTC) • 使用できるのは 100 ブロック後になる制限がある 37 -
C O NTENT 1 ビットコインの課題 • トランザクション処理が遅い : ~10件/秒 ref.
Visa 1700 件/秒 • ビットコインスクリプトの記述力が弱くて表現できる取引が限定的 • マイニングの電力コストが大きい(PoWの課題) 38 -
C O NTENT 1 トランザクション、ブロックの流れ 1. トランザクション(Tx) を作成する 2. Tx
をビットコインネットワークにブロードキャストする 3. 各ノードで Tx を検証(ビットコインスクリプト等)し 問題なければをプールに保管し、別ノードに渡す 4. マイナーノードによって約 10 分毎にブロックに取引がまとめられ、 マイニングできた(nonceを発見した) マイナーからブロックが別のノードに伝搬さ れる 5. 各ノードが新しいブロックを検証し、問題なければ自分の台帳に取り込む 6. 別のノードにブロックをブロードキャストする 1-6 を繰り返して後続のブロックが伸びていく 39 -
APPENDIX Difficulty Target 42 次の難易度 ターゲット 理想的なマイニング時間 実際にマイニングにかかった時間 前の難易度 ターゲット
10分 x 2016 直前2016ブロックにかかった時間 前の難易度 ターゲット ※ ただし ¼ ~ 4 倍までのリミッターあり -
C O NTENT 1 ブロックチェーンとは? JBA (Japan Blockchain Association) の定義
• 狭義 :ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともに その時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブ ロックチェーンと呼ぶ。 • 広義 : 電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持 ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させるこ とで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーン と呼ぶ。 47