これはブロガーの鉱業科学アルバムの2番目の記事です。前回の記事「ビットコイン取引のプロセス」に続き、ビットコイン取引の開始から確認までのプロセス全体を分析して、ビットコインマイニングの全体像を垣間見ることができます。ビットコイン取引のプロセスは、本質的には、大量の UTXO を消費および生成するプロセスです。これらのプロセスは、ビットコイン プロトコルで指定された方法に従ってトランザクション イニシエーターによって構築され、ビットコイン ネットワークによって生成された新しいブロックによって記録および確認されます。取引情報がビットコインブロックに記録され確認されると、取引が完了し、ビットコインネットワークは価値の移転を実現します。 「ビットコイン取引のプロセス」の記事では、ビットコイン取引情報がどのように構築されるかはすでにわかっていますが、この情報はどのようにして新しいビットコイン ブロックに入力されるのでしょうか。次に、ブロガーは新しいビットコイン ブロックを生成するプロセスを使用して、ビットコイン ブロックがトランザクション情報を記録し、確認する方法について詳しく説明します。 トランザクション プール (英語名: mempool) は、メモリ プールとも呼ばれ、確認されるトランザクションを格納するために使用される場所です。各ビットコインマイニングノードには独自の独立したトランザクションプールがあります。トランザクションプールのボリューム、最小トランザクション手数料率(この記事で言及するトランザクション手数料率は、単位ボリュームのトランザクションに含まれる手数料であり、単位はSat / B、つまり、各Bバイトのトランザクションの手数料はxSatビットコインです。以下同じ)などの違いにより、各ノードのトランザクションプールも異なります。予備ブロックを構築する際、マイナー(マイニングプール)はトランザクションプールからパッケージ化するトランザクションを選択する必要があります。トランザクション プールは頻繁に呼び出されるため、そのデータはノード サーバーの RAM に保存され、トランザクション プールが大きくなりすぎることはありません。ビットコイン ネットワーク内のマイニング ノードは、ビットコイン データを保存し、ビットコインのトランザクションとブロックの記録と検証に参加するノードです。これらのノードの中には、記録と検証に参加するだけでなく、新しいビットコイン ブロックの作成にも参加するものがあります。彼らは新しいブロックを構築し、PoW プルーフ・オブ・ワークを通じて会計権を競い合い、それによって新しいブロックを作成する権限を獲得します。これらのノードはマイニング ノードです。初期のマイニングノードにはマイナーとマイニングプールが含まれていましたが、現在ではビットコインのマイニングの難易度が高いため、単一のマイナーが新しいブロックを記録して作成する権利を獲得することは困難です。現在、主要なビットコインマイニングノードは、F2Pool、Poolin、BTC.com、Antpool、Slushpool などのさまざまなマイニングプールです。 UTXO ライブラリでは、Bitcoin ノードはノードのすべてのトランザクション情報をスキャンしてUTXO クラスターを構築します。未使用の UTXO がすべて含まれます。新しいブロックが生成されるたびに、UTXO ライブラリは新しいブロックで消費された UTXO を独自のリストから削除し、新しく生成された UTXO を独自のリストに追加します。 Coinbase Rewards は、Coinbase Transaction とも呼ばれます。ビットコイン プロトコルでは、新しいビットコイン ブロックが生成されるたびに、ビットコイン ネットワークが N 個のビットコインを生成し、そのビットコイン ネットワークの維持に対する報酬として、このブロックを作成したマイナーに支払われることが規定されています。同時に、Coinbase 報酬以外のこのブロック内の他のトランザクションに含まれるすべてのトランザクション手数料も Coinbase 報酬と合算され、このブロックを作成したマイナーに支払われます。このうちNの値はビットコインが誕生した当時は50でしたが、その後約4年ごとに半減しています。現在は6.25です。この半減方式では、ビットコイン ネットワークがビットコインの総量を制御します。 Coinbase Reward は、すべてのブロックに記録される最初のトランザクションです。確認されるトランザクションはまずトランザクションプールに入りますビットコインのトランザクションを開始する場合、トランザクションイニシエーターがトランザクション情報を構築します。このとき、トランザクション情報は確認対象のトランザクションであり、トランザクション入力情報(未使用のUTXOと正しい秘密鍵署名)とトランザクション出力情報(新しいウォレットアドレスにロックされた未確認のUTXO)が含まれます。 トランザクションが検証されると、トランザクション開始者によって Bitcoin ネットワークにブロードキャストされます。 Bitcoin ネットワーク内のすべてのノードは、ブロードキャスト情報を検証して記録できます。このうち、マイニングノードはブロードキャストを受信した後、確認するトランザクション情報を検証します。検証に合格すると、マイニング ノードは確認するトランザクションを独自のトランザクション プールに追加します。図1: 確認対象のトランザクションがトランザクションプールに入る確認が必要な取引情報には以下が含まれます。 トランザクションに有効な入力ウォレットアドレスと出力ウォレットアドレスが含まれているかどうか。 トランザクション サイズはブロックの最大サイズ (ビットコイン ブロックの最大サイズは現在 1M) より小さいですか? 入力 UTXO が正当かどうか (ノードの UTXO ライブラリと比較して、入力 UTXO が使用されていないかどうか)。 取引の総入力額と総出力額が合理的であるかどうか(総入力額 ≥ 総出力額)。 トランザクション入力に Coinbase からの報酬があるかどうかを判断します。報酬に対応するコインは、使用する前に少なくとも 100 ブロックの確認が必要です。 トランザクション プール内に重複したトランザクションがないことを確認します。 トランザクションによって設定されたトランザクション手数料が、メモリプールのトランザクション手数料比率 (Sat/B) の制限、およびその他の検証 (孤立したトランザクションの検証や追跡など) よりも高い。 マイニングノードはトランザクションプールからトランザクションを選択し、予備ブロックを構築します。マイニング ノードが予備ブロックを構築し、新しいブロックを生成する準備をするとき、確認するトランザクションを優先度に従ってトランザクション プールから並べ替えます。予約ブロックは通常、優先度の高いトランザクション用に一定量のスペースを予約し、残りのスペースはトランザクション手数料率 (Sat/B) の降順で使用され、ブロックを埋めるか、トランザクション プール内のすべてのトランザクションを使い切ることになります。しかし、ビットコインのブロックには、トランザクション プールからの保留中のトランザクションだけが含まれているわけではありません。ビットコイン プロトコルによれば、ビットコイン ブロックは主にマジック ナンバー、ブロック サイズ、ブロック ヘッダー、トランザクション カウンター、トランザクション情報の 5 つの部分で構成されます。以下のように表示されます。このうち、 「マジックナンバー」は 0xD9B4BEF9 という値を持つ定数です。 「ブロックボリューム」は、このブロック内のすべてのデータの合計ボリュームです。 「ブロックヘッダー」はブロック全体の短縮情報とみなすことができます。マイニングに使用されるブロック情報はブロック ヘッダーです。 「トランザクション カウンター」は、ブロック内のトランザクションの数を記録するために使用されます。 「トランザクション データ」とは、Coinbase 報酬部分を含む、ブロックに含まれるすべてのトランザクション情報です。一般的に言えば、この部分のデータはブロック全体のスペースの大部分を占めます。ビットコインのブロックでは、ブロックヘッダーが最も重要な情報です。ブロック全体のすべての特性情報が含まれています。- ブロックのバージョン番号。ブロックを作成した Bitcoin ノードのバージョン情報。Bitcoin プロトコルのアップグレードと更新を追跡するために使用されます。
- 前のブロックのハッシュ値。親ブロックハッシュとも呼ばれ、前のブロックを見つけるために使用されます。各ブロックには、前のブロックのハッシュ値が含まれています。いずれかのブロックにわずかな変更を加えると、後続のブロックのハッシュ値に大きな変化が生じます。このリンクのチェーンにより、すべてのビットコイン ブロックが単一のチェーン構造を形成することが保証され、ビットコイン ブロック データの悪意のある改ざんを効果的に防止できます。
- MerkleRoot ハッシュ。ブロックのトランザクションデータリストで、すべてのトランザクションデータのハッシュ値を取得し、Merkleツリーを構築します。この Merkle ツリーのルート ハッシュ値は MerkleRoot ハッシュです(以下を参照)。ハッシュ アルゴリズムの感度により、トランザクション全体の Merkle ツリー内のトランザクション データにわずかな変更が加えられると、連鎖反応が発生し、Merkle ツリーのルート ハッシュ値に大きな変更が生じます。したがって、トランザクションデータのマークルルートハッシュ値(MerkleRoot Hash)は、ブロック内のトランザクションデータを参照するために使用されるトランザクション全体のフィンガープリントと見なすことができます。
- 現在のターゲットハッシュ値。ビットコイン プロトコルでは、マイナーによって作成された予備ブロックのハッシュ値が目標ハッシュ値より小さい場合にのみ、ブロックが有効であると規定されています。目標ハッシュ値はマイニング難易度によって決まります。マイニングの難易度が上がると、目標ハッシュ値が小さくなり、マイナーがビットコイン ネットワークの要件を満たすハッシュ値を見つけることが難しくなります。現在のマイニング難易度によると、目標ハッシュ値よりも低いハッシュ値を見つけるには、理論的には S17 マイニング マシンを42 年間連続して稼働させる必要があります。したがって、個人がビットコインをマイニングするために独自のノードを構築する状況は基本的に存在しません。
- 乱数。 Nonce とも呼ばれます。ブロック ヘッダー情報では、ブロック バージョン番号、前のブロックのハッシュ値、MerkleRoot ハッシュ値、タイムスタンプ、現在のターゲット ハッシュはすべて既知の情報であり、比較的固定されており、自由に変更するのは不便であることがわかります。したがって、準備されたブロックのハッシュ値を調整する場合は、変数データ(乱数)を導入する必要があります。乱数を変更することで、作成されたブロックのハッシュ値を調整できます。
マイニング ノードは予備ブロックを構築した後、ブロック ヘッダー情報をマイナーに送信します。マイナーは、ブロック ヘッダー内の乱数を継続的に調整することで、予備ブロックのハッシュ値を変更します。予備ブロックのハッシュ値がビットコイン ネットワークの現在のターゲット ハッシュ値よりも低い場合、このブロックは合法的な新しいブロックです。マイニングノードは、新しいブロックをタイムリーにビットコイン ネットワークにブロードキャストします。ブロードキャスト情報を受信した後、ビットコイン ネットワーク内の他のビットコイン ノードが新しいブロックを検証します。検証に合格すると、新しいブロックがローカルに追加されます。この時点で、新しいブロックが作成および確認され、対応するトランザクションも完了しています。参考文献: 1. ビットコインのソースコード分析: https://blog.csdn.net/ztemt_sw2/article/details/80958087?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase 2. ビットコインのブロックヘッダー構造: https://www.investopedia.com/terms/b/block-header-cryptocurrency.asp 3. ビットコインのターゲットハッシュ値: https://en.bitcoin.it/wiki/Target 4. ビットコインのブロック構造: https://en.bitcoin.it/wiki/Block#Block_structure 5. ビットコインをマスターする: https://wizardforcel.gitbooks.io/masterbitcoin2cn/content/ch09.html |