ビットコインの概要-マイニング

暗号通貨のトピックから無限に遠く離れている人々でさえ、おそらくマイニングについて聞いたことがあるでしょう。 読者の皆さん、おそらくあなたは夜にゲームのPentium 4を起動し、午前中に豊かな目覚め方をすることを考えたでしょう。







しかし、ブロックチェーンの世界ではよくあることですが、聞いた人はたくさんいますが、最初から最後までプロセスを本当に理解している人はわずかです。 したがって、最後の章では、PoWの技術的な実装から、ビデオカードでのマイニングの収益性で終わるすべての微妙な点を可能な限り詳細にカバーしようとしました。







mining_meme











目次



  1. 私が5歳だと説明してください
  2. 空は限界ですか?
  3. 報酬
  4. ハードチャレンジ
  5. 技術面
  6. 2ブロック1チェーン
  7. ハードウェア
  8. おわりに
  9. リンク集


私が5歳だと説明してください



マイニングマイニング英語の マイニング -マイニング)-分散プラットフォームを維持し、さまざまな暗号通貨 、特にビットコインで発行された通貨および手数料の形で報酬を受け取ることができる新しいブロックを作成するアクティビティ。 計算は、同じ通貨単位の再利用に対する保護を提供するために必要であり、マイニングと排出量の関係は、人々が計算能力を費やし、ネットワークの運用をサポートするように刺激します- ウィキペディア

指の場合、マイニングはビットコインの重要なプロセスであり、新しいブロックを作成し、2つの目標を同時に追求することから成ります。 1つ目は、マネーサプライの生産です。 鉱夫が新しいブロックを作成するたびに、N番目の数のコインで報酬が与えられます。それにより、彼はどこかでそれを使い、ネットワークに新しい資金を投入します。







2番目のはるかに重要な目標は、ネットワーク全体の動作を保証することです。 確かに、以前の記事を読んでいるときに、 「トランザクションスクリプトをチェックするのは誰ですか?」という質問をすでに自問しています。 または「すでに使用されている出力を入力として指定した場合、どの時点で気づくでしょうか?」







したがって、これらすべてのアクションは主に鉱夫によって実行されます。 実際、ネットワークの各メンバーはある程度セキュリティを確保しています。 100 GBをダウンロードする必要があるためではなく、すべてのバイトをチェックし、すべてのハッシュをカウントし、すべてのスクリプトを実行する必要があるため、Bitcoinを長時間同期します。







しかし、ウォレットの「送信」ボタンを押して開始し、 blockchain.infoのどこかのトランザクションでブロックを表示することで終わるプロセス全体を描画する場合、トランザクションがブロック内にあるかどうかを決定するのは鉱夫です。







空は限界ですか?



いや







はじめに、最初のポイントをもう一度調べて、マネーサプライの概念について説明しましょう。







暗号通貨の支持者がしばしば誇示する基本的なチップの1つはデフレであり、これは元々定められていました 。 これは、システム設計の段階でも、合計で約2100万コインの制限が示されていたためです。実際に必要な場合でも、このしきい値を上げることはできません。 財務省の要求に応じて任意の数量で印刷できるルーブルやドルとは異なり、 ジンバブエのように悲しい結果を招くことがあります







ところで 、だれもがデフレがそのような明確なプラスだと考えているわけではありません。







報酬



次の良い質問は、2100万人という数字はどこから来たのですか?







特定の瞬間に発行されたコインの量はその瞬間に作成されたブロックの報酬の量に等しいことを理解していると思います。 新しいコインがネットワークに入る方法は1つしかないため、かなり明白な事実です。







しかし、報酬は固定されておらず、さらに210,000ブロックごと(約4年に1回)に半分になります。







consensus.nSubsidyHalvingInterval = 210000; // https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp#L73
      
      





したがって、たとえば、2009年1月にすべてが始まったとき、ブロック報酬は50 BTCでした。 210,000ブロック後、2012年11月に25 BTCに低下し、最近では2016年7月9日に12.5 BTC低下しました







ビットコインが次の200年で失速しないと仮定すると、生成されるサトシの正確な数を計算するのは簡単です。







 start_block_reward = 50 reward_interval = 210000 def max_money(): # 50 BTC = 50 0000 0000 Satoshis current_reward = 50 * 10**8 total = 0 while current_reward > 0: total += reward_interval * current_reward current_reward /= 2 return total print "Total BTC to ever be created:", max_money(), "Satoshis" # Total BTC to ever be created: 2099999997690000 Satoshis
      
      





以下の図は、生産曲線を示しています。これは、2140万BTCのマークに徐々にスムーズに近づき、2140年頃にピークに達します。 この時点で、ブロック報酬は0 BTCになります。







btc_curve







その場合、ビットコインに何が起こるかを推測することしかできませんが、私たちが確実に知ることができることの1つは、鉱夫がお金なしで放置されることはありません。 少なくとも取引手数料はまだありますが、もう1つは、この手数料が1桁増える可能性があることです。







明確にするために、たとえば#447119のような新しいブロックを使用します。 ブロック内のすべてのトランザクションからのコミッションの金額は約0.78 BTCですが、報酬は12.5 BTCです。 つまり、明日報酬がなくなると、この場合、この不快なイベントを平準化するために、委員会は16倍以上成長するはずです。 もはやマイクロペイメントの臭いがしないことは明らかです。







ダミーのマイニング



これまでの原始レベルでマイニングプロセスをもう一度紹介してみましょう。







多数の参加者がいるネットワークがあります。 一部の参加者は自分自身をマイナーと呼んでいます。PCで新しいトランザクションを収集し、有効性をチェックしてから、何らかの方法新しいブロックをマイニングし、このブロックをネットワーク上に分散してお金を受け取る準備ができています。 論理的な質問は、すべてが非常に単純な場合、ネットワークのすべてのメンバーがこれを行わないのはなぜですか?

すべてが今説明したとおりである場合、ブロックは1秒間に100回出て行き、通貨が多すぎて誰も1セントも払えないなどということは明らかです。







そのため、サトシは次の特性を備えたアルゴリズムを考案することを余儀なくされました。









作業証明(PoW)



おそらくあなたは今、完全な衰弱状態にあり、これがどのように可能であるかを本当に理解していないでしょう。 しかし、サトシは途方に暮れておらず、これらすべての問題の解決策を考え出すことができました-アルゴリズムはProof-of-Workと呼ばれていました、これはどのように見えるかです







あなたを鉱夫にしましょう。 ブロックにマイニングしたいトランザクションが10個あります。 これらのトランザクションの有効性をチェックし、それらからブロックを形成し、 nonceフィールドに0を指定して、ブロックハッシュを検討します。 次に、 nonceを1に変更して、ハッシュを再度カウントします。 無限へと続きます。



あなたの仕事は、ブロックハッシュ(256ビット数)が所定の数N未満になるようにノンスを見つけることです。そのようなハッシュの検索は、ノンスを簡潔に列挙することによってのみ可能です。ここには美しいアルゴリズムはありません。 したがって、 nonceをすばやく見つけるには、より多くの電力が必要です。



数値Nはまさにそのパラメーター( targetとも呼ばれます)であり、ネットワークは鉱夫の総出力に応じて調整します。 明日、ブロックが3分ごとに出てきたら、Nが何らかの形で減少し、 ノンスの検索に時間がかかり、 ブロック時間が再び10分に増えます。 そしてその逆。


技術面



アルゴリズムの一般的なビュー







言葉から行動に移り、 Proof-of-Workとマイニングどのように一般的に機能するかを示します。 私の謙虚な意見では、戦闘全体のプロセスを正しく示すことほど良いものはありません。 これを行うには、すぐに独自のマイニングノードを記述し、成功する可能性はわずかですが、他の誰よりも先に新しいブロックを作成しようとします。







取引を受け取る



良い方法では、ここで再びプロトコル仕様に飛び込み、他のノードとの接続を確立し、新しいトランザクションが送信されるのを待つ必要があります。 この場合、実際のリアルタイムマイナーが得られ、既製のソリューションよりも悪くはありません(ただし、これは正確ではありません)。







簡単な方法をお勧めします。 blockchain.infoを開き、 最近のトランザクションリストからいくつかのトランザクションを選択します。 彼らはちょうどネットワークに入って、今のところどのブロックにも含まれていません。 次に、別のブロックエクスプローラー-chainquery.comを開きます。 彼は、生の形式でトランザクションを発行する方法を知っており、ハッシュによって既知の形式でトランザクションを取得します。 私は自分を2つ( 1つ2つ )に制限しました。







 txn_pool = [] txn_pool.append("0100000001440d795fa6267cbae00ae18e921a7b287eaa37d7f41b96ccbc61ef9a323a003d010000006a47304402204137ef9ca79bcd8a953c0def89578838bbe882fe7814d6a7144eaa25ed156f66022043a4ab91a7ee3bf58155d08e5f3f221a783f645daf9ac54fed519e18ca434aea012102965a03e05b2e2983c031b870c9f4afef1141bf30dc5bb993197ee4a52f1443e0feffffff0200a3e111000000001976a914f1cfa585d096ea3c759940d7bacd8c7259bbd4d488ac4e513208000000001976a9146701f2540186d4135eec14dad6cb25bf757fc43088accbd50600") txn_pool.append("0100000001517063b3d932693635999b8daaed9ebf020c66c43abf504f3043850bca5a936d010000006a47304402207473cda71b68a414a53e01dc340615958d0d79dd67196c4193a0ebcf0d9f70530220387934e7317b60297f5c6e0ca4bf527faaad830aff45f1f5522e842595939e460121031d53a2c228aedcde79b6ccd2e8f5bcfb56e2046b4681c4ea2173e3c3d7ffc686ffffffff0220bcbe00000000001976a9148cc3704cbb6af566598fea13a3352b46f859581188acba2cfb09000000001976a914b59b9df3700adae0ea819738c89db3c2af4e47d188ac00000000")
      
      





確認する



次のステップは、受信したトランザクションを検証することです。 私はこれをしません、ただ主なポイントをリストしてください:









一部のマイナーは、手数料がゼロまたは少なすぎるトランザクションを拒否しますが、誰もが自分で決定します。







並べ替え



念のため、ブロックにトランザクションを任意の順序で含めることを妨げるものは何もないと説明します。主なことは、すべてのチェックに合格することです。 私の場合、トランザクションは2つしかないので、それらをさらにソートしても意味がありません。 ただし、ブロックサイズが1 MBに制限されていることを忘れないでください。したがって、プール内に10,000件のトランザクションがある場合、それらを手数料でソートし、最も高価なトランザクションのみをブロックに書き込むのが合理的です。







ところで 、新しいブロックをマイニングする前に、Bitcoin Coreは特別な優先度パラメーターでトランザクションをソートすると言う記事/本があります。







 Priority = Sum (Value of input * Input Age) / Transaction Size
      
      





これはバージョン0.12.0まで当てはまり、 優先度によるソート 無効になりました







報酬を得る



ブロックする







ブロックの構造を見ると、一番最初は常にいわゆるコインベーストランザクションになります-鉱夫の住所に報酬を送るのは彼女です。 通常のトランザクションとは異なり、 coinbaseトランザクションUTXOプールからの出口を入力として費やしません。 代わりに、 coinbaseと呼ばれる入力が1つだけあり、これは何もないところからコインを「作成」します。 このようなトランザクションから抜け出す方法は1つしかありません。 彼は、鉱夫にブロックの報酬に加えて、ブロック内のすべての取引からの手数料を送ります。 私の場合、これは12.5 + 0.00018939 + 0.0001469 = 12.50033629



です。







コインベーストランザクションの構造、より具体的にはその入力を詳しく見てみましょう。 念のため、「通常の」トランザクションの入力は次のようになります。













コインベーストランザクションに入る際の3つの違いは次のとおりです。









多くの場合、いわゆるエクストラナンスが コインベースデータに挿入されます 。詳細はこちらをご覧ください 。 一番下の行は、目的のnonceが見つからない可能性があることです。この場合、ブロックのハッシュはtarget未満です(実際、これはほとんどの場合に発生します)。 その後、トランザクション内の何かを変更して、他のハッシュ( UNIXタイムスタンプなど)を取得します。 しかし、 Bitcoinを一言で言えば-Blockchainと読むと、タイムスタンプも変更できないことがわかります。そうしないと、他のノードがブロックを拒否します。 解決策は非常にシンプルであることが判明しました。 コインベースデータに数値を追加し、現在のヘッダーで現在のナンスが見つからなかった場合は変更するだけです。







新しいトランザクションの作成プロセスについては、 Bitcoin in a nutshell -Protocolの章で詳細に説明されているため、ここではすでに取得したコインベーストランザクションを示します。通常のすべてのコードは[Github]()で利用できます。







 coinbase_txn = "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff8a47304402207e8495986ec27ed4556fee9dcd897ea028d4eb2023959c2299eb573e0771dee702201489e40115ccc45d4c23f1109cb56b513543517f3efc0031965ad94d94d3d2d901410497e922cac2c9065a0cac998c0735d9995ff42fb6641d29300e8c0071277eb5b4e770fcc086f322339bdefef4d5b51a23d88755969d28e965dacaaa5d0d2a0e09ffffffff01ddff814a000000001976a91478e10cf8e4bd38266d8fd4ed5c8b430d30a3cde888ac00000000"
      
      





これらの3つのトランザクションのマークルルートを計算するだけです。 これを行うには、 Bitcoinのコードフラグメントを一言で言えばブロックチェーンを使用します。







 txn_pool.insert(0, coinbase_txn) txn_hashes = map(getTxnHash, txn_pool) print "Merkle root: ", merkle(txn_hashes) # Merkle root: 4b9ff9ab901df82050f858accde99b9169067acafaeade25598ea5505fb53836
      
      





対象



上で書いたように、すべてのマイニングは、 targetと呼ばれる数よりも少ないブロックハッシュを見つけることになります。 ブロック構造では、この番号はビットフィールドに書き込まれます。たとえば、ブロック#277,316の場合、 ターゲット1903a30c









 $ bitcoin-cli getblock 0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4 { "hash" : "0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4", "confirmations" : 35561, "size" : 218629, "height" : 277316, "version" : 2, "merkleroot" : "c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e", "tx" : ["d5ada064c6417ca25c4308bd158c34b77e1c0eca2a73cda16c737e7424afba2f", 418 more transactions], "time" : 1388185914, "nonce" : 924591752, "bits" : "1903a30c", // Here it's "difficulty" : 1180923195.25802612, "chainwork" : "000000000000000000000000000000000000000000000934695e92aaf53afa1a", "previousblockhash" : "0000000000000002a7bbd25a417c0374cc55261021e8a9ca74442b01284f0569", "nextblockhash" : "000000000000000010236c269dd6ed714dd5db39d36b33959079d78dfd431ba7" }
      
      





実際、ビットでは、2つの数値が一度に書き込まれます。最初のバイト0x19



は指数で、残りの3バイト0x03a30c



は仮数です。 ビットからターゲットを取得するには、 target = mantissa * 2^(8 * exponent - 3))



式を使用する必要があります。 ブロック#277.316の場合、次のことがわかります。







 >>> bits = 0x1903a30c >>> exp = bits >> 24 >>> mant = bits & 0xffffff >>> target_hexstr = '%064x' % (mant * (1 << (8 * (exp - 3)))) >>> target_hexstr '0000000000000003a30c00000000000000000000000000000000000000000000'
      
      





マイニングの複雑さを反映する別の用語は難易度です。 たとえば、ブロック#449.584の場合、 392,963,262,344.37



。 このパラメーターはmax_target / current_target



の比率です。ここで、 max_target



は可能な最大ターゲット、つまり0x00000000FFFF0000000000000000000000000000000000000000000000000000



(ビット形式で0x1d00ffff



)です。 通常、すべてのブロックエクスプローラーで指定されるのはビットです。







ところで、ターゲットが小さいほど難易度は高くなり、逆もまた同様です。







パウ



すべてのニュアンスを理解したので、マイナーを実行できます。







 import hashlib import struct import sys # ======= Header ======= ver = 2 prev_block = "000000000000000000e5fb3654e0ae9a2b7d7390e37ee0a7c818ca09fde435f0" merkle_root = "6f3ef687979a1f4866cd8842dcbcebd2e47171e54d1cc76c540faecafe133c39" bits = 0x10004379 # Not the actual bits, I don't have synced blockchain timestamp = 0x58777e25 # Calculate current time with this code: # hex(int(time.mktime(time.strptime('2017-01-12 13:01:25', '%Y-%m-%d %H:%M:%S'))) - time.timezone) exp = bits >> 24 mant = bits & 0xffffff target_hexstr = '%064x' % (mant * (1 << (8 * (exp - 3)))) # '0000000000000000000000000000000000437900000000000000000000000000' target_str = target_hexstr.decode('hex') # ======== Header ========= nonce = 0 while nonce < 0x100000000: # 2**32 header = ( struct.pack("<L", ver) + prev_block.decode('hex')[::-1] + merkle_root.decode('hex')[::-1] + struct.pack("<LLL", timestamp, bits, nonce)) hash = hashlib.sha256(hashlib.sha256(header).digest()).digest() sys.stdout.write("\rNonce: {}, hash: {}".format(nonce, hash[::-1].encode('hex'))) sys.stdout.flush() if hash[::-1] < target_str: print 'Success!' break nonce += 1
      
      





ハッシュレート



大切なラインを待っているならSuccess!



、その後、Intel Core i7を使用するか、または多くの空き時間があります。 現在の複雑さは単純に途方もなく大きいため、このコードがいつ作業を終了し、 ノンスを見つけるかどうかはわかりません。 プログラムが1秒あたり100,000ハッシュを計算できると仮定しても(そうではありません)、実際のマイナーよりも数百倍遅いので、 nonceを検索するのに数日かかることがあります。







問題の範囲を把握するために、 ハッシュレートメトリックがあります。 これは、ビットコインネットワークのマイナーの総出力を反映し、測定単位は1秒あたりSHA256ハッシュです。 彼女のスケジュールは次のとおりです。







ハッシュレート







ハッシュレートは2,000 PH / s = 2,000,000 TH / s = 2,000,000,000 GH / s = 2,000,000,000,000 MH / s = 2,000,000,000,000,000 KH / sと仮定します。 そして、私たちのプログラムは100 KH / sをマスターすることさえできないので、ネットワーク全体と競合する意味はありません。







2ブロック1チェーン



フォーク



鉱山労働者がブロック#123456を探していると想像してみましょう。 ほぼ同時に、彼は2人の独立した鉱夫によって発見されました。1人はオーストラリアに、もう1人は米国に住んでいます。 それぞれがブロックのバージョンをネットワーク上にばらまき始め、その結果、世界の半分には1つのブロックチェーンがあり、もう1つには別のブロックチェーンがあることがわかります。







これは可能ですか、この場合はどうなりますか?







fork1







はい、可能です。 さらに、これは非常に頻繁に起こります。 この場合、各ノードは、誰かが次のブロックを見つけるまで、独自のバージョンのブロックチェーンに従います。 下の図のように、新しいブロックが緑の枝を継続するとします。







fork2







この場合、ルールはビットコインの世界で機能するため、「赤」バージョンに準拠しているノードは緑のノードを自動的に同期しますブロックチェーンの最長バージョンは「true」です。 ブロックチェーンの「赤」バージョンは、それを見つけた人への報酬とともに、単に忘れられます。







あなたは尋ねることができます:フォークがさらに進むとどうなりますか? つまり、「パープル」ブロックと同時に、彼らはブロックチェーンの「レッド」バージョンを継続する別のブロックを見つけますか?







ほとんどの場合、この本は数学教育の優れた人々だけでなく読むことができるので、最も一般的な答えを示します-これは確かに可能です。 しかし、最初の分岐でさえ確率はかなり小さく、2番目の分岐はさらに小さくなります。 あなたが理解するために、ビットコインの歴史の中で最も長い分岐点はたった4ブロックでした。 そのため、ある時点でブランチの1つが先を破り、ネットワーク全体がそこに行きます。







確率論の観点からこの問題に興味がある場合は、「ブロックチェーンで分岐する確率は?」と読むことができます この質問は、 中本Sによる有名な「ビットコイン:ピアツーピア電子現金システム」に詳しく説明されています。







51%の攻撃



ブロックチェーンの中で最も長いチェーンが支配的であるという単純な事実に基づいて、攻撃全体は次のことに基づいています。







あなたが詐欺師であり、店で1000 BTCで商品を購入していると想像してください。 あなたは売り手に同意し、彼にお金を送ります。 売り手はブロックチェーンをチェックし、そのようなトランザクションが実際にあったことを確認し、すべてのチェックに合格し、#123などのブロックにさえ入りました。 その後、売り手は郵便に行き、あなたに商品を送ります。



この時点で、マイニングファームをオンにして、ブロック#122からマイニングを開始します 。 十分なパワーがある場合は、ネットワークの残りを追い越して、ブロック#124までの最速を数えることができます。その後、全世界がブロックチェーンのバージョンに切り替わります。 同時に、どのブロックにも1000 BTCのトランザクションを含めることはありません。つまり、これまでになかったように、永遠に忘れられることになります。 その結果、売り手は商品を失い、お金を受け取れなくなります。

確率論については説明しませんが、ネットワーク全体の少なくとも半分のハッシュレートがない限り、このような攻撃を実行することはできません。 詳しくはbitcoin.pdfをご覧ください







それにもかかわらず、一部のマイニングプールには非常に大きな容量があります。 たとえば、2013年のBTCギルドは、51%のハッシュレートのしきい値をほぼ超えました 。 ある時点で、彼らはすぐに6ブロックを連続して採掘したので、望むなら、彼らはこの攻撃を実行することができました。 したがって、上から6ブロックが作成された後にのみ、トランザクションを確認することをお勧めします。







ハードウェア



CPUまたはGPUでのマイニングをすぐに忘れることができます。 理解のために、2017年の初めのハッシュレートを以下に示します。 平均して2.300.000 TH / S、つまり2.300.000.000.000 MH / sと仮定します。 比較のために、 ATI Radeon HD 5870 EyefinityAMD Radeon HD 7970(x3)などの最も残忍なビデオカードは、 せいぜい2000 MH / S しか提供しません プロセッサの中で、最初の場所は面白い140 MH / sのXeon Phi 5100で占められています。







ハッシュレート







したがって、1000ドル/ BTCのレートに基づいて、10.000 MH / sを手元に持っている場合でも、 平均20セントを獲得できます。







GPU







CPUマイニングは2011年に利益を失い、GPUは2013年頃まで維持されましたが、いわゆる特定用途向け集積回路ASIC)が普及したときに燃え尽きました。 これらは、鉄のレベルでの採掘のために研がれた特別なチップです。 最も単純なものは約100ドルで、トップエンドのビデオカードよりもはるかに安価ですが、同時に1 TH /秒から生産できます。







つまり、それぞれ$ 3.000で2つのAntminer S9備えたceteris paribusを使用すると、 月額約700ドル (電気料金を除く)を獲得できます













しかし、それだけではありません。 マイニングプールで他のマイナーとチームを組んで一緒にマイニングを開始し、獲得したお金を投資したキャパシティに応じて分配できます。 これは明らかに、少なくとも単独で何かを稼ごうとするよりもはるかに有益です。だからこそ、今日のプールは鉱業の世界における主要な原動力です。 2017年初 、プール市場の主役AntPoolF2PoolBitfuryで 、ネットワーク全体の40%以上のハッシュレートを提供します。







プール







おわりに



このハイノートで、ビットコインの技術的デバイスに関する私の話を終わります。 テキストのソースとここにあるコード例(同じPDFバージョン)。 プルリクエストを歓迎し、問題またはコメントで質問します。







オバマ・アウト












All Articles