🪙

【東京大学ブロックチェーン公開講座第2週】ビットコイン①

2024/04/19に公開

本記事は、2024年東京大学ブロックチェーン公開講座の2つ目のレポートです。

【東京大学ブロックチェーン公開講座第1週】ブロックチェーン概論
【東京大学ブロックチェーン公開講座第2週】ビットコイン①(本記事)

講座では3週かけてビットコインについて解説するそうなので、ボリューム的に問題がなければ、本記事に3週分の内容を記載していきます。
追記: 問題があるので、1週1記事で作成することにしました。

なお、本記事は講座の要約ではなく、講座のポイントを抽出しつつ、筆者の理解や考察を添えてアウトプットしたものとなります。講座内容との差異や筆者の主張(オレンジ背景)が含まれます。

また、本講座で解説するビットコインは、主に初期のプロトコル(ビットコインも何度か大きなバージョンアップが入っている)について取り上げるそうです。現行のものはと細かい差異がある可能性があります。

ビットコインの仕組み

AliceがBobに0.1BTCを送金する場合において、内部的にどのようなことが起きているのか解説していく。前段として、ハッシュ関数についての理解が必要になる。

ハッシュ関数

入力を特定のフォーマットの出力に変える関数。一方向性(入力から出力は高速に求められるが、出力から入力を求めることはできない)をもつ。MD5やSHA1、SHA256など。

ハッシュ関数の出力をハッシュ値という。暗号学的ハッシュ関数は次の3つの特徴をもつ。

  • 現像計算困難性:ハッシュ値から入力を求めることが困難(現実的でない規模で時間を要する)
  • 第二現像計算困難性:ある入力値とおなじ出力をもつ別の入力値を求めることが困難
  • 強衝突耐性:おなじハッシュ値をもつ異なる2つの入力値を求めることが困難

一般的なWebアプリケーションとビットコインシステム

ビットコインにおいて『トランザクション』の作成を担うのは『ウォレット』というソフトウェアで、これはWebアプリケーションにおけるWebブラウザにあたる役割を果たす。

  • 一般的なWebアプリケーション:ブラウザがWebサーバーにHTTPリクエストを送り、レスポンスを取得して画面を描画する。
  • ビットコイン:ウォレットというユーザーの秘密鍵(後述)を管理するソフトウェアをつかってビットコインネットワークにトランザクションを送り、しばらく待つとブロックチェーンに取り込まれて取引が確定する。

トランザクションとUTXOモデル

ビットコインにおけるトランザクションは以下の要素で構成され、送金元の電子署名が含まれる。

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

通貨を管理するシステムをモデリングするとき、まず思いつくのが「誰がいくら持っているか」を管理する手法。ビットコインではこのような管理方法はとっておらず、「送金元トランザクション」をつかって表現する。これをUTXO(Unspent Transaction Output)モデルという。

AliceがBobに送金する場合、Aliceが過去にBTCを受け取ったトランザクションを送金元トランザクションとして利用する。

トランザクションの形式

送金元が『人(アドレス)』ではなく『過去のトランザクション』のため、送金元トランザクションの残額が送金額を上回る(もしくは下回る)ケースが発生する。このような場合、送金して残った額は再度Aliceにおつりとして送ることになり、トランザクションの送金元(Input)と宛先(Output)には、以下3つのパターンがある。

  • 一般的なトランザクション:1つのInputから、1つのアドレスへの送金(ただしOutputは送金元へのおつりがあるため複数)
  • 集約型トランザクション:複数のInputから1つのアドレスへの送金(おつりトランザクションを複数纏める場合など)
  • 分配型トランザクション:1つのInputから複数のアドレスへの送金(給与支払いなど)

Inputの取得

ウォレットは過去のトランザクションのデータを内部で保持しており(保持範囲によってフルインデックスウォレットと軽量ウォレットに分けられる)、Inputとなる送金元トランザクションを取得する。

Outputの作成

アウトプットの中身は、その資金を使用するための解除条件スクリプト(ロッキングスクリプト)。誰でも任意のアドレスに関するスクリプトを生成できるが、ロック解除できるのはアドレスに対応した秘密鍵の保持者のみ。

トランザクションの送信とマイニング

ネットワーク上に送信されたトランザクションは、受け取ったノードが接続されたノードに渡して伝播していき、マイナーノード(ブロックを生成するノード)に行き着いてメモリプール(トランザクションプール)に保管される。この時点では、トランザクションはまだブロックに取り込まれていない。

トランザクションをブロックに取り込むにはマイニングが必要。ビットコインにおけるマイニングはPoW(Proof of Work)と言われ、十分な計算量が注ぎ込まれた場合に承認され、ブロックの生成者は報酬を受け取ることができる。

マイニングの実態は与えられた乱数(ハッシュ値)から、そのインプットとなる値を探す作業。生成されたブロックは隣接ノードに送られ、検証されてブロックチェーンに取り込まれる(台帳に書き込まれる)。

ファイナリティ

世界中のノードがブロックの生成・検証を競い合っているため、まったくおなじタイミングで複数の異なるブロックが生成・追加されることがある。

このときブロックチェーンは一時的に分岐する(保持する台帳がノードによって異なる)が、次のブロック→次の次のブロック→...とブロックが積み重なっていくうちに、いずれか最も速く長いチェーンが正しいものとみなされる。この時点で、分岐していた他のブロックは捨てられ、そこに含まれていたトランザクションは巻き戻る。

つまり、トランザクションは、ブロックに格納されて台帳に書き込まれても『確定した』とは言い切れず、巻き戻る可能性がある。一般的にビットコインでは6ブロック以上積み上がると、巻き戻ることは確率的にほぼあり得ないとされている。

このことから、ビットコインは確率的ファイナリティをもつ、と表現される。

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

ブロックチェーンは既存の暗号技術によって支えている。

公開鍵暗号方式による署名

公開鍵暗号方式は、暗号化および暗号化した主体が本人であることを検証をするための仕組み。秘密鍵と公開鍵のペア(実際は数字)を利用する。ECDSA、RSAなど。

ビットコインではECDSAを採用し、主に署名に使われる。送信者はメッセージに秘密鍵で署名し、公開鍵と署名をトランザクションに含めて送信する。受信者は公開鍵をつかって署名を検証することで、その送信者の正当性(なりすましでないこと)を確認できる。

秘密鍵・公開鍵・アドレス

秘密鍵は乱数で生成する。楕円曲線をもとに秘密鍵から公開鍵を導出し、ハッシュ関数を利用してアドレスを求める。アドレスは銀行口座の口座番号のようなもので、ビットコインネットワーク上でユーザーを特定するために利用する。

秘密鍵

乱数で生成した正の整数。乱数のため被る可能性はあるが、現実的には被らない(と言えるほどに確率が低い)。

公開鍵

秘密鍵と楕円曲線(secp256k1)を使って導出される、楕円曲線上の点(座標)。
楕円曲線は実際にグラフにプロットすると楕円にはならない点に注意(横にした前方後円墳みたいな形)。楕円曲線上の座標のうち、XとYが両方正である部分のみを利用する。

なお、楕円曲線の演算としてゼロ・加法・正整数倍が定義されている。

  • ゼロ:無限遠点
  • 加法:P1とP2を通る直線と楕円曲線が交わる点(P3')のX軸対象の点。
  • 正整数倍:2倍は同じ値の加法であり、P1+P1はP1の接線と楕円曲線が交わる点のX軸対象点となる。これを繰り返すことで整数倍を得る。

楕円曲線上で、あらかじめ決められた生成元Gを秘密鍵(k)倍することで公開鍵(K)を得ることができる。秘密鍵から公開鍵を求めることは可能だが、逆は現実的には不可能。

アドレス

公開鍵から求められる文字列。以下の手順によって求める。

  1. 公開鍵をハッシュ関数SHA256にかけ、256bites(32bytes)の出力を得る
  2. さらにハッシュ関数RIPEMD160にかけ、160bits(20bytes)の出力(公開鍵ハッシュ)を得る
  3. 公開鍵ハッシュをBase58Checkエンコードする
  4. プレフィックス"0x00"をつけてアドレスとする

なお公開鍵はXY座標のため、決められた形にフォーマットしてSHA256のインプットとする(フォーマットについては次週以降で解説)。


第3回以降の記事を公開しました!
【東京大学ブロックチェーン公開講座第3週】ビットコイン②
【東京大学ブロックチェーン公開講座第4週】ビットコイン③

Discussion