Herman

Herman

「BTC ホワイトペーパー」学習とまとめ

BTC とは何か#

私がこのホワイトペーパーを読む前は、ビットコインは一連のコードであり、そのコードが 1 ビットコインを表していると自然に考えていました。しかし、実際にはそうではありません。ビットコインのシステム全体には、ビットコインを指すための特別な概念は存在しません。

ホワイトペーパーには次のように記載されています:

We define an electronic coin as a chain of digital signatures.

我々は電子コインを一連のデジタル署名として定義します。

ここを最初に読んだとき、確かに 1 ビットコインは 1 つのデジタル署名に等しいと考えやすいです。その後に訪れるのは大きな疑問です:では、0.1 BTC をどう表現するのでしょうか?

その後の「9. Combining and Splitting Value」章では次のように述べられています:

Although it would be possible to handle coins individually, it would be unwieldy to make a separate transaction for every cent in a transfer. To allow value to be split and combined, transactions contain multiple inputs and outputs. Normally there will be either a single input from a larger previous transaction or multiple inputs combining smaller amounts, and at most two outputs: one for the payment, and one returning the change, if any, back to the sender.

個々のコインを個別に処理することは可能ですが、送金のたびに毎セントごとに別々の取引を行うのは不便です。価値を分割および結合できるようにするために、取引には複数の入力と出力が含まれます。通常、より大きな前の取引からの単一の入力か、より小さな金額を組み合わせた複数の入力があり、最大で 2 つの出力があります:1 つは支払い用、もう 1 つはお釣り(あれば)を送信者に返すためのものです。

ブロックチェーンシステム全体では、保存されているのは取引の記録だけであり、ビットコインは単なる計量単位として機能し、取引記録がどれだけの BTC を移転したかを記録します。ウォレットアドレスは、BTC 自体ではなく、ブロックチェーン内の取引記録に対応しています。

取引を開始する際、取引のプロセスはどうなっているのか#

「2. Transaction」では、原文は次のようになります。

We define an electronic coin as a chain of digital signatures. Each owner transfers the coin to the next by digitally signing a hash of the previous transaction and the public key of the next owner and adding these to the end of the coin. A payee can verify the signatures to verify the chain of ownership.

我々は電子コインを一連のデジタル署名として定義します。各所有者は、前の取引のハッシュと次の所有者の公開鍵にデジタル署名を行い、これらをコインの末尾に追加することで、コインを次の所有者に転送します。受取人は、署名を検証することで所有権の連鎖を確認できます。

先ほど述べた BTC の定義に従うと、BTC は単なる計量単位であり、実際にブロックチェーンに保存されているのは取引記録です

例を挙げて説明します:

私のウォレットアドレスの下には、次の 3 つの取引記録があります:

  1. 私のアドレスに 0.6 BTC を送金。
  2. 私のアドレスに 0.8 BTC を送金。
  3. 私のアドレスに 0.3 BTC を送金。

これら 3 つの取引記録は、私のアドレスに 1.7 BTC があることを示しています。今、私は友人 B に 1.5 BTC を送信する必要があります。

まず、この取引の入力は、私が所有する 3 つの取引記録です(1.5 BTC には 3 つの取引記録が必要です)。

したがって、取引が発生する際に最初に行うことは、私の秘密鍵を使ってこれら 3 つの取引記録の後ろにあるデジタル署名を照合し、これら 3 つの取引記録が私のものであることを証明することです。それから取引を開始します。

次に、前回の取引のハッシュは、3 つの取引記録に対応する 3 つのハッシュ値を指します。

そして、今回の取引の出力には 2 つの取引記録があります:

  1. 友人のアドレスに 1.5 BTC を送金
  2. 私のアドレスに 0.2 BTC を送金(お釣り)

この 2 つの取引記録の最後は次のようになります:

  1. 3 つの取引記録のハッシュ値 + 友人 B の公開鍵を計算して得られたデジタル署名を 1.5 BTC の取引記録の最後に添付します。
  2. 3 つの取引記録のハッシュ値 + 自分の公開鍵を計算して得られたデジタル署名を 0.2 BTC の取引記録の最後に添付します。

これで 1 回の送金が完了し、1 つの取引記録の所有権が友人 B に移転され、もう 1 つのお釣りが私のもとに戻ります。所有権の確認も、秘密鍵を使って解読して確認するだけで済みます。これが BTC の送金が発生する際の出来事です。

二重送信を避けるにはどうすればよいか?#

二重送信とは何か?例を挙げて説明します:

今、私は 10 BTC を持っていて、友人 B に 8 BTC を送信し、友人 C に 9 BTC を送信するつもりです。そこで、私は上記の取引の流れに従って、2 回の取引を構築し、同時にこの取引を開始しました。私たちは BTC が自分のものであるかどうかを簡単に確認できますが、送信者が同時にこれらの BTC を別の人に送信したいと思っているかどうかは保証できません。

問題が発生する理由は、B と C が私の言葉を無条件に信じ、B と C の間で情報が共有されず、取引がどちらが先かを明確に理解できないからです。

現実の問題解決策は、第三者機関を導入することです。銀行のような役割です。B と C はこの機関が発起した送金のみを信じ、私もこの機関に送金の要求をすることしかできません。すべての送金行為が中央機関を通じて行われる必要があるため、情報の不通の問題は存在しません。機関は私がいくら持っているか、どれだけ送金できるかを把握しており、私が自由に二重送信を行うことは許されず、すべての送金の前後関係を整理することができます。

しかし、問題は、導入された第三者機関を完全に信頼する必要があることです。信頼は監視が難しい行為であり、上記の例では、私と第三者機関が共謀しているかどうかを保証することはできません。現実には、多くの手続きやプロセスが人々にこれらの第三者機関を信頼させようとしていますが、結局のところ、プロセスに人が関与している限り、悪事が起こるのは避けられません。時間の問題に過ぎません。

BTC が目指しているのは、この第三者機関を排除し、コードによって第三者の信頼なしに安全な取引システムを設計することです。

「タイムスタンプサーバー」#

最初の措置は、タイムスタンプサーバーのような設計を実現することです。新聞のように、特定の時間と具体的なイベントを記録し、すべての取引が発生した順序を示します。

ブロック内では、BTC のブロックにタイムスタンプが追加され、すべてのブロックがハッシュ値でリンクされています。

ハッシュ値は次のように計算されます:前のブロックのハッシュ + このブロックのデータ = このブロックのハッシュ。取引を記録するために使用される各ブロックは、ハッシュ値でリンクされていると考えることができます。これがブロックチェーンと呼ばれる理由です

この計算方法では、ハッシュの値は前のハッシュの具体的な値に依存します。

共通の認識は、ハッシュアルゴリズムの入力値がわずかに変更されただけでも、最終的に計算される値は完全に異なるということです。

したがって、最初のブロックを変更しようとすると、全体のハッシュ値が大きく変化します。次のブロックに対応するハッシュ値は完全に一致しなくなります。最初のブロックを成功裏に改ざんするためには、次のブロックを再計算する必要があります。これを繰り返す必要があります。歴史を削除したり変更したりしたい場合は、すべてのブロックのデータを更新する必要があります。

新しいブロックが追加されるたびに、前のすべてのブロックの変更不可能性が強化され、時間の順序が保証されます

「プルーフ・オブ・ワーク」#

BTC の作業証明メカニズム。各マイナーは、新しいブロックに書き込む権利を得るために相当な計算力を費やしています。作業証明を提供した後、ノード(マイナー)は新しいブロックに内容を書き込む権利を得ます。

作業証明をどのように提供するか?BTC は次のように設計されています:

各ブロックは次の部分で構成されています:

  • 前のブロックのハッシュ値(prev hash)
  • 現在のブロックのすべての取引データ(実際には Merkle Root を保存する必要があります)
  • タイムスタンプ
  • 難易度目標(作業証明でハッシュ値に必要な先頭の 0 の数を決定します)
  • ランダム数(nonce)

ここで、マイナーが唯一知らない内容は「ランダム数(nonce)」です。この nonce 値がいわゆる「作業証明」です。

「プルーフ・オブ・ワーク」では、マイナーは次のような数学の問題を解決する必要があります:ランダム数以外のすべての内容から計算されたハッシュ値がわかっている場合、nonce がいくつのときにハッシュ値の先頭 n 桁が 0 になり、残りの数字が以前のハッシュ値になるかを計算してください。n の具体的な桁数は、難易度目標によって決まります。

難易度目標がどのように生成されるかについては、資料を調べましたが、まだ理解できていません。ただ、この難易度目標はネットワークの現在のブロック生成の難易度に基づいて動的に調整されることだけは知っています。

nonce の値がコンピュータによって計算されると、これはノードの「作業証明」として使用でき、ノードは新しいブロックに書き込む権利を証明します。ブロックに書き込んだ後、すべてのノードにブロードキャストします。nonce の値を計算することは非常に困難ですが、この値が正しいかどうかを検証するのは非常に簡単です。他のノードは、代入して期待通りの値と等しいかどうかを計算するだけで検証できます。

nonce を計算することはコンピュータにとって簡単なことではなく、結果を計算するためには相当な計算力が必要です。したがって、前述の「タイムスタンプサーバー」と組み合わせると、誰かがブロックを変更したい場合、この nonce の計算は避けられません。

ブロックの歴史を変更したい場合は、関係するすべてのブロックの nonce を計算するために相当な計算力を準備する必要があります。時間が経つにつれて、難易度目標はますます高くなり、後続の計算の難易度も高くなり、ブロックが増えるほど、歴史を改ざんすることがますます難しくなります。

「ネットワーク」#

  1. 新しい取引がすべてのノードにブロードキャストされます。

  2. 各ノードは新しい取引をブロックに集めます。

  3. 各ノードは自分のブロックのために難しい作業証明を見つけるために作業します。

  4. ノードが作業証明を見つけると、そのブロックをすべてのノードにブロードキャストします。

  5. ノードは、ブロック内のすべての取引が有効であり、すでに使用されていない場合にのみ、そのブロックを受け入れます。

  6. ノードは、受け入れたブロックのハッシュを前のハッシュとして使用して、チェーン内の次のブロックを作成することで、そのブロックの受け入れを示します。

  7. 新しい取引がすべてのノードにブロードキャストされます。

  8. 各ノードは新しい取引をブロックに集めます。

  9. 各ノードは自分のブロックのために難しい作業証明を見つけるために作業します。

  10. あるノードが作業証明を見つけると、そのブロックをすべてのノードにブロードキャストします。

  11. ノードは、ブロック内のすべての取引が有効であり、未使用である場合にのみ、そのブロックを受け入れます。

  12. ノードは、受け入れたブロックのハッシュを前のハッシュとして使用して、次のブロックを作成することで、そのブロックの受け入れを示します。

ノードは常に最長のチェーンを正しいものと見なし、それを拡張するために作業を続けます。もし 2 つのノードが次のブロックの異なるバージョンを同時にブロードキャストした場合、一部のノードは最初に 1 つまたはもう 1 つを受け取るかもしれません。その場合、彼らは最初に受け取ったものに取り組みますが、もう 1 つのブランチを保存しておき、長くなる場合に備えます。次の作業証明が見つかり、1 つのブランチが長くなると、引き分けが解消されます。別のブランチに取り組んでいたノードは、その後、長い方に切り替えます。

ノードは常に最長のチェーンを正しいものと見なし、それを拡張するために作業を続けます。もし 2 つのノードが次のブロックの異なるバージョンを同時にブロードキャストした場合、一部のノードは最初に 1 つまたはもう 1 つを受け取るかもしれません。その場合、彼らは最初に受け取ったものに取り組みますが、もう 1 つのブランチを保存しておき、長くなる場合に備えます。次の作業証明が見つかり、1 つのブランチが長くなると、引き分けが解消されます。別のブランチに取り組んでいたノードは、その後、長い方に切り替えます。

以上の点を考慮すると、二重送信の問題は解決されます。

  • もし私が同時に 2 つの取引を開始して二重送信を試みた場合、作業証明 + タイムスタンプサービスの設計により、取引は時間の順序を形成し、すべてのノードにブロードキャストされます。順序が二重送信の完了を不可能にします。
  • もし私が異なる地理的位置から二重送信を試みた場合、作業証明の難易度により、ノードが同時に 2 つの取引を完了することは非常に困難です。
  • たとえ本当に 2 つの異なる場所にいるノードが同時にこれらの取引をブロックに書き込んだとしても、BTC はフォークを発生させ、フォークが長い方が短い方を置き換えます。これにより、2 つの取引のうち 1 つだけが成功することが保証されます。

まとめ#

二重支払いの問題は、同じビットコインが 2 回支払われることを指します。ビットコインは作業証明と最長チェーンの原則を通じてこの問題を解決します。新しい取引がネットワークにブロードキャストされると、マイナーはそれをブロックにパッケージ化し、作業証明を通じて難易度要件を満たすハッシュ値を見つけ、ブロックをブロックチェーンに追加します。

もし 2 つの取引が同じ UTXO を消費しようとした場合、最初にブロックに含まれる取引だけが有効であり、もう 1 つの取引は UTXO がすでに消費されているため無効になります。最長チェーンの原則は、ネットワーク全体が合意に達することを保証し、二重支払いを防ぎます。

マークルツリー#

前述のマークルツリーについて。ディスクスペースを節約する必要がある場合、ノードのブロックストレージは具体的なデータを保存する必要はありません。ブロック内のすべての取引のハッシュをマークルツリーの形式で 2 つずつ計算してルートハッシュを得るだけで、データを保存する必要はなく、ルートハッシュを使用してデータが一致するかどうかを検証できます。

たとえ私たちがブロック上の特定の取引を検証したい場合でも、このブロックヘッダーを持ってネットワークノード上の他のデータを保存しているノードを探し、彼のデータ上で最長チェーンノードに対応するデータを見つけることで、自分の取引を検証できます。

最初の BTC はどこから来たのか?#

特別なブロックが 1 つあります。それは、他のどのブロックともリンクされていないハッシュを持つ創世ブロックです。この創世ブロックの中で最初の BTC が誕生し、50 BTC が存在します。

以前に述べた「作業証明」では、各マイナーはブロックに書き込む権利を得るために全力で計算を行います。

まず、PoW を求めたマイナーは、ブロック報酬を得ます。最初は 1 ブロックあたり 50 BTC の報酬があり、その後 4 年ごとに半減します。2100 万 BTC が掘り出されるまで続きます。これがマイニングの由来であり、BTC の主要な供給源です。

ビットコインのブロック報酬は約 210,000 ブロックごと(約 4 年ごと)に半減します。この設計は、ビットコインの総供給量を制御するためのものです。

  • 第一次半減(2012 年):報酬が 50 ビットコインから 25 ビットコインに減少。
  • 第二次半減(2016 年):報酬が 25 ビットコインから 12.5 ビットコインに減少。
  • 第三次半減(2020 年):報酬が 12.5 ビットコインから 6.25 ビットコインに減少。
  • 将来の半減も続き、すべての 2100 万ビットコインが掘り出されるまで続きます。

次に、PoW を求めたマイナーは、各取引のガスを受け取る権利も持っています。マイナーの主な収入源はマイニングとガスです。

ウォレットについて#

実際には、ウォレットに保存されているのはビットコインではなく、ビットコインの取引記録(UTXO)です。自分のアドレスにいくらあるかを知りたい場合、実際にはブロックチェーン全体を遍歴し、自分に関連するすべての UTXO を見つけてデータを合計する必要があります。

この操作はかなり遅いように聞こえますが、実際の操作では、大部分のウォレットソフトウェアがメモリとインデックスを利用していくつかの最適化を行い、クエリ速度を向上させています。具体的な実装方法には、ブルームフィルター、アドレスインデックスなどの技術が含まれます。

1 つのブロックには実際に複数の取引があるのか?#

その通りです。

取引はすぐにブロックに書き込まれるわけではなく、受信されてブロードキャストされた後、最初にメモリプール(mempool)に置かれます。

その後、マイナーはメモリプールから取引を選択してパッケージ化し、ハッシュを計算し、作業証明(Proof-of-Work)を得るために nonce 値を計算し始めます。

マイナーが望み通りに nonce 値を見つけた場合、これらの取引は確認され、ブロックに書き込まれます。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。