このページ:ブロックによると、マイニングは実際には数学的な問題を解決するためのものですが、ブロックハッシュアルゴリズムを読んでもあまり役に立ちません。私も試しましたビットコインのソースコードを読みますが、コードを読むにはドキュメントを読むよりもはるかに時間がかかります:)
そして、getwork()メソッドを呼び出して「データ」をフェッチする単純なjson-rpcクライアントを作成しましたが、この「データ」の隣にいますか?
プログラマーの視点でマイニングプロセスを説明できる人はいますか?
コメント
回答
マイニングアルゴリズムは次のとおりです。
-
ステップ0-ネットワークから前のブロックのハッシュを取得します。
-
ステップ1-「ブロック」と呼ばれる潜在的なトランザクションのリストを収集します。このトランザクションのリストは、ピアツーピアビットコインネットワークからのものです。
- ステップ2-潜在的なトランザクションのブロックのハッシュを乱数とともに計算します。
- ステップ3-ハッシュが現在設定されている難易度を超えている場合は、そのブロックをマイニングしています。そうでない場合は、ステップ1からやり直します。ステップ1からのトランザクションのリストへの追加と、ステップ2からの乱数の変更は、「次のラウンドで基準が満たされる可能性がある」ことを意味します。
プログラマーの視点から見ると、擬似コードは次のようになります。
P := The hash of the previously mined block B := A block of transactions H := A hash function D := Difficulty Level 0 Retreive P 1 Construct/Modify B 2 IF H(P, B, Some Random Number) > D END 3 GOTO 1
次のように警告する必要があります。その説明にはいくつかの誤りがありますが、ほとんどの場合、それで十分です。そして、ここにいくつかのより有用な説明があります:
ハッシュとは何ですか?
ハッシュは、データを特定の範囲内の数値に変換する関数です。ハッシュには、その出力を知ることは本質的に予測不可能であるという特性があります(指定された範囲内)。ビットコインマイニングに使用される特定のハッシュ関数は、SHA256が2回適用されます。
難易度はどのように機能しますか?
ハッシュ関数のこの予測不可能な性質は、ランダムデータ(トランザクション+乱数)を入力すると、基本的に特定の範囲内の乱数が生成されることを意味します。必要な出力の範囲をさらに制限すると、1回のラウンドでそれを見つける可能性が高くなります。これにより、ネットワーク上でアルゴリズムを実行できる回数に基づいて、ソリューションが見つかる頻度を確率的に決定する方法が作成されます。具体的には、「ギガハッシュ」または「テラハッシュ」という用語を聞いた場合、これはステップ3を実行できる回数を指します。ネットワーク全体で1秒あたりのハッシュ数が増えると、ネットワークは自動的に難易度を上げ、約10分以内に解決策が見つかるようにします。
ブロックがマイニングされるとどうなりますか?
ブロックがマイニングされると、マイナーはそのブロックをネットワーク上の他のすべてのマイナーに送信します。それを見つけた。このブロックには、トランザクションのリスト、見つかったハッシュ、特定の乱数、および前のハッシュへの参照が含まれています。各マイナーは、新しくマイニングされたブロックを受信すると、ブロック内に存在する現在マイニング中のすべてのトランザクションを削除し(ブロックチェーンですでに確認されているため)、同じことを行う他のマイナーにブロックをブロードキャストします。伝播は非常に迅速に行われます。
注:ブロックの元のマイナーは「マイナー」料金を受け取ります。これは、「コインベース」報酬に加えて、トランザクションからの未使用のコインで構成される報酬です。コインベースの報酬は、210,000ブロックごとに(約4年に1回)50ビットコインと半分で始まりました。コインベースの報酬は最終的には非常に小さくなり、鉱夫の料金に比べてごくわずかになります。
コメント
- 報酬は210000ブロックごとに半分になります。->今それを見て、きれいだと思います: bitcoinclock.com
- ああ、および難易度は、ネットワークが前述の最後の2016ブロックの平均ハッシュレートで動作し続けると想定し、このハッシュレートが約10分のブロックサイクルになるように新しい難易度を設定することにより、2016ブロックごとに調整されます。
- 間違っている可能性がありますが、ブロックには最後のブロックのハッシュも含まれていると思います。そして、それがブロックが後方にチェーンされる方法であり、ブロックチェーンという用語につながります。
- @Murch、難易度は実際には前のブロックを見つけるのにかかった時間に基づいてブロックごとに調整されます。この時点で、難易度は上がるだけです。 2016ブロックごとに、最後の2016ブロックに対して難易度が調整され、上下に移動できます。これは、計算能力の突然の低下を防ぐのに役立ちます。そうしないと、ブロックを見つける時間が10分を超えることになります。
- @ Tarandeep-Gill、that '正解です!前のブロックのハッシュは、トランザクションのリストとともにハッシュされます。これは実際、ハッシュの説明が少し不完全だと思います-特定のハッシュ関数は、前述のように2回適用されるSHA256ではなく、ブロックのさまざまな部分(トランザクションと前のブロックのハッシュを含む)に適用される関数ですさまざまな方法で。これは、"不正確さ"の1つです。他の人を見つけることができるかしら…
回答
「パズル」を解く目的(a)ブロックのマイニングを平均10分に遅らせること、および(b)ブロックのマイニングに実際のコストを負担することです(CPU電力、つまりエネルギーを消費します)。シビル攻撃を防ぐためのコストがあります(51%の攻撃を行うために多くのマイナーマシンを稼働させます)。
遅延は、適切なブロックが世界中の他のすべてのマイナーに伝播できるようにするために投入されます。 、新しいブロックを鋳造したばかりの鉱夫に有利なスタートを与えることなく。そのためには、ブロック時間(10分)を伝搬遅延(数秒)よりも桁違いに大きくする必要があります。
つまり、パズルの種類はある意味では無関係であり、巨大な数独である可能性もあります。
回答
すべてのハッシュは有効なハッシュです。問題は、ハッシュが私たちの基準を満たしているかどうかです。実際にハッシュするのは、特定の長さの文字列を作成するために並べられたいくつかのことです(これに戻ります)。次に、その文字列全体をハッシュします。結果のハッシュを数値と考えてください。必要なのは、結果の数値が目標の数値よりも小さくなることです。つまり、10億面のサイコロを振って、目標数よりも少ない数を考え出すようなものです。その目標数は「難易度」と見なされます。より多くの人がサイコロを振るにつれて、その目標数を減らして可能性を減らします。いずれかのダイスロールがヒットします。
非常に重要なのは、ハッシュする文字列に並べられるもののいくつかは、調整が許可されているものです。同じことを何度も繰り返すと同じ結果が何度も得られるため、ハッシュはダイを転がすのとまったく同じではありません。ただし、ハッシュの内容を少し調整するだけでも、結果のハッシュに大きな影響を与える可能性があります。操作できる主要な項目は「nonce」と呼ばれます。基本的に、文字列で使用するナンスを選択し、文字列全体をハッシュして、何が得られるかを確認します。ハッシュがヒットしない場合は、ナンスを変更して再試行します。 。ノンス自体はそれほど大きくないので、試すことができるノンスのバリエーションは限られています。次に変更できる項目はタイムスタンプです。タイムスタンプを小刻みに動かすことも許可されています。タイムスタンプを小刻みに動かすたびに、可能なナンス値のセット全体を何度も繰り返すことができます。ナンスの可能性を使い果たすこのプロセスを繰り返し、結果のハッシュまでタイムスタンプを何度も小刻みに動かします。は難易度の目標数よりも低いです。
その場合、このタイムスタンプとこのナンスがブロックを解決するために機能することを世界に宣言します。他の人はそれが真であると検証し、に追加されます。ブロックチェーン。ブロックチェーン内の特定の数のブロックが「深い」場合、ブロックは「検証済み」と見なされます。つまり、現在のブロックと比較した履歴ブロックです。ブロックがまだ有効であることがわかっていないわけではないので、検証はここでは少し誤解されています。私たちが検証しているのは、作業の証明です。つまり、歴史的ブロックが十分に埋もれていると、その歴史を作成するために必要な労力は、他の誰かが歴史の異なるバリエーションを作成しようとするのに乗り越えられないことを意味します。彼らは作成する必要がありますそのブロックの独自のバージョン(トランザクションの独自のバージョンを書き込むことが唯一の理由、つまりコインを盗む)次にそれを自分で解決し、次のブロックと次のブロックを解決し、以下同様に他の人に「追いつき」ます。 これは、サイコロを振るゲームで世界を凌駕しなければならないことを意味します。 たぶん、宇宙の歴史の中で、誰かが2つか3つのブロックを続けてナンスで幸運になるかもしれませんが、ほとんどのマイニングプールと交換が今必要としている120ブロックで? 決して起こらないだろう。
but what should I do next to this "data"?
ここ'は短いリファレンスの実装です。 github.com/jgarzik/pyminer/blob/master/pyminer.pyexplain the mining process in programmer's view
はかなり幅広い質問です。解決しようとしている具体的な問題は何ですか?