紙とペンで鉱山ビットコイン

ある時点で、ビットコインを手動でマイニングできる速さを把握したかったのです。 マイニングにはSHA-256ハッシュが使用されることが判明しましたが、これは非常に単純であり、コンピューターがなくても計算できます。 もちろん、プロセスは非常に遅く、完全に非実用的です。 しかし、紙の上のすべてのステップを経て、アルゴリズムの詳細を十分に理解できます。





1回の暗号化ラウンド



マイニング



ビットコインセキュリティシステム全体の重要な部分はマイニングです。 主なアイデアは、マイナーがビットコイントランザクションを1つのブロックにグループ化することです。このブロックは、数え切れないほどの数が既にハッシュされ、特別な条件に該当する非常にまれなハッシュ値を見つけます。 そのような値が見つかると、ブロックは連続していると見なされ、ブロックのチェーンに分類されます。 ハッシュ自体は、適切なブロックを見つけるのが難しくなること以外、有用な目的をもたらすものではありません。 したがって、これは、既存のリソースセットを持っている人がシステム全体を制御できないという保証の1つです。 前回の記事でマイニングの詳細を読んでください



暗号化入力ハッシュ関数は、データを含むブロックを受け取り、小さいが予測不可能な出力を生成します。 適切な出力をすばやく得る方法がないように設計されており、適切な値が見つかるまで検索を続ける必要があります。 ビットコインはそのような機能としてSHA-256を使用します。 さらに、抵抗を高めるために、SHA-256はユニットに2回適用され、ダブルSHA-256と呼ばれます。



ビットコインでは、ハッシュの有効性の基準は、開始時に十分な数のゼロです。 [1]そのようなハッシュを見つけることは、例えば、いくつかのゼロで終わる自動車または電話番号を見つけることと同じくらい難しいです。 しかし、もちろん、ハッシュの場合、指数関数的に難しくなります。 現時点では、正しいハッシュには約17の開始ゼロが含まれている必要があり、これは1.4x10 20のうち1つだけが満たしています。 類推すると、このような値を見つけることは、地球上のすべての砂の中から特定の粒子を見つけることよりも困難です。



以下の図は、チェーン内の典型的なブロックとそのハッシュを示しています。 ハッシュ処理に関係するバイトは黄色で強調表示されます。 この例では、ハッシュは有効であり、先頭に十分な数のゼロがあります。 ただし、これは頻繁なケースではなく、通常、マイナーはnonceフィールドの値または変更可能な他のデータをソートする必要があります。





ビットコインブロック構造



SHA-256



このアルゴリズムは、512ビット(64バイト)の断片に分割されたデータを処理し、それらを暗号的に混合し、256ビット(32バイト)ハッシュを生成します。 SHA-256は、64回繰り返される比較的単純なラウンドで構成されています。 以下に、8バイトの4バイトワードをA-Hから入力する、まさにそのようなラウンドを示します。





8つのAH入力ワードに対して1つのラウンドSHA-256。 図は 、kockmeyer、 CC BY-SA 3.0によって描かれています。



青いブロックは、暗号分析を複雑にするためにビットを非線形に混合します。 さらに、信頼性をさらに高めるために、さまざまなミキシング機能が使用されます(有効なハッシュをすばやく生成するための数学的な抜け穴が見つかった場合は、ビットコインのマイニングプロセス全体を制御します)。



多数決関数(Maブロック)は、ワードA、B、およびCでビット単位で機能します。各ビット位置について、この位置の入力ビットのほとんどがゼロの場合は0を返し、そうでない場合は1を返します。



ブロックΣ0はAを2ビットだけ循環的にシフトし、次に元のワードAは13ビットずつ、同様に22ビットだけ循環的にシフトします。 結果として得られるAの3つのシフトバージョンは、ビット単位のモジュロ2( 通常のxor、(A ror 2)xor(A ror 13)xor(A ror 22) )に加算されます。



Chは選択機能を実装します。 各ビット位置で、Eからのビットが1に等しい場合、その位置からFからのビットがチェックされ、そうでなければGからのビットがチェックされます。したがって、FとGからのビットはEの値に基づいて混合されます。



Σ1はΣ0と構造が似ていますが、単語Eで機能し、対応するせん断定数は6、11、および25です。



赤いブロックは32ビット加算を実行し、出力ワードAおよびEの新しい値を形成します。Wtの値は入力データに基づいて生成されます(これは、ハッシュデータを受信して​​処理するアルゴリズムの部分で発生します。これは考慮対象外です)。 K tは、各ラウンドの独自の定数です。 [2]



上の図では、1回の暗号化ラウンドでAとEのみが変化することがわかります。 残りの単語は変更されませんが、出力でシフトされます-古いAは出力Bに、古いBは新しいCに、というように変わります。 アルゴリズムを個別にラウンドしてもデータはあまり変化しませんが、64ラウンド後に入力情報は完全に暗号化されます。 [3]



手で採掘する



ビデオでは、ペンと紙で説明されているすべての手順を実行する方法を示しています。 ブロックマイニングの最初のハッシュを実行しました。 16分45秒かかりました。





何が起こっているのかを少し説明しましょう。AからHまでの単語を16進数で書き留め、それぞれの下でバイナリに翻訳しました。 ブロックMaの実行結果はワードCの下にあり、シフト後のAの値と出力Σ0はAの行の上にあります。選択関数はGの下に表示され、最後に対応するシフトされたバージョンのEとブロックΣ1の後の値がEの行の上にあります。右下隅に追加が行われ、その結果は新しいAと新しいE(合計の最初の3つの赤いブロック)の両方の計算に関係しています。 右上でAの新しい値を計算し、真ん中にEの新しい値を計算しています。これらの手順はすべて上記で説明されており、図で簡単に追跡できます。



ビデオに示されているラウンドに加えて、別のラウンド-特定のビットコインブロックの最後の64回目のハッシュラウンドを費やしました。 写真では、ハッシュ値が黄色で強調表示されています。 ゼロの数は、それが有効なビットコインハッシュであることを確認します。 先ほど書いたように、ゼロはハッシュの最後にあり、先頭にはないことに注意してください。 その理由は、ビットコインは単にSHA-256が受信したバイトを反転させるためです。 [4]





SHA-256の最後のラウンド。その結果、正常にマイニングされたビットコインブロックが表示されます。



鉄鉱夫を設計する上で、これはどういう意味ですか?



SHA-256の各ステップは、デジタルロジックでは非常に単純に見えます-単純なビット演算と32ビットの合計(回路を勉強したことがあるなら、おそらくハードウェアでどのように見えるかをすでに想像しているでしょう)。 したがって、ASICはSHA-256を非常に効率的に実装し、数百のSHA-256ラウンドを並行して配置します。 次の写真は、1秒あたり20〜30億ハッシュを計算できるマイニングチップを示しています。 Zeptobarsでは、さらに写真を見ることができます。





ビットコインを毎秒2〜3ギガの速度でマイニングできるBitfury ASICシリコンチップのスナップショット。 Zeptobarsからの写真 CC BY 3.0



ビットコインとは対照的に、Litecoin、Dogecoin、およびその他の同様の代替-coinシステムは、ハードウェアで実装の複雑さを最初に実装するscryptハッシュアルゴリズムを使用します。 このアルゴリズムは、実行時に1024個の異なるハッシュ値をメモリに保存し、すでに出力時にそれらを組み合わせて最終結果を取得します。 したがって、SHA-256ハッシュと比較して、暗号化ハッシュを計算するためにより多くのメモリと回路が必要です。 マイニング用の対応するハードウェアを比較すると、ハッシュアルゴリズムを変更した場合の効果がはっきりとわかります。scrypt(Litecoinなど)のバージョンは、SHA-256(bitcoin)のバージョンよりも数千倍遅いです。



おわりに



SHA-256は予想外に非常に単純であるため、手動で計算することさえできました(ビットコイントランザクションに署名するために使用される楕円曲線アルゴリズムは、32バイトの数の乗算が含まれているため、はるかに苦痛です)。 SHA-256の1ラウンドの計算には16分45秒かかりました。 このようなパフォーマンスでは、ビットコインブロック全体のハッシュ(128ラウンド[3] )に1.49日かかります。つまり、1日あたりのハッシュレートは0.67ハッシュになります(実際、プロセスは実際にスピードアップします)。 比較のために、現在の世代のビットコインマイナーは、1秒あたり数テラヘッシュを生成します。これは私よりも約100倍高速です。 ビットコインの手動マイニングがあまり実用的でないことは明らかだと思います。 [5]



redditの読者が私のエネルギー消費について尋ねました。 私は深刻な肉体的な努力をしていないので、代謝率は1日あたり1500キロカロリーであると想定できます。その後、手動ハッシュにはハッシュあたりほぼ10メガジュールが必要であることがわかります。 鉄鉱夫の一般的なエネルギー消費量は、ジュールあたり1,000マハッシュです。 したがって、私は特殊な鉄片よりも10 ^ 16倍(10兆個)エネルギー効率が低くなります。 もう1つの質問は、エネルギーのコストです。 200キロカロリーあたり23セントのドーナツは、安価な栄養源です。 私の電気代は1キロワット時あたり15セントで、ドーナツよりも6.7倍安いです。 その結果、人間の鉱山労働者である私にとって、ハッシュに換算したエネルギーコストは67兆倍になります。 はい、ビットコインを手動でマイニングしてテールの運をつかまないことは明らかであり、これは紙とペンのコストを考慮していません!



メモとリンク





1.実際には、ハッシュの先行ゼロの数ではなく、システムの現在の複雑さのレベルに依存する特定の値よりも小さくなければならないという事実が重要です



2.かなり面白いのは、SHA-256のこれらの定数の由来です。 NSAがこのアルゴリズムを開発し、定数を選択したので、ハッシュをより速く破壊するために特別な値を選択しなかったことをどのようにして知ることができますか? このような推測を防ぐために、初期初期化ハッシュ値は、最初の8つの素数(小数部の最初の32ビット)の平方根として取得されます。 そして、K tは最初の64個の素数の立方根から得られます。 ご覧のとおり、定数は単純な式を使用して生成されるため、NSAが(少なくとも定数に関しては)トリッキーなことを何も思いつかなかったことを信頼できます。



3.残念ながら、SHA-256は512ビットのブロックで動作し、ビットコインブロックのヘッダーは大きくなります。 したがって、64ラウンドのハッシュの2回目のパスが必要です。 さらに、ビットコインはダブルSHA-256を使用します。 したがって、単一ブロックのハッシュには192ラウンドが必要です。 それでも、マイニングプロセスでは同じブロックを再ハッシュし、ブロックの後半の「nonce」フィールドを少し変更するだけなので、この数を減らすことができます。 ここで、ブロックの最初の512ビットを繰り返し計算した結果を繰り返し使用できるという事実により、最適化が行われます。 その結果、128ラウンドのハッシュのみが必要になります。



4.もちろん、私はすぐに有効なハッシュを見つけたほど信じられないほど幸運ではありません。 以前にマイニングされたブロックのハッシュを開始しました。 具体的には、すでに記事で言及されているもの- #286819



5.手動マイニングのもう1つの問題は、新しいブロックが約10分ごとにマイニングされることです。そのため、ブロックをマイニングできたとしても、絶望的に古くなってしまいます(ビットコインの観点では孤児)。



All Articles