Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Bitcoinから学ぶブロックチェーン入門

 Bitcoinから学ぶブロックチェーン入門

ブロック、トランザクション、ビットコインスクリプトの仕組み

kutakutat

July 13, 2023
Tweet

More Decks by kutakutat

Other Decks in Technology

Transcript

  1. C O NTENT 1 ビットコインの成り立ち 信頼できる第三者を必要としない、電子通貨システム • 2008/10: サトシ・ナカモト氏が発表した論文 Bitcoin

    : Peer-to-Peer Electroric Cash System(ビットコイン:P2P電子現金シ ステム) が起源。 • 2009 年 1 月: Bitcoin Core という OSS の参照実装が作られ、Bitcoin の運 用開始 4
  2. C O NTENT 1 ビットコインのモチベーション 「信頼できる第三者を必要としない、電子通貨システム」の実現 • いままでの仕組みだと、二重支払い問題の解決を信頼できる第三者なしで実 現できていなかった •

    二重支払いを解決する方法は「全体で共通の台帳を持つこと」に帰着するが、 分散ネットワークで実現するには課題があった Alice Bob Charlie 100 100 100 二重支払い 5
  3. C O NTENT 1 Bitcoin の台帳の概要 参加者(ノード)が行った取引(トランザクション)は、ブロックと呼ばれるデータ構造に 記録され、鎖状につながれる。台帳は全ノードで共有される。 ブロック n-1

    取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ ブロック n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ ブロック n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ 6
  4. C O NTENT 1 Bitcoin ネットワーク ビットコインのネットワークはピア・ツー・ピア(P2P) 全てのノードは台帳を共有しており、全てのノードがトランザクションとブロックをブ ロードキャストし、受け取ることができる ノード

    台帳 ビットコイン クライアント ノード 台帳 ビットコイン クライアント ノード 台帳 ビットコイン クライアント ノード 台帳 ビットコイン クライアント トランザクション トランザクション ブロック ブロック 7
  5. C O NTENT 1 トランザクションの流れ ノード Newトランザクション Alice to Bob

    ノード ノード ノード Tx ノード 検証 ノード Tx Tx Tx Tx トランザクションを作成したら、ノードにブロードキャストする。各ノードは検証しOKで あればプールし、別のノードに送る 8
  6. C O NTENT 1 ブロックの流れ New #nブロック #nブロック 検証 →

    つなげる マイナーノードによってブロックをまとめる競争をし、まとめられたらブロードキャス ト。各ノードが検証しOKであれば台帳にブロックをつなげる。 マイナーノード 台帳 マイナーノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 #nブロック 9
  7. C O NTENT 1 トランザクション、ブロックの流れ 1. Alice → Bob へトランザクション(Tx)

    を作成する 2. Tx をビットコインネットワークにブロードキャストする 3. 各ノードで Tx を検証し問題なければをプールに保管し、別ノードに渡す 4. マイナーノードによって約 10 分毎にブロックに取引がまとめられ、 マイニングできた(ブロックにうまくまとめられた) マイナーからブロックが別のノー ドに伝搬される 5. 各ノードが新しいブロックを検証し、問題なければ自分の台帳に取り込む 6. 別のノードにブロックをブロードキャストする 1-6 を繰り返して後続のブロックが伸びていく 10
  8. C O NTENT 1 ビットコインアドレス ビットコインアドレスは、トランザクションの送信受信の際の宛先 ビットコインアドレスは基本的に使い捨てが推奨 後述するトランザクションの種類によって先頭が異なる(1, 3, m,

    n, bc1 など) ex. 1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2 秘密鍵 公開鍵 ビットコインアド レス 楕円曲線暗号 アルゴリズム ハッシュ関数 Prefix付与 etc レガシーな送金で利用されるビットコインアドレスの生成 12
  9. 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
  10. C O NTENT 1 Bob に送られた UTXO を Bob だけが使えるよ

    うにするには? → UTXO にはロックがかかっている 14
  11. C O NTENT 1 Tx のデータ構造 15 ※ SegWit では

    witness, marker, flag が追加される
  12. C O NTENT 1 Input, Output の詳細 Input のデータ構造 Output

    のデータ構造 = ScriptSig = ScriptPubKey 16
  13. 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
  14. 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
  15. C O NTENT 1 トランザクションの検証 1. トランザクションの Input が未使用であること 2.

    トランザクションの Input の合計額が、Output の合計額を超えないこと 3. トランザクションの Unlocking Script(ScriptSig) で、前のトランザクションの ScriptPubKey(Locking Script) を案ロックできること • 最終的に True または 0 以外の数値 1 つになれば、トランザクションは有効と みなされる 19
  16. C O NTENT 1 ビットコインスクリプト ビットコインの Tx の入力と出力を制御するためのスクリプティング言語 どんな条件下で UTXO

    を利用できるかを記述できる • ビットコインスクリプトはスタックベースの言語 • 非常にシンプルな命令のセット(opcodes)のみをサポート ◦ 複製、比較演算、署名の検証など LIFO: Last In First Out 22
  17. C O NTENT 1 Lock Script, Unlocking Script をあわせて演算し True

    または 0 以外の数値 1 つになれば アンロック成功とする 23
  18. 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
  19. 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
  20. 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
  21. 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
  22. C O NTENT 1 トランザクションの流れ ノード Newトランザクション Alice to Bob

    ノード ノード ノード Tx ノード 検証 ノード Tx Tx Tx Tx トランザクションを作成したら、ノードにブロードキャストする。各ノードはLocking, Unlocking Script を検証しOKであればプールし別のノードに送る 30
  23. C O NTENT 1 Bitcoin の台帳の概要 参加者(ノード)が行った取引(トランザクション)は、ブロックと呼ばれるデータ構造に 記録され、鎖状につながれる。台帳は全ノードで共有される。 ブロック n-1

    取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ ブロック n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ ブロック n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ 32
  24. 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
  25. C O NTENT 1 マイニング ビットコインネットワーク上で新しいトランザクションを承認し、ブロックを作成するプ ロセス。約 10 分ごとにブロックにまとめられる。 ブロック

    n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ 1. トランザクションの集約 マイナーノードは、ブロックに取り込まれていない Tx を集めてブロック にまとめる。このとき Tx の検証も行う。 2. nonce の発見 ← PoW(Proof of Work) マイナーノードは、新しいブロックに nonce を加えてハッシュ値を計算 する。特定の難易度ターゲットを下回るようなハッシュ値 (nonce)を見 つける必要がある。 3. ブロックの伝搬、検証、追加 適切な nonce を見つけ出したマイナーは、そのブロックをネットワーク にブロードキャストする。他のマイナーやノードがそのブロックを検証 し、問題がなければ各ノードが台帳に新たなブロックとして追加してい く。 34
  26. C O NTENT 1 nonce の発見 新しいブロックに nonce を加えてハッシュ値を計算する 難易度ターゲットを下回るようなハッシュ値になる

    nonce を見つける ブロック n 取引 取引 取引 nonce 前ブロックハッシュ値 タイムスタンプ 35 https://www.investopedia.com/tech/how-does-bitcoin-mining-work/
  27. C O NTENT 1 ブロックの流れ New #nブロック #nブロック 検証 →

    つなげる マイナーノードによってブロックをまとめる競争をし、まとめられたらブロードキャス ト。各ノードが検証しOKであれば台帳にブロックをつなげる。 マイナーノード 台帳 マイナーノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 ノード 台帳 #nブロック 36
  28. C O NTENT 1 マイナーの報酬 トランザクション手数料 • トランザクションに含まれる手数料の合計 • トランザクションは

    Output が若干 Input よりも少なくなるように作成 ※ トランザクションサイズあたりの手数料が高いものが優先されやすい マイニング報酬 • コインベーストランザクションと呼ばれるトランザクションが発行され、マイナー は UTXO を使用できる(通貨発行益) • 21万ブロック(約4年)ごとに発行額は半減している (現在6.25BTC) • 使用できるのは 100 ブロック後になる制限がある 37
  29. C O NTENT 1 ビットコインの課題 • トランザクション処理が遅い : ~10件/秒 ref.

    Visa 1700 件/秒 • ビットコインスクリプトの記述力が弱くて表現できる取引が限定的 • マイニングの電力コストが大きい(PoWの課題) 38
  30. C O NTENT 1 トランザクション、ブロックの流れ 1. トランザクション(Tx) を作成する 2. Tx

    をビットコインネットワークにブロードキャストする 3. 各ノードで Tx を検証(ビットコインスクリプト等)し 問題なければをプールに保管し、別ノードに渡す 4. マイナーノードによって約 10 分毎にブロックに取引がまとめられ、 マイニングできた(nonceを発見した) マイナーからブロックが別のノードに伝搬さ れる 5. 各ノードが新しいブロックを検証し、問題なければ自分の台帳に取り込む 6. 別のノードにブロックをブロードキャストする 1-6 を繰り返して後続のブロックが伸びていく 39
  31. APPENDIX Difficulty Target 42 次の難易度 ターゲット 理想的なマイニング時間 実際にマイニングにかかった時間 前の難易度 ターゲット

    10分 x 2016 直前2016ブロックにかかった時間 前の難易度 ターゲット ※ ただし ¼ ~ 4 倍までのリミッターあり
  32. C O NTENT 1 ブロックチェーンとは? JBA (Japan Blockchain Association) の定義

    • 狭義 :ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともに その時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブ ロックチェーンと呼ぶ。 • 広義 : 電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持 ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させるこ とで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーン と呼ぶ。 47