doraemon

doraemon

let's go write some rusty code and revolutionize the world!

ビットコインの基本知識

参考:北京大学肖臻老师《区块链技术与应用》公开课

ビットコインにおけるハッシュ関数の三つの特性#

コリジョン耐性#

異なる二つの入力に対して、出力が等しい場合、これをハッシュ衝突と呼びます。

良いハッシュ関数はハッシュ衝突をできるだけ避け、コリジョン耐性の特性を持つべきです。

どのハッシュアルゴリズムもコリジョン耐性を証明することはできず、ハッシュ衝突は避けられません。なぜなら、入力空間は常に出力空間よりも大きいからです。

  • この特性の作用

メッセージのダイジェストを求めること。

例えば、メッセージのハッシュ値が H (m)=digest である場合、誰かが m の値を改ざんしようとしても、H (m) が変わらないようにはできません。

隠蔽性#

ハッシュ関数の計算過程は一方向であり、逆算できません。(H (x) から x を導き出すことはできません)。

隠蔽性の特性は入力空間が十分に大きく、分布が比較的均等であることが前提です。

暗号学で要求されるこの二つの特性に加えて、ビットコインで使用されるハッシュ関数には第三の特性があります。

パズルフレンドリー#

ビットコインのマイニングプロセスは、実際には nonce(number of once)を探すことです。nonce はブロックのヘッダー内の他の情報と組み合わさって入力として使用され、得られたハッシュ値は指定された目標値以下でなければなりません。H (block header)≤target。block header はブロックのヘッダーを指し、ヘッダーには多くのフィールドがあり、その中の一つが設定可能なランダム数 nonce です。マイニングプロセスは、ブロックヘッダーが指定された範囲内にハッシュされるように、ランダム数を試し続けることです。

パズルフレンドリーとは、マイニングプロセスにショートカットがないことを指します。出力値を指定された範囲に収めるためには、一つずつ試すしかないため、このプロセスは作業証明(proof of work)としても機能します。

ハッシュ値は事前に予測できません。マイニングは難しく、検証は容易です。(解決が難しいが、検証は簡単

SHA-256(セキュアハッシュアルゴリズム)#

ビットコインで使用されるハッシュ関数は SHA-256(セキュアハッシュアルゴリズム)であり、上記の三つの特性をすべて満たしています。

あるブロックチェーン取引システムが SHA256 アルゴリズムを使用している場合、$2^{256}$ 通りの出力があり、$2^{256}+1$ 回の入力を行うと必ず一度は衝突が発生します。確率的に見ても、$2^{130}$ 回の入力で $99%$ の確率で一度は衝突が発生します。

あるコンピュータが毎秒 10000 回の速度でハッシュ計算を行った場合、$2^{128}$ 回のハッシュを完了するには $10^{27}$ 年かかります。

ビットコインのアカウント#

ローカルで公開鍵と秘密鍵のペア(public key, private key)を作成することがアカウントになります。公開鍵と秘密鍵のペアは非対称暗号技術(asymmetric encryption algorithm)から来ています。

BTC 取引では秘密鍵を使用して署名し、他の人は公開鍵で署名を検証します。

公開鍵と秘密鍵を生成する際には良いランダムソース(a good source of randomness)が必要です。公開鍵と秘密鍵の生成はランダムであり、ランダムソースが不十分だと同じ公開鍵と秘密鍵が生成される可能性があります。暗号学的実装では一般的に物理的ノイズソースチップをランダムソースとして使用します。

ビットコインで使用される署名アルゴリズムは、公開鍵と秘密鍵を生成する際に良いランダムソースが必要であり、その後の各署名時にも良いランダムソースが必要です。一度でも署名に使用するランダムソースが不十分であれば、秘密鍵が漏洩する可能性があります。

ランダムに生成された一対の公開鍵と秘密鍵が同じ確率は微々たるもので、無視できるほどです。

ビットコインの重要なデータ構造#

ハッシュポインタ#

ビットコインの最も基本的な構造はブロックチェーンであり、ブロックチェーンは一つ一つのブロックから構成されるリンクリストです。ブロックチェーンと通常のリンクリストの違いは何でしょうか?

ビットコインは通常のポインタの代わりにハッシュポインタを使用しています(ブロックチェーンはハッシュポインタを使用したリンクリストです)。

ブロックチェーンの最初のブロックは創世ブロック(genesis block)と呼ばれ、最後のブロックは最近生成されたブロック(most recent block)です。各ブロックは前のブロックへのハッシュポインタを含んでいます。

この構造により、** 改ざん防止ログ(tamper-evident log)** を実現できます。もし誰かがブロックの内容を変更した場合、次のブロックのハッシュポインタは一致しなくなります。なぜなら、次のブロックのハッシュポインタは前のブロックの内容に基づいて計算されるからです。したがって、次のハッシュポインタも変更される必要があり、これが続くことで、最後に保持しているハッシュ値も変わります。したがって、最後のブロックのハッシュを記録しておけば、前のすべてのブロックが改ざんされていないことが保証されます

ポインタが保存するのはローカルメモリのアドレスであり、ローカルのコンピュータ上でのみ意味があります。他のコンピュータに送信しても意味がありません。では、ブロックを公開する際にハッシュポインタはどのようにネットワークを通じて伝送されるのでしょうか?

ハッシュポインタとは、実際のシステムで使用される際の比喩的な表現に過ぎません。実際にはハッシュだけがあり、ポインタはありません

マークルツリー#

ブロックヘッダー(block header)にはマークルツリーの根ハッシュ(root hash)が含まれています。マークルツリーの根ハッシュ値を記憶しておくだけで、ツリー内の任意の部分の変更を検出できます

取引がマークルツリー内のどこにあるかを見つける(すべての取引は葉ノードにあります)と、そのブロックは根ノードまでのパスをたどることを「マークル証明(merkle proof)」と呼びます。

軽ノードはブロックヘッダーのみを保存します。軽ノードが特定の取引がマークルツリーに含まれているかどうかを知りたい場合、全ノードにリクエストを送信し、その取引が含まれていることを証明するマークル証明を要求します。これには軽ノードが必要とするハッシュが含まれ、軽ノードは自分のローカルで検証します。

マークル証明は何を証明できますか?特定の取引が指定されたブロックに含まれているかどうかを証明します。

例えば、軽ノードが全ノードに「この取引はこのブロックにありますか?」と尋ねると、全ノードは証明としてマークル証明を返します。軽ノードはそれが真実かどうかを検証できます。

マークルツリーバイナリツリーの違い:通常のポインタの代わりにハッシュポインタを使用しています

中央集権的なデジタル通貨が解決すべき問題#

中央集権的でないデジタル通貨は、二つの問題を解決する必要があります。

  • 一つ目の問題は、誰が通貨を発行する権利を持つのか?
  • 二つ目の問題は、取引の合法性をどうやって検証するのか?

二重支払い問題(double spending)#

二重支払いとは、一つの金銭が二回支払われることを指します。中央集権的な帳簿は二重支払い攻撃を簡単に解決できますが、中央集権的でない解決策は帳簿の正確性を維持するためのデータ構造を必要とします。このデータ構造がブロックチェーンです。

ビットコインシステムでは、各取引が入力と出力の二つの部分を含んでいます。入力部分はコインの出所を示し、出力部分は受取人の公開鍵のハッシュを示します。

A が B に送金するために必要な情報:A の秘密鍵の署名と B のアドレス(B の受取アドレスは公開鍵から推算されます)。

この部分には二つのハッシュポインタがあります。一つ目は各ブロックを接続してリンクリストを構成し、取引の詳細には二つ目のハッシュポインタが前の取引を指しています。これはコインの出所を示すためです(ダブルスパンドを防ぐため)。

分散型合意(distributed consensus)#

各アカウントが取引を発行できるため、この取引はすべてのノードにブロードキャストされます。いくつかの取引は合法であり、いくつかの取引は違法である可能性があります。では、どの取引が次のブロックに書き込まれるべきか、どのような順序で書き込まれるべきかを決定するのは誰でしょうか?

分散型合意の簡単な例は分散ハッシュテーブル(distributed hash table)です。たとえば、システム内に多くのマシンがあり、共同でグローバルなハッシュテーブルを維持しています。

ここで合意を得るべき内容は何でしょうか?ハッシュテーブルに含まれるキーと値のペアです。誰かが自分のコンピュータにキーと値のペアを挿入したとします。'xiao' というペアが 12345 に対応している場合、他の人が別のコンピュータで読み取るときにもそれを読み取れる必要があります。これがグローバルなハッシュテーブルと呼ばれます。

不可能性の結論(impossibility result)#

分散システムに関する多くの ** 不可能性の結論(impossibility result)があり、その中で最も有名なのがFLP 不可能性の結論(FLP impossibility result)** です。この三つの文字は三人の専門家の名前の頭文字を取ったもので、非同期(asynchronous)システムでは、(ネットワーク伝送の遅延に上限がないというのが非同期システムです)たとえ一人のメンバーが問題を抱えていても、合意を得ることは不可能です。

CAP 定理(CAP Theorem)#

もう一つの有名な結論は **CAP 定理(CAP Theorem)** です。これは分散システムにおいて、Consistency(一貫性)Availability(可用性)、**Partition tolerance(分割耐性)** の三つを同時に満たすことはできないというものです。

ブロックチェーンの不可能三角#

ブロックチェーンの ** 不可能三角(blockchain trilemma)** は、イーサリアムの創設者である Vitalik によって提唱されました。

これはブロックチェーン技術が去中心化性、安全性、高効率を同時に実現できないことを示しています。

  • 去中心化(Decentralization)
  • 可拡張性(Scalability)
  • 安全性(Security)

POW - ビットコインにおける合意プロトコル(consensus in BitCoin)#

投票に基づく合意策#

一部のノードは悪意を持っている可能性があります。システム内の大多数のノードが良好であると仮定した場合、どのように合意プロトコルを設計すればよいでしょうか?

一つの策は投票です。投票に基づく合意策では、まず誰が投票権を持つかを決定する必要があります。メンバーシップの問題があります。このブロックチェーンのメンバーシップは厳密に定義されている必要があります。たとえば、誰でも参加できるわけではなくコンソーシアムチェーンの Hyperledger Fabric のように、特定の条件を満たす大企業のみが参加できる場合です。このような場合、投票に基づく策は実行可能です。私たちは大多数のメンバーが良好であると仮定しているので、投票は実行可能です

公共のチェーンでは、単純な直接投票は機能しません。

ビットコインシステムはそのようなものではありません。ビットコインシステムでは、アカウントを作成するのは非常に簡単です。あなたはローカルで公開鍵と秘密鍵を生成し、アカウントは誰の承認も必要ありません。他の人は外部で取引が発生するまで、そのアカウントの存在を知ることはありません。もし悪意のあるノードがあれば、スーパーコンピュータを一台用意し、他のことは何もせずに様々なアカウントを生成し続け、生成したアカウントが全体の半数を超えれば、制御権を持ち、投票結果を操作することができます。これを ** シビル攻撃(sybil attack)** と呼びます。

ビットコインシステムでは、この問題を解決するために非常に巧妙なメカニズムを使用しています。それも投票ですが、アカウントの数に基づいて投票するのではなく、計算能力で投票します

記帳権#

各ノードはローカルで候補ブロックを組み立て、合法と考える取引をそのブロックに入れ、様々なランダム数 nonce(number of once)値を試し始めます。もしあるノードが要求を満たす nonce(4 バイト)を見つけた場合、H (block header)≤target の条件を満たすと、記帳権を得たとみなします

H(blockheader)targetH( block header )≤target

記帳権とは、ビットコインという去中心化された帳簿に次のブロックを書き込む権利を指します。nonce を見つけて記帳権を得たノードだけが次のブロックを発表する権利を持ちます。

ブロックの合法性を検証する#

他のノードがこのブロックを受け取った後、そのブロックの合法性を検証する必要があります。

例えば、まずこのブロックヘッダーの内容が正しいかどうかを確認します。ブロックヘッダーには nBits というフィールドがあります。実際にはこれは目標値のエンコーディングであり、nBits フィールドがビットコインプロトコルで規定された難易度要件に合致しているかどうかを確認します。そして、この nonce が不等式 H (block header)≤target を満たしているかどうかを確認します。

言い換えれば、あなたがブロックを発表する際、本当にブロックを発表する権利があるのか?本当に記帳権を得たのか?すべての要件を満たしていると仮定し、次にブロックボディ内の取引リストを確認し、各取引が合法であるかどうかを検証します。まず、合法的な署名が必要です。次に、使用されたコインが以前に使われていないことを確認します。一つでも要件を満たさない場合、そのブロックは受け入れられません

分岐攻撃(forking attack)#

すべての条件が満たされていても、そのブロックが受け入れられない場合もあります

どのような場合に条件がすべて満たされていても受け入れられないのでしょうか?ブロック内の取引が合法であっても、それが ** 最長合法チェーン(longest valid chain)上にない場合です。これを分岐攻撃(forking attack)** と呼びます。

分岐攻撃はブロックチェーンの中間位置にブロックを挿入することで、既に発生した取引を巻き戻すことができます

ブロックチェーンは通常の状況でも分岐が発生する可能性があります。もし二つのノードが同時に記帳権を得た場合、各ノードはローカルで自分が適切だと思うブロックを組み立て、様々な nonce を試します。もし二つのノードがほぼ同時に要求を満たす nonce を見つけた場合、両方のブロックを発表することができ、二つの同じ長さの分岐が発生します。これらはどちらも最長合法チェーンです。

では、どちらを受け入れるべきでしょうか?ビットコインプロトコルでは、デフォルトで各ノードは最初に受け取ったブロックを受け入れます。したがって、異なるノードはネットワーク上の位置によって異なり、あるノードは新しく生成されたブロックの一つを最初に聞いた場合、そのブロックを受け入れます。他のノードは別のブロックを最初に聞いた場合、そのブロックを受け入れます。

どのブロックが受け入れられるかを判断するには?ビットコインプロトコルでは、** 暗黙の委任(implicit consign)** を使用します。このブロックを基にさらに拡張していくと、その発表されたブロックが認められたことになります。たとえば、新しく生成されたブロックの後に別のブロックが拡張されると、その新しいブロックが認められたことを示します。

では、同時に新しいブロックが生成された二つのチェーンはその後どのように発展するのでしょうか? 同じ長さの一時的な分岐はしばらく維持され、どちらかの分岐が勝利します。つまり、どちらかのチェーンが新しいブロックを生成することで最長合法チェーンとなります。もう一方は無効となり、** 孤児ブロック(orphan block)** と呼ばれます。この二つの新しいブロックはそれぞれ引き寄せ合う可能性があり、どちらのブロックチェーンがより強力な計算能力を持つか、時には運が良いかによって勝利します。

ビットコインシステムにおける合意メカニズムが得るべき合意とは#

分散ハッシュテーブルの例を挙げると、分散システムには多くのサーバーがあり、これらのサーバー間で得るべき合意は何でしょうか?ハッシュテーブルの内容、すなわちどのキーと値のペアが含まれているかです。

ビットコインの去中心化された帳簿の内容が得るべき合意であり、記帳権を得たノードだけがそこに書き込むことができます。

なぜ皆が記帳権を争うのか#

なぜ皆が記帳権を争うのでしょうか?まず、記帳権を持つノード自体には一定の権限があり、どの取引が次のブロックに書き込まれるかを決定できます

しかし、私たちがこのプロトコルを設計する際には、これが記帳権を争う主要な動機にならないようにすべきです。なぜなら、合法的な取引はすべてブロックチェーンに書き込まれるべきだからです。これにより、** ブロック報酬(block reward)取引手数料(transaction fee)** が導入されます。

誰が通貨の発行を決定するのか#

** コインベース取引(coinbase transaction)** はビットコインシステムで新しいビットコインを発行する唯一の方法であり、この取引はコインの出所を示す必要がありません。その後の取引はビットコインの移転に基づいています。

ビットコインの記帳権を争うプロセスはマイニングと呼ばれます。したがって、記帳権を争うノードはマイナーと呼ばれます。もし彼が記帳権を得た場合、私たちは彼がマイニングを行った、またはブロックを掘ったと言います。

どうやって記帳権を得るのか(POW 作業証明)#

様々なランダム数 nonce を試してパズルを解くことによって

ビットコインの合意メカニズムは計算能力で投票します。ビットコインのハッシュ関数の三つの特性の中で、パズルフレンドリーという特性は、パズルを解く過程にショートカットがないことを保証し、一つずつ nonce を試すしかありません。

したがって、あるノードの計算能力が別のノードの 10 倍であれば、記帳権を得る確率もそのノードの 10 倍になります。計算能力で投票することがビットコインにおける投票の特異性です。それは一人一票でもなく、一台のコンピュータ一票でもなく、あなたが一秒間に試すことができる nonce の数に依存します。これを時には ** ハッシュレート(hash rate)** と呼びます。このハッシュレートが投票の重みを決定します。あなたのノードのハッシュレートが高ければ高いほど、記帳権を得てブロック報酬を得る確率も高くなります。

ビットコインではPOW 作業証明がシビル攻撃を防ぎます。計算能力で投票し、アカウントをいくら作成しても、計算能力を強化することはできません。

ビットコインがパズルを解く過程は、計算能力を競うこと以外に実際的な意味はありません。ビットコインがますます掘りにくくなっているのは、ブロック報酬が人為的に減少しているためであり、ビットコインの希少性は人為的に作られています。パズルを解くこと自体には実際的な意味はありませんが、マイニングプロセスはビットコインシステムの安全性を維持するために非常に重要です。** ビットコインはマイニングによって保護されています。** マイニングは計算能力で投票する有効な手段を提供し、誠実な人々の手に大部分の計算能力が保持されていれば、システムの安全性が保証されます。

マイニング中にマイナーが答えを盗むことはあるか#

ありません。発表されたブロックにはコインベース取引があり、その中にはマイニングを行ったマイナーのアドレスが含まれています。もし A がマイニングを行った場合、その中には A の受取アドレスが含まれています。もし答えを盗む場合、A のアドレスを自分のアドレスに変更する必要がありますが、アドレスが一変すれば、コインベース取引の内容も変わります。

これにより、マークルツリーの根ハッシュ値が変わります。なぜなら、この取引とブロックに含まれる他の取引は一緒にマークルツリーを構成しているからです。どこか一つが変更されれば、根ハッシュ値も変わります。そして nonce はブロックヘッダー内にあり、根ハッシュ値もブロックヘッダー内にあります。ブロックヘッダーの内容が変更されれば、元々見つけた nonce は無効になります。したがって、答えを盗むことは不可能です。なぜなら、各マイナーが見つけた nonce は彼自身の受取アドレスにバインドされているからです。

ベルヌーイ試験(Bernoulli trial)#

ベルヌーイ試験:二項結果を持つランダム実験。

** ベルヌーイ試験(Bernoulli trial)** は、二つの可能な結果を持つ単一のランダム試験です。

ベルヌーイ過程

ベルヌーイ過程(Bernoulli process):独立したベルヌーイ試験の系列。

マイニングプロセスで毎回 nonce を試すことは、ベルヌーイ試験の一つと見なすことができます。各ランダムなベルヌーイ試験はベルヌーイ過程を構成します。

その一つの特性は:無記憶性です。ベルヌーイ過程の一つの特性は ** 無記憶性(memoryless)** であり、大量の試験を行うと、前の結果は後の結果に影響を与えません

各 nonce を試す成功確率は非常に小さく、大量の試験を行う必要があります。この時、ポアソン過程を用いてベルヌーイ過程を代替することができます。

プログレスフリー - マイニングの公平性の保証#

私たちが本当に関心を持っているのは、システムの出力時間です。確率論では、ブロック時間が指数分布に従うことを導出できます(exponential distribution)。

システム全体の平均出力時間は 10 分であり、これはビットコインプロトコルが定期的にマイニングの難易度を調整し、平均出力時間を約 10 分に維持するために設計されています。各マイナーに具体的に言えば、次のブロックを掘ることができる時間は、マイナーの計算能力がシステム全体の計算能力に占める割合によって決まります。

指数分布も無記憶性を持ち、マイニングの公平性を保証します

指数分布の無記憶性は、確率分布曲線の特性によるもので、どこから切り取っても、残りの部分の曲線は元のものと同じです。例えば、すでに 10 分待っても誰も合法的なブロックを見つけていない場合、まだどれくらい待つ必要があるのか?それでも確率密度関数の分布を参考にすると、平均してまだ 10 分待つ必要があります。将来どれくらいの時間を掘る必要があるかは、過去にどれだけ掘ったかとは関係ありません。このプロセスは ** プログレスフリー(progress free)** とも呼ばれます。

座標軸を描くことができ、縦軸は確率密度を示し、横軸は出力時間を示します(システム全体の出力時間であり、各マイナーの出力時間ではありません)。各マイナーに具体的に言えば、次のブロックを掘ることができる時間は、マイナーの計算能力がシステム全体の計算能力に占める割合によって決まります。もし一人の計算能力がシステム全体の 1% を占めている場合、システムが 100 個のブロックを出力すると、その中の 1 個はその人が掘ったものになります。

もしプログレスフリーがなければ、どのような現象が起こるのでしょうか? 計算能力の強いマイナーは不釣り合いな利点を持つことになります。なぜなら、計算能力の強いマイナーは過去に多くの作業を行っており、過去に試みた多くの失敗した nonce の後、次の nonce が成功する確率が増加するからです。したがって、プログレスフリーはマイニングの公平性を保証します。

どれだけのコインを無から生み出せるか#

最初の頃、ビットコインが立ち上がったとき、発表された各ブロックは 50 ビットコインのブロック報酬を生成することができました。

ビットコインシステムでは、約 10 分ごとに 1 つのブロックが生成され、ビットコインプロトコルでは、21 万ブロック後にブロック報酬が半減することが規定されています。これにより、25BTC に減少し、さらに 21 万ブロック後に再び半減します。

ブロック報酬は約 4 年ごとに半減し、これにより生成されるビットコインの数量は ** 幾何級数(geometric series)** を構成します。

21000050(1+12+14+...)210000 * 50 (1+\frac{1}{2}+\frac{1}{4}+...)

この計算によれば、最大で 2100 万枚のビットコインが存在します。

2022 年までに、ビットコインマイナーは各ブロックを成功裏に採掘するごとに 6.25 ビットコインを獲得します。

ビットコインの安全性分析#

前提として、大部分の計算能力が誠実な人々の手にあると仮定します。マイニングが提供するのは確率的な保証であり、次のブロックが誠実なマイナーによって発表される確率が高いと言えますが、記帳権が悪意のある人の手に落ちないことを保証することはできません

もし悪意のあるノードが記帳権を得た場合、彼が行う可能性のあることは:

1. 不正な取引を偽造する#

例えば、他人の口座からお金を自分の口座に移すことですが、他人の秘密鍵を知らないため、不正です。したがって、他の誠実なノードはそのブロックを認めません。なぜなら、不正な取引が含まれているからです。そのため、前のブロックに基づいて拡張し続けることになります。最長合法チェーンに従って、そのブロックはブロック報酬を得ることができず、逆に大量の電力や人力を浪費し、最終的にはブロック報酬を得ることができません。

2. 二重支払い#

支出したお金を再度支出することです。例えば、M が A に送金し、M が別の取引を発表してそのお金を自分に戻す(または他の人に戻す)。この時、二つの状況があります。

  1. 新しいブロックがブロックチェーンに書き込まれた場合 - 分岐攻撃で取引を巻き戻す

悪意のあるノードはブロックチェーンを分岐させ、以前のブロックから新しいチェーンを分岐させる必要があります。この場合、攻撃の難易度は非常に高いです。悪意のあるノードが一度記帳権を得たとしても、誠実なノードは最長合法チェーンしか認めません。詳細は自己中心的マイニング(selfish mining)を参照してください。

この攻撃を防ぐためには、いくつかのブロックの確認を待つ必要があります。デフォルトでは 6 つの確認が必要です。この時、前の取引は改ざんできないと見なされ、待機時間は約1 時間程度です。

  1. 取引が書き込まれていないブロックチェーンにおいて - 短時間で複数の取引を発起する

この状況は ** ゼロ確認(zero confirmation)** と呼ばれ、実際のアプリケーションで非常に一般的です。

各取引にはタイムスタンプが含まれています。ビットコインプロトコルでは、デフォルトで各ノードは最初に受け取った取引を受け入れます。もし正しい取引が最初に受け入れられ、後に発起された重複取引が受け入れられなければ、受取人はこの取引を直接拒否することができます。

実際には、一定のリスクが依然として存在します。悪意のある攻撃者のノードが非常に小さな確率で記帳権を得る可能性があるため、絶対的な安全を確保するには 6 つの確認を待つ必要があります(1 時間)。

3. 合法的な取引を書き込まない#

問題はありません。合法的な取引は次のブロックに書き込まれることができます。常に誠実なノードが合法的な取引を書き込むことができます

通常、合法的な取引がブロックに書き込まれないこともあります。なぜなら、ある期間に取引数が多すぎる可能性があるからです。ビットコインプロトコルでは、各ブロックのサイズに制限があり、ブロックサイズは 1M バイトを超えてはなりません。したがって、取引が多すぎる場合、一部の取引は次のブロックの発表を待たなければなりません

4. 自己中心的マイニング(selfish mining)(51% 攻撃に類似)#

通常、ブロックを掘った場合はすぐに発表し、他の人が掘った場合に自分のブロックが無効にならないようにします。しかし、自己中心的マイニングでは、悪意のあるノードがブロックを掘った後、発表せずにチェーンを隠します。最長合法チェーンが生成されるまで待ってから発表します。

これは分岐攻撃の一手段ですが、悪意のあるノードは通常 51% 以上の計算能力を必要とし、実現が難しいです

もし単に通常のブロック報酬を多く得ようとする場合、最初に掘ったブロックを発表せず、他の人が次のブロックを掘るのを待ち、すでに掘ったブロックを使って競争を減らすことができます。もし自分が二つ目のブロックを掘った場合、他の人が最初のブロックを掘ったと宣言した後、自分が持っている二つを一緒に発表し、最長合法チェーンとなることが理論的には可能です。しかし、この方法はリスクが高く、他の人が最初のブロックを掘ったときに自分が二つ目を掘ることができなければ、同じ長さのチェーンになり、競争することになります。この場合、最初のブロックの報酬を無駄にする可能性があります

ビットコインシステムにおける合意メカニズムが得るべき合意とは#

分散ハッシュテーブルの例を挙げると、分散システムには多くのサーバーがあり、これらのサーバー間で得るべき合意は何でしょうか?ハッシュテーブルの内容、すなわちどのキーと値のペアが含まれているかです。

ビットコインの去中心化された帳簿の内容が得るべき合意であり、記帳権を得たノードだけがそこに書き込むことができます。

なぜ皆が記帳権を争うのか#

なぜ皆が記帳権を争うのでしょうか?まず、記帳権を持つノード自体には一定の権限があり、どの取引が次のブロックに書き込まれるかを決定できます

しかし、私たちがこのプロトコルを設計する際には、これが記帳権を争う主要な動機にならないようにすべきです。なぜなら、合法的な取引はすべてブロックチェーンに書き込まれるべきだからです。これにより、** ブロック報酬(block reward)取引手数料(transaction fee)** が導入されます。

誰が通貨の発行を決定するのか#

** コインベース取引(coinbase transaction)** はビットコインシステムで新しいビットコインを発行する唯一の方法であり、この取引はコインの出所を示す必要がありません。その後の取引はビットコインの移転に基づいています。

ビットコインの記帳権を争うプロセスはマイニングと呼ばれます。したがって、記帳権を争うノードはマイナーと呼ばれます。もし彼が記帳権を得た場合、私たちは彼がマイニングを行った、またはブロックを掘ったと言います。

どうやって記帳権を得るのか(POW 作業証明)#

様々なランダム数 nonce を試してパズルを解くことによって

ビットコインの合意メカニズムは計算能力で投票します。ビットコインのハッシュ関数の三つの特性の中で、パズルフレンドリーという特性は、パズルを解く過程にショートカットがないことを保証し、一つずつ nonce を試すしかありません。

したがって、あるノードの計算能力が別のノードの 10 倍であれば、記帳権を得る確率もそのノードの 10 倍になります。計算能力で投票することがビットコインにおける投票の特異性です。それは一人一票でもなく、一台のコンピュータ一票でもなく、あなたが一秒間に試すことができる nonce の数に依存します。これを時には ** ハッシュレート(hash rate)** と呼びます。このハッシュレートが投票の重みを決定します。あなたのノードのハッシュレートが高ければ高いほど、記帳権を得てブロック報酬を得る確率も高くなります。

ビットコインではPOW 作業証明がシビル攻撃を防ぎます。計算能力で投票し、アカウントをいくら作成しても、計算能力を強化することはできません。

ビットコインがパズルを解く過程は、計算能力を競うこと以外に実際的な意味はありません。ビットコインがますます掘りにくくなっているのは、ブロック報酬が人為的に減少しているためであり、ビットコインの希少性は人為的に作られています。パズルを解くこと自体には実際的な意味はありませんが、マイニングプロセスはビットコインシステムの安全性を維持するために非常に重要です。** ビットコインはマイニングによって保護されています。** マイニングは計算能力で投票する有効な手段を提供し、誠実な人々の手に大部分の計算能力が保持されていれば、システムの安全性が保証されます。

マイニング中にマイナーが答えを盗むことはあるか#

ありません。発表されたブロックにはコインベース取引があり、その中にはマイニングを行ったマイナーのアドレスが含まれています。もし A がマイニングを行った場合、その中には A の受取アドレスが含まれています。もし答えを盗む場合、A のアドレスを自分のアドレスに変更する必要がありますが、アドレスが一変すれば、コインベース取引の内容も変わります。

これにより、マークルツリーの根ハッシュ値が変わります。なぜなら、この取引とブロックに含まれる他の取引は一緒にマークルツリーを構成しているからです。どこか一つが変更されれば、根ハッシュ値も変わります。そして nonce はブロックヘッダー内にあり、根ハッシュ値もブロックヘッダー内にあります。ブロックヘッダーの内容が変更されれば、元々見つけた nonce は無効になります。したがって、答えを盗むことは不可能です。なぜなら、各マイナーが見つけた nonce は彼自身の受取アドレスにバインドされているからです。

ベルヌーイ試験(Bernoulli trial)#

ベルヌーイ試験:二項結果を持つランダム実験。

** ベルヌーイ試験(Bernoulli trial)** は、二つの可能な結果を持つ単一のランダム試験です。

ベルヌーイ過程

ベルヌーイ過程(Bernoulli process):独立したベルヌーイ試験の系列。

マイニングプロセスで毎回 nonce を試すことは、ベルヌーイ試験の一つと見なすことができます。各ランダムなベルヌーイ試験はベルヌーイ過程を構成します。

その一つの特性は:無記憶性です。ベルヌーイ過程の一つの特性は ** 無記憶性(memoryless)** であり、大量の試験を行うと、前の結果は後の結果に影響を与えません

各 nonce を試す成功確率は非常に小さく、大量の試験を行う必要があります。この時、ポアソン過程を用いてベルヌーイ過程を代替することができます。

プログレスフリー - マイニングの公平性の保証#

私たちが本当に関心を持っているのは、システムの出力時間です。確率論では、ブロック時間が指数分布に従うことを導出できます(exponential distribution)。

システム全体の平均出力時間は 10 分であり、これはビットコインプロトコルが定期的にマイニングの難易度を調整し、平均出力時間を約 10 分に維持するために設計されています。各マイナーに具体的に言えば、次のブロックを掘ることができる時間は、マイナーの計算能力がシステム全体の計算能力に占める割合によって決まります。

指数分布も無記憶性を持ち、マイニングの公平性を保証します

指数分布の無記憶性は、確率分布曲線の特性によるもので、どこから切り取っても、残りの部分の曲線は元のものと同じです。例えば、すでに 10 分待っても誰も合法的なブロックを見つけていない場合、まだどれくらい待つ必要があるのか?それでも確率密度関数の分布を参考にすると、平均してまだ 10 分待つ必要があります。将来どれくらいの時間を掘る必要があるかは、過去にどれだけ掘ったかとは関係ありません。このプロセスは ** プログレスフリー(progress free)** とも呼ばれます。

座標軸を描くことができ、縦軸は確率密度を示し、横軸は出力時間を示します(システム全体の出力時間であり、各マイナーの出力時間ではありません)。各マイナーに具体的に言えば、次のブロックを掘ることができる時間は、マイナーの計算能力がシステム全体の計算能力に占める割合によって決まります。もし一人の計算能力がシステム全体の 1% を占めている場合、システムが 100 個のブロックを出力すると、その中の 1 個はその人が掘ったものになります。

もしプログレスフリーがなければ、どのような現象が起こるのでしょうか? 計算能力の強いマイナーは不釣り合いな利点を持つことになります。なぜなら、計算能力の強いマイナーは過去に多くの作業を行っており、過去に試みた多くの失敗した nonce の後、次の nonce が成功する確率が増加するからです。したがって、プログレスフリーはマイニングの公平性を保証します。

どれだけのコインを無から生み出せるか#

最初の頃、ビットコインが立ち上がったとき、発表された各ブロックは 50 ビットコインのブロック報酬を生成することができました。

ビットコインシステムでは、約 10 分ごとに 1 つのブロックが生成され、ビットコインプロトコルでは、21 万ブロック後にブロック報酬が半減することが規定されています。これにより、25BTC に減少し、さらに 21 万ブロック後に再び半減します。

ブロック報酬は約 4 年ごとに半減し、これにより生成されるビットコインの数量は ** 幾何級数(geometric series)** を構成します。

21000050(1+12+14+...)210000 * 50 (1+\frac{1}{2}+\frac{1}{4}+...)

この計算によれば、最大で 2100 万枚のビットコインが存在します。

2022 年までに、ビットコインマイナーは各ブロックを成功裏に採掘するごとに 6.25 ビットコインを獲得します。

ビットコインの安全性分析#

前提として、大部分の計算能力が誠実な人々の手にあると仮定します。マイニングが提供するのは確率的な保証であり、次のブロックが誠実なマイナーによって発表される確率が高いと言えますが、記帳権が悪意のある人の手に落ちないことを保証することはできません

もし悪意のあるノードが記帳権を得た場合、彼が行う可能性のあることは:

1. 不正な取引を偽造する#

例えば、他人の口座からお金を自分の口座に移すことですが、他人の秘密鍵を知らないため、不正です。したがって、他の誠実なノードはそのブロックを認めません。なぜなら、不正な取引が含まれているからです。そのため、前のブロックに基づいて拡張し続けることになります。最長合法チェーンに従って、そのブロックはブロック報酬を得ることができず、逆に大量の電力や人力を浪費し、最終的にはブロック報酬を得ることができません。

2. 二重支払い#

支出したお金を再度支出することです。例えば、M が A に送金し、M が別の取引を発表してそのお金を自分に戻す(または他の人に戻す)。この時、二つの状況があります。

  1. 新しいブロックがブロックチェーンに書き込まれた場合 - 分岐攻撃で取引を巻き戻す

悪意のあるノードはブロックチェーンを分岐させ、以前のブロックから新しいチェーンを分岐させる必要があります。この場合、攻撃の難易度は非常に高いです。悪意のあるノードが一度記帳権を得たとしても、誠実なノードは最長合法チェーンしか認めません。詳細は自己中心的マイニング(selfish mining)を参照してください。

この攻撃を防ぐためには、いくつかのブロックの確認を待つ必要があります。デフォルトでは 6 つの確認が必要です。この時、前の取引は改ざんできないと見なされ、待機時間は約1 時間程度です。

  1. 取引が書き込まれていないブロックチェーンにおいて - 短時間で複数の取引を発起する

この状況は ** ゼロ確認(zero confirmation)** と呼ばれ、実際のアプリケーションで非常に一般的です。

各取引にはタイムスタンプが含まれています。ビットコインプロトコルでは、デフォルトで各ノードは最初に受け取った取引を受け入れます。もし正しい取引が最初に受け入れられ、後に発起された重複取引が受け入れられなければ、受取人はこの取引を直接拒否することができます。

実際には、一定のリスクが依然として存在します。悪意のある攻撃者のノードが非常に小さな確率で記帳権を得る可能性があるため、絶対的な安全を確保するには 6 つの確認を待つ必要があります(1 時間)。

3. 合法的な取引を書き込まない#

問題はありません。合法的な取引は次のブロックに書き込まれることができます。常に誠実なノードが合法的な取引を書き込むことができます

通常、合法的な取引がブロックに書き込まれないこともあります。なぜなら、ある期間に取引数が多すぎる可能性があるからです。ビットコインプロトコルでは、各ブロックのサイズに制限があり、ブロックサイズは 1M バイトを超えてはなりません。したがって、取引が多すぎる場合、一部の取引は次のブロックの発表を待たなければなりません

4. 自己中心的マイニング(selfish mining)(51% 攻撃に類似)#

通常、ブロックを掘った場合はすぐに発表し、他の人が掘った場合に自分のブロックが無効にならないようにします。しかし、自己中心的マイニングでは、悪意のあるノードがブロックを掘った後、発表せずにチェーンを隠します。最長合法チェーンが生成されるまで待ってから発表します。

これは分岐攻撃の一手段ですが、悪意のあるノードは通常 51% 以上の計算能力を必要とし、実現が難しいです

もし単に通常のブロック報酬を多く得ようとする場合、最初に掘ったブロックを発表せず、他の人が次のブロックを掘るのを待ち、すでに掘ったブロックを使って競争を減らすことができます。もし自分が二つ目のブロックを掘った場合、他の人が最初のブロックを掘ったと宣言した後、自分が持っている二つを一緒に発表し、最長合法チェーンとなることが理論的には可能です。しかし、この方法はリスクが高く、他の人が最初のブロックを掘ったときに自分が二つ目を掘ることができなければ、同じ長さのチェーンになり、競争することになります。この場合、最初のブロックの報酬を無駄にする可能性があります

ビットコインシステムにおける合意メカニズムが得るべき合意とは#

分散ハッシュテーブルの例を挙げると、分散システムには多くのサーバーがあり、これらのサーバー間で得るべき合意は何でしょうか?ハッシュテーブルの内容、すなわちどのキーと値のペアが含まれているかです。

ビットコインの去中心化された帳簿の内容が得るべき合意であり、記帳権を得たノードだけがそこに書き込むことができます。

なぜ皆が記帳権を争うのか#

なぜ皆が記帳権を争うのでしょうか?まず、記帳権を持つノード自体には一定の権限があり、どの取引が次のブロックに書き込まれるかを決定できます

しかし、私たちがこのプロトコルを設計する際には、これが記帳権を争う主要な動機にならないようにすべきです。なぜなら、合法的な取引はすべてブロックチェーンに書き込まれるべきだからです。これにより、** ブロック報酬(block reward)取引手数料(transaction fee)** が導入されます。

誰が通貨の発行を決定するのか#

** コインベース取引(coinbase transaction)** はビットコインシステムで新しいビットコインを発行する唯一の方法であり、この取引はコインの出所を示す必要がありません。その後の取引はビットコインの移転に基づいています。

ビットコインの記帳権を争うプロセスはマイニングと呼ばれます。したがって、記帳権を争うノードはマイナーと呼ばれます。もし彼が記帳権を得た場合、私たちは彼がマイニングを行った、またはブロックを掘ったと言います。

どうやって記帳権を得るのか(POW 作業証明)#

様々なランダム数 nonce を試してパズルを解くことによって

ビットコインの合意メカニズムは計算能力で投票します。ビットコインのハッシュ関数の三つの特性の中で、パズルフレンドリーという特性は、パズルを解く過程にショートカットがないことを保証し、一つずつ nonce を試すしかありません。

したがって、あるノードの計算能力が別のノードの 10 倍であれば、記帳権を得る確率もそのノードの 10 倍になります。計算能力で投票することがビットコインにおける投票の特異性です。それは一人一票でもなく、一台のコンピュータ一票でもなく、あなたが一秒間に試すことができる nonce の数に依存します。これを時には ** ハッシュレート(hash rate)** と呼びます。このハッシュレートが投票の重みを決定します。あなたのノードのハッシュレートが高ければ高いほど、記帳権を得てブロック報酬を得る確率も高くなります。

ビットコインではPOW 作業証明がシビル攻撃を防ぎます。計算能力で投票し、アカウントをいくら作成しても、計算能力を強化することはできません。

ビットコインがパズルを解く過程は、計算能力を競うこと以外に実際的な意味はありません。ビットコインがますます掘りにくくなっているのは、ブロック報酬が人為的に減少しているためであり、ビットコインの希少性は人為的に作られています。パズルを解くこと自体には実際的な意味はありませんが、マイニングプロセスはビットコインシステムの安全性を維持するために非常に重要です。** ビットコインはマイニングによって保護されています。** マイニングは計算能力で投票する有効な手段を提供し、誠実な人々の手に大部分の計算能力が保持されていれば、システムの安全性が保証されます。

マイニング中にマイナーが答えを盗むことはあるか#

ありません。発表されたブロックにはコインベース取引があり、その中にはマイニングを行ったマイナーのアドレスが含まれています。もし A がマイニングを行った場合、その中には A の受取アドレスが含まれています。もし答えを盗む場合、A のアドレスを自分のアドレスに変更する必要がありますが、アドレスが一変すれば、コインベース取引の内容も変わります。

これにより、マークルツリーの根ハッシュ値が変わります。なぜなら、この取引とブロックに含まれる他の取引は一緒にマークルツリーを構成しているからです。どこか一つが変更されれば、根ハッシュ値も変わります。そして nonce はブロックヘッダー内にあり、根ハッシュ値もブロックヘッダー内にあります。ブロックヘッダーの内容が変更されれば、元々見つけた nonce は無効になります。したがって、答えを盗むことは不可能です。なぜなら、各マイナーが見つけた nonce は彼自身の受取アドレスにバインドされているからです。

ベルヌーイ試験(Bernoulli trial)#

ベルヌーイ試験:二項結果を持つランダム実験。

** ベルヌーイ試験(Bernoulli trial)** は、二つの可能な結果を持つ単一のランダム試験です。

ベルヌーイ過程

ベルヌーイ過程(Bernoulli process):独立したベルヌーイ試験の系列。

マイニングプロセスで毎回 nonce を試すことは、ベルヌーイ試験の一つと見なすことができます。各ランダムなベルヌーイ試験はベルヌーイ過程を構成します。

その一つの特性は:無記憶性です。ベルヌーイ過程の一つの特性は ** 無記憶性(memoryless)** であり、大量の試験を行うと、前の結果は後の結果に影響を与えません

各 nonce を試す成功確率は非常に小さく、大量の試験を行う必要があります。この時、ポアソン過程を用いてベルヌーイ過程を代替することができます。

プログレスフリー - マイニングの公平性の保証#

私たちが本当に関心を持っているのは、システムの出力時間です。確率論では、ブロック時間が指数分布に従うことを導出できます(exponential distribution)。

システム全体の平均出力時間は 10 分であり、これはビットコインプロトコルが定期的にマイニングの難易度を調整し、平均出力時間を約 10 分に維持するために設計されています。各マイナーに具体的に言えば、次のブロックを掘ることができる時間は、マイナーの計算能力がシステム全体の計算能力に占める割合によって決まります。

指数分布も無記憶性を持ち、マイニングの公平性を保証します

指数分布の無記憶性は、確率分布曲線の特性によるもので、どこから切り取っても、残りの部分の曲線は元のものと同じです。例えば、すでに 10 分待っても誰も合法的なブロックを見つけていない場合、まだどれくらい待つ必要があるのか?それでも確率密度関数の分布を参考にすると、平均してまだ 10 分待つ必要があります。将来どれくらいの時間を掘る必要があるかは、過去にどれだけ掘ったかとは関係ありません。このプロセスは ** プログレスフリー(progress free)** とも呼ばれます。

座標軸を描くことができ、縦軸は確率密度を示し、横軸は出力時間を示します(システム全体の出力時間であり、各マイナーの出力時間ではありません)。各マイナーに具体的に言えば、次のブロックを掘ることができる時間は、マイナーの計算能力がシステム全体の計算能力に占める割合によって決まります。もし一人の計算能力がシステム全体の 1% を占めている場合、システムが 100 個のブロックを出力すると、その中の 1 個はその人が掘ったものになります。

もしプログレスフリーがなければ、どのような現象が起こるのでしょうか? 計算能力の強いマイナーは不釣り合いな利点を持つことになります。なぜなら、計算能力の強いマイナーは過去に多くの作業を行っており、過去に試みた多くの失敗した nonce の後、次の nonce が成功する確率が増加するからです。したがって、プログレスフリーはマイニングの公平性を保証します。

どれだけのコインを無から生み出せるか#

最初の頃、ビットコインが立ち上がったとき、発表された各ブロックは 50 ビットコインのブロック報酬を生成することができました。

ビットコインシステムでは、約 10 分ごとに 1 つのブロックが生成され、ビットコインプロトコルでは、21 万ブロック後にブロック報酬が半減することが規定されています。これにより、25BTC に減少し、さらに 21 万ブロック後に再び半減します。

ブロック報酬は約 4 年ごとに半減し、これにより生成されるビットコインの数量は ** 幾何級数(geometric series)** を構成します。

21000050(1+12+14+...)210000 * 50 (1+\frac{1}{2}+\frac{1}{4}+...)

この計算によれば、最大で 2100 万枚のビットコインが存在します。

2022 年までに、ビットコインマイナーは各ブロックを成功裏に採掘するごとに 6.25 ビットコインを獲得します。

ビットコインの安全性分析#

前提として、大部分の計算能力が誠実な人々の手にあると仮定します。マイニングが提供するのは確率的な保証であり、次のブロックが誠実なマイナーによって発表される確率が高いと言えますが、記帳権が悪意のある人の手に落ちないことを保証することはできません

もし悪意のあるノードが記帳権を得た場合、彼が行う可能性のあることは:

1. 不正な取引を偽造する#

例えば、他人の口座からお金を自分の口座に移すことですが、他人の秘密鍵を知らないため、不正です。したがって、他の誠実なノードはそのブロックを認めません。なぜなら、不正な取引が含まれているからです。そのため、前のブロックに基づいて拡張し続けることになります。最長合法チェーンに従って、そのブロックはブロック報酬を得ることができず、逆に大量の電力や人力を浪費し、最終的にはブロック報酬を得ることができません。

2. 二重支払い#

支出したお金を再度支出することです。例えば、M が A に送金し、M が別の取引を発表してそのお金を自分に戻す(または他の人に戻す)。この時、二つの状況があります。

  1. 新しいブロックがブロックチェーンに書き込まれた場合 - 分岐攻撃で取引を巻き戻す

悪意のあるノードはブロックチェーンを分岐させ、以前のブロックから新しいチェーンを分岐させる必要があります。この場合、攻撃の難易度は非常に高いです。悪意のあるノードが一度記帳権を得たとしても、誠実なノードは最長合法チェーンしか認めません。詳細は自己中心的マイニング(selfish mining)を参照してください。

この攻撃を防ぐためには、いくつかのブロックの確認を待つ必要があります。デフォルトでは 6 つの確認が必要です。この時、前の取引は改ざんできないと見なされ、待機時間は約1 時間程度です。

  1. ** 取引が書き込まれていないブロックチェーンにおいて - 短時間で複数
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。