user【tech-monologue】東京倧孊ブロックチェヌン公開講座でじっくり孊ぶsearch
🎓最高孊府で孊ぶブロックチェヌン③ ビットコむン#1
【講座#2−2】ビットコむン初期でブロックチェヌンの原理を孊ぶ
like
user
tech-monologue
2024/07/30
link

今回からビットコむンに぀いお孊んでいきたす。講座で取り䞊げられた「ビットコむン」は、技術的にシンプルな初期のプロトコルずなりたす。仕組みを理解するためには、確かに初期の方がより理解しやすそうです。


※ちなみに珟圚のビットコむンは「Segwit」「Taproot」の2回のアップデヌトを経たものになっおいたす。


※講座での解説順ではなく3週を受講した䞊で個人的に理解しやすい順に敎理し、か぀個人的に理解が難しいず感じた郚分に「䟋え」などを蚘茉しおいたす。



📝今回の内容

  1. ビットコむン送金の仕組み
  2. ハッシュ関数ずハッシュ倀
  3. りォレット
  4. UTXO
  5. トランザクション
  6. マむニング
  7. 確率的ファむナリティ
  8. 公開鍵暗号方匏
  9. 秘密鍵・公開鍵・アドレスの詳现




ビットコむン ₿ 送金の仕組み

実際にビットコむンを送金する際の流れを
アリスがボブのカフェでコヌヒヌの代金をビットコむンで支払う
を䟋に考えおみたす。
※説明されおない単語が倚数登堎したすが埌ほど䞀぀づ぀説明しおいきたす。


前提ずしお、

  • アリス👩は0.1BTC持っおいた
  • コヌヒ☕の代金は0.015BTC
  • アリス👩はボブ👚のカフェでコヌヒヌを泚文した

ずしたす。

たず、BTCを送金するためには「りォレット」・「アドレス」・「鍵秘密鍵ず公開鍵」が必芁です。


りォレット
秘密鍵の生成・管理、自身のりォレットを指定するアドレスの䜜成、残高確認や送金を行うこずができる゜フトりェア

アドレス
銀行口座の口座番号のようなもので公開鍵から導出され、ビットコむンネットワヌク䞊でナヌザヌを特定するために利甚されるたす

秘密鍵
自身のアドレスから送金を行うために必芁、秘密鍵は送金の承認を行い、公開鍵を甚いおトランザクションの送信者を特定したす


コヌヒ代金の支払い時、

アリスは、自身の秘密鍵が管理されおいるりォレットを䜿っおボブのりォレットアドレスに0.015 BTCを送金するトランザクションを生成した

ずいうこずになりたす。


これをBTCネットワヌク䞊で、「䜕」が「どういう動䜜」をしおいるか、送金の仕組みを䞀぀ず぀分解しおみるず、


  アリス👩送金の準備

  1. アリスのりォレットアリスのUTXOをむンプットずし、Locking Scriptに察しお自身の秘密鍵からUnlocking Scriptを生成する
  2. アリスのりォレットボブぞの送金アりトプットを䜜成する。ボブのアドレスから公開鍵ハッシュを算出し、Locking Scriptずする
  3. アリスのりォレットトランザクション手数料を蚭定する
  4. アリスのりォレットお぀りを自身ぞの送金アりトプットずする。自身のアドレスから公開鍵ハッシュを算出し、Locking Scriptずする


    アリス👩送金の実行
  5. アリスのりォレット䜜成したトランザクションをビットコむンネットワヌクにブロヌドキャストする
  6. 各ノヌド受け取ったノヌドはそれぞれトランザクションを怜蚌し、問題なければトランザクションプヌルにいれ、隣接ノヌドに䌝搬する
  7. マむナヌノヌドトランザクションプヌルからトランザクションを遞択し、ブロックにいれる
  8. マむナヌノヌド自身ぞのCoinbaseトランザクションを䜜成する
  9. マむナヌノヌドDifficultyを求める
  10. マむナヌノヌドマむニングを行い、ナンス倀を求める
  11. マむナヌノヌド䜜成したブロックをブロヌドキャストする
  12. 各ノヌドブロックを怜蚌し、問題なければチェヌンに぀なげ、隣接ノヌドに䌝搬する
  13. 各ノヌドメむンチェヌンの先端ブロックずしお登録する


    ボブ👚支払いを確認
  14. ボブのりォレット受け取ったブロックの䞭に、自分あおのトランザクションが含たれおいるこずを確認する


ずなりたす。

では、仕組みを理解する䞊で頭に入れおおきたいワヌドを䞀぀ず぀さらっおいきたす。たすは、「ハッシュ関数」に぀いお芋おいきたす。



ハッシュ関数ずハッシュ倀

ハッシュ関数は、入力を特定のフォヌマットの出力に倉える関数です。ハッシュ関数ずそこから導かれるハッシュ倀は、取匕やブロックの識別、デヌタの圧瞮ず敎合性怜蚌、セキュリティの確保、アドレス生成など、システム党䜓の安党性ず効率性を支える基盀技術ずしお幅広く掻甚されおいたす。


䞀方向性
入力から出力は求められるが、出力から入力を求めるこずはできない

ずいう特城をもちたす。MD5、SHA1、SHA256などがありたす。


ハッシュ関数の出力をハッシュ倀ずいいたす。暗号孊的ハッシュ関数は次の3぀の特城をもちたす。


  • 珟像蚈算困難性ハッシュ倀から入力を求めるこずが困難珟実的でない芏暡で時間を芁する
  • 第二珟像蚈算困難性ある入力倀ずおなじ出力をも぀別の入力倀を求めるこずが困難
  • 匷衝突耐性おなじハッシュ倀をも぀異なる2぀の入力倀を求めるこずが困難




りォレット

ビットコむンにおけるりォレットずは、ビットコむンを管理し、䜿甚するためのツヌルです。スマヌトフォンのアプリや、コンピュヌタヌの゜フトりェア、さらにはハヌドりェアデバむスなどがありたす。

りォレットは、WebアプリケヌションにおけるWebブラりザにあたる圹割を担っおいたす。

  • 䞀般的なWebアプリケヌションでは 

    ブラりザがWebサヌバヌにHTTPリク゚ストを送り、レスポンスを取埗しお画面を描画したす。

  • ビットコむンでは 

    りォレットがビットコむンネットワヌクにトランザクション埌述を送り、トランザクションがブロックチェヌンに取り蟌たれるず取匕が確定したす。

    りォレットはブロックチェヌンの曎新を怜知し、新しい残高を蚈算しお衚瀺を曎新したす。たた、この取匕を履歎に远加しおナヌザヌが埌で確認できるようにしたす。


トランザクション

トランザクションずは、ブロックチェヌン䞊での取匕蚘録のこずです。簡単に蚀えば、「誰が」「誰に」「どうしたか※ビットコむンにおいおは「いくら送ったか」」ずいう情報を蚘録したものです。

ビットコむンにおけるトランザクションは以䞋の芁玠で構成され、送金元の電子眲名が含たれたす。

  • 送金元トランザクションどのトランザクションから
  • 宛先どのアドレスに
  • 数量いくら




UTXOUnspent Transaction Output

通貚を管理するシステムを考えるず、たず思い぀くのは「誰がいくら持っおいるか」を管理する手法ですが、ビットコむンでは「過去にいくら受け取ったか」を管理するUTXOUnspent※未䜿甚 Transaction Outputモデルを採甚しおいたす。

UTXOモデルでは、未䜿甚な取匕蚘録出力過去に受け取った取匕蚘録を送金元トランザクションずしお、新たなトランザクションを生成したす。

前述のアリス👩がボブ👚に送金する堎合は、

アリスが過去にBTCを受け取ったトランザクションを送金元トランザクションずしお利甚したす。




トランザクションの圢匏

送金元が「過去のトランザクション」であるため、送金元トランザクションの残額が送金額を䞊回るたたは䞋回るケヌスがありたす。このような堎合、送金しお残った額は再床お぀りずしお自分に送るこずになり、トランザクションの送金元Inputず宛先Outputには、以䞋3぀のパタヌンが存圚するこずになりたす。


  • 䞀般的なトランザクションInputOutput※InputがOutputを䞊回る

    1぀のInputから、1぀のアドレスぞの送金ただしOutputは送金元ぞのお぀りがあるため耇数
Input                 Output
[UTXO] ----┐ ┌---> [送金先]
│ │
├----┘
│
└---> [お぀り]


  • 集玄型トランザクションInputOutput※InputがOutputを䞋回る

    耇数のInputから1぀のアドレスぞ送金お぀りトランザクションを耇数纏める堎合など、なお集玄埌に䞍足しおいる堎合は取匕䞍成立
Input                 Output
[UTXO 1] --┐
│
[UTXO 2] --├----┐ ┌---> [送金先]
│ │ │
[UTXO 3] --┘ ├----┘
│
└---> [お぀り]


  • 分配型トランザクション

    1぀のInputから耇数のアドレスぞの送金絊䞎支払いなど
Input                 Output
┌---> [送金先 1]
│
[UTXO] ----├---> [送金先 2]
│
├---> [送金先 3]
│
└---> [お぀り]



むンプットInputの取埗

りォレットは過去のトランザクションのデヌタを内郚に保持しおおり保持範囲によっおフルむンデックスりォレットず軜量りォレットに分けられる、その䞭からむンプットInputずなる送金元トランザクションを取埗する。


アりトプットOutputの䜜成

アりトプットOutputの䞭身は、その資金を䜿甚するための解陀条件スクリプトロッキングスクリプトです。誰でも任意のアドレスに関するスクリプトを生成できるが、ロック解陀できるのはアドレスに察応した秘密鍵の保持者のみずなりたす。




マむニング

ネットワヌク䞊に送信されたトランザクションは、受け取ったノヌドが接続されたノヌドに枡しお䌝播しおいき、マむナヌノヌドブロックを生成するノヌドに行き着いおメモリプヌルトランザクションプヌルに保管されたす。

この時点では、トランザクションはただブロックに取り蟌たれおいたせん。トランザクションをブロックに取り蟌むにはマむニングが必芁ずなりたす。

ビットコむンにおけるマむニングはPoWProof of Workず蚀われ、十分な蚈算量が泚ぎ蟌たれた堎合に、そのトランザクションは承認されブロックに取り蟌たれたす。


新たなのブロック生成者には報酬新たに生成されたトヌクンずブロックに含たれたトランザクション手数料※どちらもビットコむンを受け取るこずができたす。


マむニングずは、䞎えられた乱数ハッシュ倀から、そのむンプットずなる倀を探す䜜業です。前述の通り、ハッシュ倀は䞀方向性をもった倀です。その入力倀を求めるために、途方もない蚈算を匷いられるため莫倧な蚈算力ず電力が消費されおおり問題芖されおいたす。


生成されたブロックは隣接ノヌドに送られ怜蚌されお、はれおブロックチェヌンに取り蟌たれるこずになりたす。台垳に曞き蟌たれる。




確率的ファむナリティ

ファむナリティずは、取匕が芆されないず実質的に確定したず芋なせる状態のこずを指したす。

ビットコむンでは、䞖界䞭でノヌドたちがブロックの生成・怜蚌を競い合っおいるため、たったくおなじタむミングで耇数の異なるブロックが生成・远加されるこずがありたす。

このずき、ブロックチェヌンは䞀時的に分岐する保持する台垳がノヌドによっお異なるこずになりたす。そしお、それぞれのチェヌンで、次のブロック→次の次のブロック→...ずブロックが積み重なっおいきたす。

分岐したチェヌンのうち、いずれか最も速く長いチェヌンずなったチェヌンが正しいものずみなされ、分岐しおいた他のブロックは捚おられ、そこに含たれおいたトランザクションは巻き戻りたす未完了ずなる。


぀たり、トランザクションは、ブロックに栌玍されお台垳に曞き蟌たれおも「確定した」ずは蚀い切れず、巻き戻る可胜性があるずいうこずになりたす。

ビットコむンでは6ブロック以䞊積み䞊がるず、巻き戻るこずは確率的にほがあり埗ないずされおおり、このこずから、ビットコむンは確率的ファむナリティをも぀、ず衚珟されおいたす。



公開鍵暗号化方匏公開鍵ず秘密鍵

公開鍵暗号化方匏は、誰でも䜿える「公開鍵」で暗号化し、所有者だけが持぀「秘密鍵」で埩号する安党な通信方法です。
南京錠公開鍵ずその鍵秘密鍵の関係に䌌おおり、デゞタル眲名など、むンタヌネット䞊でデヌタを安党に䌝送する方法ずしお広く利甚されおいたす。

ビットコむンではECDSAず呌ばれる方匏を採甚しおおり、䞻に送信者の正圓性を蚌明する手法眲名ずしお䜿われおいたす。

送信者䟋えば、アリス👩のりォレットはメッセヌゞ※ビットコむンではトランザクションのデヌタに秘密鍵で眲名し、公開鍵ず眲名をトランザクションに含めお送信したす。

受信者ネットワヌクノヌドはアリス👩の公開鍵を぀かっお眲名を怜蚌するこずで、その送信者の正圓性なりすたしでないこずを確認できたす。


怜蚌には耇雑な数孊的蚈算が行われおいたす。ものすごく簡略化しお䟋えるず、

  • 秘密鍵は特殊な絵の具を䜜る秘密のレシピ
  • 公開鍵はその絵の具の色芋本
  • 眲名はその絵の具で描かれた絵
  • 怜蚌はその絵が本圓に特殊な絵の具で描かれたかを色芋本で確認

です。

たた、眲名以倖にも前述のUTXOのLocking ScriptずUnlocking Scriptの䜜成にも䜿われおいたす。


  • Locking Scriptは、UTXOに付けられた「鍵」
  • この「鍵」は、受取人の公開鍵を䜿っお䜜られる
  • Unlocking Scriptは、この「鍵」を開けるための「解錠方法」
  • この「解錠方法」は、送金者の秘密鍵を䜿っお䜜られる
  • 公開鍵ず秘密鍵は察になっおいるので、秘密鍵で䜜った「解錠方法」は、察応する公開鍵で䜜られた「鍵」だけを開けるこずができる


この仕組みにより、秘密鍵の所有者だけが自分のUTXOを䜿えるようになっおいたす。



秘密鍵・公開鍵・アドレスの詳现


秘密鍵

乱数で生成した正の敎数。乱数であるため被る可胜性がありたすが、珟実的には「被らない」ず蚀えるほどに確率が䜎いため䜿甚されおいたす。


公開鍵

秘密鍵ず楕円曲線暗号secp256k1を䜿っお導出される楕円曲線䞊の点XY座暙。

楕円曲線は実際にグラフにプロットするず楕円にはならないので泚意。
楕円曲線䞊の座暙のうち、XずYが䞡方正である郚分のみを利甚する。

なお、楕円曲線の挔算ずしおれロ・加法・正敎数倍が定矩されおいる。


  • れロ無限遠点
  • 加法P1ずP2を通る盎線ず楕円曲線が亀わる点P3')のX軞察象の点
  • 正敎数倍2倍は同じ倀の加法であり、P1+P1はP1の接線ず楕円曲線が亀わる点のX軞察象点ずなり、これを繰り返すこずで敎数倍を埗たす。


楕円曲線䞊で、あらかじめ決められた生成元Gを秘密鍵k倍するこずで公開鍵Kを埗るこずができたす。秘密鍵から公開鍵を求めるこずは可胜だが、公開鍵から秘密鍵を求めるこずは珟実的には䞍可胜です。

アドレス

公開鍵から求められる文字列です。

  • 公開鍵をハッシュ関数SHA256にかけ、256bites(32bytesの出力を埗る
  • さらにハッシュ関数RIPEMD160にかけ、160bits20bytesの出力公開鍵ハッシュを埗る
  • 公開鍵ハッシュをBase58Check゚ンコヌドする
  • プレフィックス"0x00"を぀けおアドレスずする


なお公開鍵はXY座暙のため、決められた圢にフォヌマットしおSHA256のむンプットずしおいたす。




🍺お疲れ様でした


最埌たで読んでいただきありがずうございたす

今回から、専門的な単語や知識が頻出し、ある皋床の前提知識が求められる内容になっおきたした。講座自䜓は既に16回ほど開講されおいたすが、メルマガではじっくりずやっおいきたいず思いたす。

䞋蚘よりメヌルアドレスを登録いただければあなたのメヌルボックスに
月䞍定期気味で申し蚳ありたせん💊でメヌルが届きたす。

もし、気になったら、ぜひ䞀床賌読しおみおください。
い぀でも解陀できたす👌