今日は、なぜ鉱業がそのような量のエネルギーを消費するのか、なぜ必要なのか、どのように販売されるのかについてお話します。 ハッシュアルゴリズム(SHA-256)と、マイナーがプールから「助けを求める」理由について説明します。

/ image シンディシェブリー CC
マイニングとは何ですか?
マイニングは多くの場合、新しいビットコインを作成する方法と見なされますが、これは完全に真実ではありません。 マイニングの主なタスクは、ネットワーク参加者の1人が別のトランザクションで既に使用されているコインを使うことを防ぐために、どのトランザクションが有効であると見なされるかについて合意に達することです。
これを行うために、鉱山労働者は機器の複雑な数学的問題を解決し、電力を消費し、代わりにビットコイン(およびトランザクション処理料金)の形で報酬を受け取ります。
鉱夫の仕事は何ですか
マイナーは、ブロック内のトランザクションに適したハッシュ値を選択し、秘密キーを取得できるという事実に従事しています。 目的のハッシュは 、前のブロックのハッシュ、乱数(nonce)、および過去10分間のトランザクションハッシュの合計に基づいて形成されます。 さらに、システムの条件を満たしている必要があります。宣言されたマイニングの複雑度 (難易度)に対応し、 ターゲットの複雑度 (ターゲット)よりも小さい-目的のハッシュの先頭のゼロビットの数を決定します。
ハッシュの複雑さを計算するには、 bitcoinwiki ページで提供されている修正テイラー級数への展開でアルゴリズムを使用できます 。
#include <iostream> #include <cmath> inline float fast_log(float val) { int * const exp_ptr = reinterpret_cast <int *>(&val); int x = *exp_ptr; const int log_2 = ((x >> 23) & 255) - 128; x &= ~(255 << 23); x += 127 << 23; *exp_ptr = x; val = ((-1.0f/3) * val + 2) * val - 2.0f/3; return ((val + log_2) * 0.69314718f); } float difficulty(unsigned int bits) { static double max_body = fast_log(0x00ffff), scaland = fast_log(256); return exp(max_body - fast_log(bits & 0x00ffffff) + scaland * (0x1d - ((bits & 0xff000000) >> 24))); } int main() { std::cout << difficulty(0x1b0404cb) << std::endl; return 0; }
執筆時点では、ブロックチェーンネットワークの複雑さは2874674234415.941ですが、このパラメーターは2016ブロックごとに再計算されます。 ブロック作成の平均速度(1時間あたり約6個)を維持するために増減します。
SHA-256
ビットコインブロックチェーンでハッシュするためのツールとして、SHA-256アルゴリズムが選択されています。 次に、彼のラウンドの1つを見ていきます 。

/ 8つの入力ワード用のラウンドSHA-256 /ウィキメディア/ kockmeyer / CC
8個の単語がアルゴリズムに入力されたと仮定すると、それらをA、B、C ... Hで示します。関数Maは、単語A、B、Cでビット単位の演算を実行します。受信した値のほとんどがゼロの場合、ゼロも返します。
ブロックΣ0は、ワードAを2、13、および22ビットずつ3回シフトし、生成された値はxor演算でビットごとに加算されます。 ブロックΣ1も同様に機能します。シフトは6、11、25ビットで実行されます。
ブロックChは、Eのビットに基づいて結果のビットを選択する関数です。入力値が1の場合、ワードFの対応するビットが出力され、そうでない場合、ワードGのビットが出力されます。
図の赤い四角は、AおよびEの新しい値を生成する32ビットの追加ブロックです。サイクル全体が64回繰り返され、その後、情報は安全に暗号化されます。
ハッシュ計算プロセスを説明するために、「Bl0Ckchain」および「blockchain」という単語のハッシュを生成するPython コードを次に示します 。
import itertools from hashlib import sha256 # to_long = lambda x: sum(ord(b) << (8*i) for i, b in enumerate(x)) # nonce ; # - . # (":") , PoW # . combine = lambda nonce, msg: str(nonce) + ":" + msg def verify_pow(msg, nonce, difficulty): h = sha256(combine(nonce, msg)).digest() return to_long(h) % (1 << difficulty) == 0 def create_pow(msg, difficulty): for nonce in itertools.count(0): if verify_pow(msg, nonce, difficulty): return nonce def print_pow(msg, nonce): print combine(nonce, msg), sha256(combine(nonce, msg)).hexdigest() #---------------------------------------------------- msg = "Bl0Ckchain" nonce = create_pow(msg, 16) print_pow(msg, nonce) # 6571:Bl0Ckchain 0000d087d242930aaf6ac5a790ae8d8ece6b502cdb70ba07c1168738b253d279 assert verify_pow(msg, nonce, 16) msg = "blockchain" nonce = create_pow(msg, 16) print_pow(msg, nonce) # 43952:blockchain 000027b5022f88d2da21bd2802268966050f5a0b031058ce4562939c13727303 assert verify_pow(msg, nonce, 16) # (1 << difficulty), # msg = "Bl0Ckchain" nonce = create_pow(msg, 16) print_pow(msg, nonce) # 6571:Bl0Ckchain 0000d087d242930aaf6ac5a790ae8d8ece6b502cdb70ba07c1168738b253d279 assert verify_pow(msg, nonce, 16)
しかし、作成されたハッシュのチェックは、作成に多くのリソースが必要な場合でも非常に高速です。
msg = "blockchain" nonce = 5263268363 print_pow(msg, nonce) # 5263268363:blockchain 000000007cf39dfc8fccae534b39b5f362c16891abca02d0e7b1dbd5a129ee17 assert verify_pow(msg, nonce, 32)
SHA-256関数を使用した結果は不可逆的であると見なされるため、マイナーはブルートフォースを使用して「ターゲット」ハッシュを選択します。
Bitcoinプロトコルはダブルハッシュを使用するため、マイナーのタスクは、ハッシュxの2番目の逆画像(ハッシュyの最初の逆画像x、y = H(x)) を見つけることであり、これは条件y = H(x ')を満たします。 ただし、タスクを簡素化するために、マイナーは部分的なプロトタイプ-H(x)/ 2 ^(nk)= 0のみを探しています。 ここで、nは結果の「サイズ」です(SHA256の場合、n = 256ビット)。kは、結果のハッシュのゼロの数を決定する要因です。 たとえば、k = 20の場合、約100万回の試行が必要になります。
したがって、マイナーはブロックヘッダーのnonceパラメータを変更し、複雑性の条件が満たされるまでハッシュを考慮します。 目標に到達すると、ブロックがチェーンに追加されます。
マイニング-ネットワークメンバーの共同努力
ブロックソリューションは非常に複雑です。 現在、ビットコインネットワークのマイナーは1秒あたり約2,000万テラヘッシュを実行しており、この数字は増え続けています。 比較のために、1つのビデオカードは 1秒あたり約30メガキャッシュを生成します。 また、彼のブログで、エンジニアのケン・シリフはペンと紙でブロックを解決しようとしました -彼の業績はさらに控えめでした(1日あたり0.67ハッシュ)。

/ blockchain.infoによると、1秒あたりのテラヘッシュ数
複雑さの増大(および絶えず増大)のため、鉱夫がブロックだけを解決することは困難です。 したがって、それらはプールで結合され、ブロックと報酬を解決する作業を共有します。 プールは鉱夫にタスクを発行し、完了した作業量を監視します。 鉱夫がブロックの決定に対して行った貢献が大きければ大きいほど、彼が受け取る報酬の割合は大きくなります。
完了した作業の割合を評価するために、プールはマイナーに部分的な解決策を見つけるための情報を送信するように依頼します。 たとえば、ビットコインブロックチェーンでブロックハッシュに15個のゼロを含める必要がある場合、プールは作業の証拠として10個のゼロを含む結果を送信するように要求する場合があります。 これは何百万回も簡単であり、鉱夫はそのような解決策を1時間に数回受け取ります。
プールと鉱夫の相互作用を組織するための特別なプロトコルがあります。 たとえば、ほとんどのプールで使用される Stratumプロトコル( Getwork 、 Getblocktemplateなど)があります。 Ken Shirrif は、彼のブログで、タスクの発行時にプールから送信されるコードを提供しています。このコードには、ブロックの作業を開始するために必要なすべての情報が含まれています。
ブロックが解決されると、プールは賞に適切なトランザクションを生成し、ヘッダーを承認してブロックを検証します。 プールの外にいる鉱夫によってブロックが決定された場合、サービスは参加者に新しいタスクを提供します。 この場合、鉱夫はハッシュ選択の報酬を受け取りません。
基本的に、ビットコインマイニングは一種の「軍拡競争」に似ています。 当初、人々はCPUを使用して暗号通貨を採掘しましたが、CPUパワーは十分ではなく、業界はGPUと専用の ASIC 機器に切り替えました。
発行されるビットコインの数を規制することに加えて、コンピューティングの複雑さを増すことは、ブロックチェーンに対する攻撃に対する防御として機能することに注意してください。 大規模なネットワークでパーソナルコンピューターを使用してマイニングを行うことが有益である場合、攻撃者は攻撃のための機器を見つけやすくなります。 ハードウェアへの投資の必要性は、制限要因であり、追加の保護メカニズムです。
しかし、テクノロジーと「現実世界」へのそのようなリンクには欠点があります。 既に述べたように、マイニングはエネルギー消費の観点から見てかなり「高価な」活動です。 現在、ビットコインブロックチェーンは年間48 TW /時間を消費し 、チップの冷却に使用されるエネルギーの30〜40%を占めています。
ただし、消費されるエネルギー量は、採掘の収益性が低下するため、ブロック報酬の次の減少が発生する2020年以降、徐々に減少し始めると考えられています。 この場合、マイナーがブロックチェーン上の情報を保護し続けるように動機付ける効果的な方法は 、トランザクション処理手数料からの収益を増やすことです。
そのためには、ブロックチェーン技術のエコシステムに対する公共の関心を高め続けることが重要です。 これにより、将来、ビットコインブロックチェーンを、 許可されたブロックチェーンとサイド チェーンの一種の「アービター」として使用できるようになり、新世代の金融システムが作成されます。
ブログからブロックチェーンの作業に関する資料をさらに提供します: