Protocol rules
clientsの[ Rules ']をクリックします。
wikiは実質的に Bitcoin protocolを文書化しますが、クライアントがメッセージを処理するために使用する規則も同様に重要です。 ネットワーク全体の一貫性を維持し、Bitcoinのセキュリティ保証を保護するために、クライアントが特定の規則に従うことが重要です。
ここでは、それはトリッキーなロジックなので、txメッセージとブロックメッセージの処理に重点を置いています。 これは、現在、これらのメッセージを要求して転送する方法をスキップし、受信時に何をすべきかを説明します。 また、効率的に使用されるクライアントのさまざまなインデックス、マップ、ハッシュテーブルを無視して、抽象的な最小限のデータ構造を記述します。 これは概念的な説明です。 これはすべて、ソースコードのかなりリテラルな読み方に基づいています。
鉱業(ブロック生成)ルールはまだ提示されていません。
目次
データ構造[編集]
主なデータ構造はトランザクションとブロックです。 ブロックは、「ブロックヘッダー」とそれに続くブロック内のトランザクションで構成されます。 トランザクションはハッシュによって識別されます。 ヘッダーのハッシュでブロックします。 ブロックには、それらをグラフにリンクする先のポインタがあります。
概念的には、クライアントには次のデータ構造があります。
トランザクション[編集]
トランザクションのコレクションは2つあります。
- トランザクションプール
:メインチェーンのブロックではなく、入力トランザクションがあるトランザクションの順序付けられていない集合
孤立した取引 :1つ以上の入力トランザクションがないためにプールに入ることができないトランザクション
ブロック[編集]
ブロックには3つのカテゴリがあります。
- メインブランチのブロック
:これらのブロック内のトランザクションは、少なくとも一時的に確認されたものとみなされます
- メインブランチからの側枝のブロック
:これらのブロックは、少なくとも暫定的にメインブランチに入るレースを失っている
- 孤立ブロック
:これらは、メインブランチにリンクしていないブロックです。通常は、前任者または第nレベルの前任者がないためです
最初の2つのカテゴリのブロックは、起点ブロックに根ざしたルートを指すprevポインタによってリンクされたツリーを形成します。メインブランチは、最も難易度の高いブランチとして定義され、ブランチの各ブロックの難点を合計します。
Block Statusも参照してください。
難易度の変更[編集]
難易度は2016ブロックごとに変わります。この選択は、およそ2週間ごとに行われるように設計されています。
:2週間/ 10分= 14 * 24 * 60/10 = 2016
2016ブロックに達すると、現在のブロックの2016ブロック前にループバックします。現在のブロックとそのブロックとの間の時間の差がわかります。この差(実際のタイムスパンと呼ばれる)は、[2週間/ 4,2週間* 4]の範囲内で制限されます。
次に、この古い2週間のウィンドウの最後のターゲットを取得し、実際のタイムスパン/ターゲットタイムパン(2秒間の秒数)の比率で乗算します。
:新しいターゲット= 2016ブロック/ 2週間の古い目標*時間。 ブロックの古いセットがあまりにも速く完了した場合、ターゲットが下げられ(難易度が上がる)、新しいブロックを解決するのに時間がかかります。逆もまた同様です。このようにして、難易度は理想的な2週間(ブロックあたり10分)の間に振動します。
ブロック作成料金[編集]
ブロック作成料金は210000ブロック毎に変更されます。 ブロック作成料金は、チェーン上のブロック高さ(起点= 0)の関数であり、64ビット整数演算を使用して計算されます (satoshisで):
(50 * 100000000)>>(高さ/ 210000)
ブロック作成料金は50BTCで始まり、ブロック210000で25BTCに落ち、ブロック420000で12.5BTCに落ち、最終的にブロック6930000で0SOSOSIに落ちる。 すべてのコインベース取引のブロック作成料金は、2099999997690000の土壌、実際には21百万BTCになります。
"tx"メッセージ[編集]
これらのメッセージは単一のトランザクションを保持します。
#構文上の正当性をチェックする #どちらのリストも空でないことを確認する #バイト単位のサイズ<= MAX_BLOCK_SIZE #それぞれの出力値と合計は、法定通貨範囲内になければなりません #入力のどれもがハッシュ= 0、n = -1( "コインベース"のトランザクション)を持たないことを確認してください。 #nLockTime <= INT_MAXであることを確認します。nLockTimeは31ビットを超えてはいけません。一部のクライアントはそれを正しく解釈しません。</ ref>、バイト単位のサイズ> = 100 <ref>有効なトランザクションには少なくとも100バイト必要です。 sig opcount <= 2 <ref>標準トランザクションのシグネチャ内のシグネチャオペランド(no、冗長ではない)の数は決して</ ref>を2つ超えません> #非標準的なトランザクションを拒否する:scriptSigはスタック上の数字を押す以外の何かをするか、scriptPubkeyは通常の2つのフォームと一致しない<ref>これはクライアントにとって厳しい要件ではないことに注意してください。 #すでにプールに一致するtxがある場合、またはメインブランチのブロックに拒否されている場合 #入力ごとに、参照された出力がプール内の他のtxに存在する場合は、このトランザクションを拒否します。<ref>これはクライアントにとって厳しい要件ではありません。ネットワーク強制ルールは、特定の出力を費やしている 1つの</ i>トランザクションのみがブロックチェーン内にあることができるため、二重支出を防ぐことができます。技術的には、鉱山者は、他の取引が以前にブロックチェーンや同じブロックでその出力を費やしていない限り、彼らが取り組んでいるブロックに入れたいものを選ぶことができます。メモリ内のトランザクションプールは、鉱山者がどのような方法で実装しても技術的に管理することができます。</ ref> #入力ごとに、メインブランチとトランザクションプールを調べ、参照される出力トランザクションを見つけます。入力トランザクションに対して出力トランザクションが存在しない場合、これは孤立トランザクションになります。一致したトランザクションがすでに存在しない場合は、孤立トランザクションに追加します。 #入力ごとに、参照される出力トランザクションがコインベース(つまり、ハッシュ= 0、n = -1の1つの入力のみ)であれば、少なくともCOINBASE_MATURITY(100)の確認が必要です。そうでなければこの取引を拒否 #入力ごとに、参照された出力が存在しない場合(存在しなかった場合や既に使用されている場合)は、このトランザクションを拒否します<ref>これは二重支出に対する保護です</ ref> #参照された出力トランザクションを使用して入力値を取得すると、各入力値と合計が有効な金額範囲内にあることを確認します #入力値の合計<出力値の合計であれば拒否する #取引金額(入力値の合計から出力値の合計を差し引いたものとして定義される)が低すぎて空のブロックに入らない場合は拒否します # scriptPubKeyが各入力に対して受け入れることを確認します。いずれかが悪い場合は拒否する #トランザクションプールに追加する<ref>トランザクションがメモリプールに受け入れられると、コインベース値がトランザクション料金と予想されるBTC値(この文書の時点では25BTC)を超えないことを確認する追加チェックが行われます。 </ ref> # "私の場合はウォレットに追加" #ピアへのトランザクションの中継 #これを入力の1つとして使用する孤立したトランザクションごとに、その孤児に対して再帰的にこれらすべてのステップ(これを含む)を実行します
いくつかのルールの説明=[編集]
ほとんどのルールは自明です。このセクションでは、それほど明白でないルールのいくつかがなぜ適所にあるのかを説明します。
"block"メッセージ[編集]
これらのメッセージは単一のブロックを保持します。
#構文上の正当性をチェックする #私たちが3つのカテゴリのいずれかにあるブロックの重複を拒否した場合 #トランザクションリストは空でなければならない #ブロックハッシュは主張された nBits 仕事の証明を満たす必要があります #ブロックのタイムスタンプは、今後2時間を超えてはならない #最初のトランザクションはコインベースでなければならない(すなわち、ハッシュ= 0、n = -1の1つの入力のみ)、残りは #各取引について、 "tx"小切手を適用する2-4 #コインベース(最初の)トランザクションの場合、scriptSigの長さは2-100でなければなりません #トランザクションの総数が合っていれば拒否する> MAX_BLOCK_SIGOPS #Merkleハッシュを検証する #メインブロックまたはサイドブランチにprevブロック(一致する prev ハッシュ)があるかどうかを確認します。そうでない場合は、これを孤立ブロックに追加し、次に 'prev' 'チェーンの1番目の孤立した孤児ブロックからこれを取得します。ブロックで完了 # nBits の値が難易度のルールと一致することを確認する #タイムスタンプが最後の11ブロックまたはそれ以前のメジアン時間の場合は拒否します #特定の古いブロック(すなわち、最初のブロックのダウンロード)については、ハッシュが既知の値と一致するかどうかをチェックする #ブロックをツリーに追加します。 3つのケースがあります:1.ブロックはさらにメインブランチを拡張します。 2.ブロックはサイドブランチを拡張しますが、それを新しいメインブランチにするのに十分な難しさを加えません。ブロックはサイドブランチを拡張し、それを新しいメインブランチにします。 #ケース1の場合、メインブランチに追加する:
- コインベース取引以外のすべての取引については、以下を適用します。
- 各入力に対して、参照されている出力トランザクションを見つけるために、メインブランチを調べます。入力トランザクションに出力トランザクションがない場合は拒否します。
- 各入力に対して、以前のトランザクションの "n"番目の出力を使用していて、n + 1個の出力よりも少ない出力を持つ場合は、拒否します。
- 各入力について、参照される出力トランザクションがコインベース(すなわち、ハッシュ= 0、n = -1の1入力のみ)であれば、それは少なくともCOINBASE_MATURITY(100)の確認を有していなければならない。そうでなければ拒否する
- 各入力の暗号署名を検証する。いずれかが悪い場合は拒否する
- 入力ごとに、参照された出力がメインブランチのトランザクションによってすでに消費されている場合は、reject
- 参照された出力トランザクションを使用して入力値を取得し、各入力値と合計が有効な金額範囲内にあることを確認します
- 入力値の合計<出力値の合計であれば拒否する
- コインベース値>ブロック作成料金と取引手数料の合計
- (拒否しなかった場合):
- 各取引について、「私の場合はウォレットに追加」
- ブロック内の各トランザクションについて、一致するトランザクションをトランザクションプールから削除します
- 仲間へのリレーブロック
- 拒否した場合、ブロックはメインブランチの一部としてカウントされません
- コインベース取引以外のすべての取引については、以下を適用します。
#ケース2の場合、サイドブランチに追加すると、何もしません。 #ケース3の場合、サイドブランチがメインブランチになります。
- このブランチが分岐したメインブランチの フォーク ブロックを見つけてください
- メインブランチをこの fork ブロックだけに再定義する
- サイドブランチの各ブロックについて、 fork ブロックの子からリーフまで、メインブランチに追加します:
- "ブランチ"チェックを行う3-11
- コインベース取引を除くすべての取引について、以下を適用します。
- 各入力に対して、参照されている出力トランザクションを見つけるために、メインブランチを調べます。入力トランザクションに出力トランザクションがない場合は拒否します。
- 各入力に対して、以前のトランザクションの n '番目の出力を使用していても、n + 1個未満の出力がある場合は、拒否します。
- 入力ごとに、参照される出力トランザクションがコインベース(すなわち、ハッシュ= 0、n = -1の1入力のみ)であれば、少なくともCOINBASE_MATURITY(100)の確認が必要です。そうでなければ拒否する
- 各入力の暗号署名を検証する。いずれかが悪い場合は拒否する
- 入力ごとに、参照された出力がメインブランチのトランザクションによってすでに消費されている場合は、reject
- 参照された出力トランザクションを使用して入力値を取得し、各入力値と合計が有効な金額範囲内にあることを確認します
- 入力値の合計<出力値の合計であれば拒否する
- コインベース値>ブロック作成料と取引手数料の合計を拒否する
- (拒否しなかった場合):
- 各取引について、「私の場合はウォレットに追加」
- 任意の時点で拒否すれば、元のブランチは元のまま残してください。
- 古いメインブランチの各ブロックについて、リーフからフォークのブロックの子まで:
- ブロック内の非コインベーストランザクションごとに:
- "tx"チェックを適用すると、ステップ8を除き、メイン・ブランチではなく、トランザクション・プール内で重複を調べるだけです
- 受け入れられた場合はトランザクションプールに追加し、それ以外の場合は次のトランザクションに進む
- ブロック内の非コインベーストランザクションごとに:
- 新しいメインブランチの各ブロックについて、 fork ノードの子からリーフまで:
- ブロック内のトランザクションごとに、一致するトランザクションをトランザクションプールから削除します
- 仲間へのリレーブロック
#このブロックが "prev"である孤立したブロックごとに、これらのすべてのステップ(これを含む)を実行する。r
関連項目=[編集]
参考文献[編集]
<リファレンス/>