Bitcoin in a nutshell — Mining

Навіть люди, безмежно далекі від теми криптовалют, швидше за все чули про майнінг. Напевно і ти, дорогий читачу, замислювався про те, щоб включити свій ігровий Pentium 4 на ніч, а вранці прокинутися вже багатим.
Але, як це часто трапляється в світі блокчейна, тих хто чув — багато, а от тих, хто реально розуміє процес від початку до кінця, — одиниці. Тому в останній главі я пострался максимально докладно охопити всі тонкощі, починаючи від технічної реалізації PoW, закінчуючи рентабельністю майнінгу на відеокартах.
mining_meme
Book
Table of content
  1. Explain me like i'm five
  2. Sky is the limit?
  3. Reward
  4. Hard challenge
  5. Technical side
  6. 2 Blocks 1 Chain
  7. Hardware
  8. Завершення
  9. Links
Explain me like i'm five
Майнінг, видобуток (від англ. mining — видобуток корисних копалин) — діяльність з підтримки розподіленої платформи і створення нових блоків з можливістю отримати винагороду в формі емітованої валюти і комісійних зборів у різних криптовалютахзокрема Біткойн. Вироблені обчислення потрібні для забезпечення захисту від повторного використання одних і тих же одиниць валюти, а зв'язок майнінгу з емісією стимулює людей витрачати свої обчислювальні потужності і підтримувати роботу мереж — Wikipedia
Якщо на пальцях, то майнінг — це критично важливий для Bitcoin процес, що складається в створенні нових блоків і переслідує відразу дві мети. Перша — виробництво грошової маси. Кожен раз, коли майнер створює новий блок, йому за це належиться нагорода в N-е число монет, які він потім де-небудь витрачає, тим самим запускаючи в мережу нові кошти.
Друга, і куди більш важлива мета — забезпечення роботи всієї мережі. Напевно, читаючи попередні статті, ви вже задавали собі питання "Хто той чоловік, який перевіряє скрипти транзакцій?" або "Якщо в якості входу я вкажу вже використаний вихід, в який момент це помітять?".
Так от, всі ці дії виконують в першу чергу майнеры. Ну, насправді кожен учасник мережі в тій чи іншій мірі забезпечує її безпеку. Синхронізувати Bitcoin так довго не тому що доводиться качати 100 ГБ, а тому що треба перевірити кожен байт, порахувати кожен хеш, запустити кожен скрипт і так далі.
Але якщо намалювати весь процес, починаючи з натискання кнопки "Send" в гаманці і закінчуючи переглядом блоку з вашої транзакцією де-небудь на blockchain.info, то саме майнеры будуть вирішувати, виявиться ваша транзакція в блоці чи ні.
Sky is the limit?
nope
Для початку давайте ще раз пройдемося по першому пункту і обговоримо поняття грошової маси.
Одна з фундаментальних фішок, якої часто хизуються прихильники криптовалют — закладена спочатку дефляція. Це пов'язано з тим, що ще на етапі проектування системи, було зазначено сумарне обмеження в 21 мільйон монет (приблизно), і навіть якщо дуже сильно захотіти, підняти цей поріг не вийде. На відміну від рублі або долари, які за бажанням казначейства можуть бути надруковані в будь-якій кількості, що іноді призводить до сумних наслідків, як в Зимбабве.
BTW не всі вважають дефляцію таким вже однозначним плюсом.
Reward
Наступний хороше питання — звідки взялася цифра в 21 мільйон?
Я думаю ви розумієте, що сума випущених монет в конкретний момент часу дорівнює сумі винагород за блоки, створені до цього моменту. Досить очевидний факт, враховуючи що існує тільки один шлях, по якому нові монети потрапляють в мережу.
Але винагорода не фіксовано, і більше того, кожні 210.000 блоків (приблизно раз у 4 роки) воно зменшується в два рази.
consensus.nSubsidyHalvingInterval = 210000;
// https://github.com/bitcoin/bitcoin/blob/master/src/chainparams.cpp#L73

Так, наприклад, коли все починалося у січні 2009, нагорода за блок становила 50 BTC. Через 210.000 блоків, в листопаді 2012 року вона впала до 25 BTC, і зовсім недавно, 9 липня 2016, знизилася до 12.5 BTC.
Нескладно порахувати точну кількість Сатоши, які будуть вироблені на світ, якщо припустити, що Bitcoin не затихне в найближчі 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
total return

print "Total BTC ever to be created:", max_money(), "Satoshis"
# Total BTC ever to be created: 2099999997690000 Satoshis

На картинці нижче зображена крива видобутку, яка буде все більш плавно підходити до позначки в 21 мільйон BTC, досягнувши піку приблизно в 2140 році. В цей час нагорода за блок стане 0 BTC.
btc_curve
Залишається тільки гадати, що тоді станеться з Bitcoin, але одне ми можемо знати точно — зовсім без грошей майнеры не залишаться. Як мінімум у них ще є transaction fee, інша справа, що ця сама комісія може на порядок збільшитися.
для наочності Візьмемо який-небудь свіжий блок, наприклад, #447119. Сума комісій з усіх транзакцій в блоці складає приблизно 0.78 BTC, при тому що винагорода за нього — 12.5 BTC. Тобто якщо завтра reward зникне, то в нашому випадку комісія повинна зрости більш ніж у 16 разів, щоб нівелювати це неприємна подія. Зрозуміло, що ніякими мікроплатежами тут вже і не пахне.
Mining for dummies
Давайте спробуємо ще раз представити процес майнінгу на нашому, поки що примітивному рівні.
Існує мережа з купою учасників. Деякі з учасників називають себе майнерами — вони готові збирати на своєму ПК нові транзакції, перевіряти їх на валідність, потім якимось чином майнить з них новий блок, розкидати цей блок по мережі і отримувати за це гроші. Логічне запитання — якщо все так просто, то чому цим не займається кожен учасник мережі?
Зрозуміло, що якщо все було б так, як я зараз описав, то блоки виходили б за сто разів в секунду, валюти було б стільки, що за неї ніхто не дав би й цента, і так далі.
Тому Сатоши був змушений придумати алгоритм, з наступними властивостями:
  • Створення нового блоку — обчислювально складне завдання. Не можна ось так просто включити потужний ПК і за хвилину намайнить сто блоків.
  • На обчислення нового блоку у всій мережі йде 10 хвилин (у середньому). Якщо подивитися на Litecoin, то там блоки виходять раз на 2-3 хвилини, суть полягає саме в тому, що середній час заздалегідь встановлено.
  • Більш того, це час не залежить від числа учасників мережі. Навіть якщо одного разу майнер стане в сто разів більше, то алгоритм повинен так змінити свої параметри, щоб блок стало складніше знаходити, і block time опустився назад у околиця десяти хвилин.
  • Пам'ятаємо, що мережа розподілена і однорангова, а значить, вона повинна сама розуміти, в який момент і як потрібно підкрутити ці параметри. Ніяких керуючих нод, все повністю автономно.
  • Якщо рішення задачі по створенню нового блоку — це складне завдання, що вимагає часу і ресурсів, то перевірка блоку "коректність" повинна бути простою і практично миттєвою.
Proof-of-Work (PoW)
Швидше за все ви зараз перебуваєте в повній прострації і не дуже розумієте, як таке взагалі можливо. Але Сатоши не розгубився і зміг придумати рішення для всіх цих проблем — алгоритм отримав назву Proof-of-Work, ось так він виглядає (раджу спочатку прочитати Bitcoin in a nutshell — Blockchain):
Нехай ви — майнер. У вас є 10 транзакцій, які ви хочете замайнить в блок. Ви перевіряєте ці транзакції на валідність, формуєте з них блок, у поле nonce вказуєте 0 і вважаєте хеш блоку. Потім міняєте nonce на 1, знову вважаєте хеш. І так до нескінченності.

Ваше завдання — знайти такий nonce, при якому хеш блоку (256 бітне число) менше наперед заданого числа N. Пошук такого хеша можливий тільки тупим перебором nonce, ніяких красивих алгоритмів тут немає. Тому чим швидше ви хочете знайти nonce, тим більше потужностей вам знадобиться.

Число N — саме той параметр (його ще називають target), який мережа налаштовує в залежності від сумарної потужності майнер. Якщо завтра блоки почнуть виходити, умовно кажучи, раз в три хвилини, N буде якось зменшено, часу на пошук nonce потрібно більше і block time знову зросте до 10 хвилин. І навпаки.
Technical side
Загальний вигляд алгоритму
Саме час перейти від слів до справи і продемонструвати, як працює Proof-of-Work і майнінг в цілому. А на мою скромну думку, немає нічого краще, ніж показати взагалі весь процес прямо в бойових умовах. Для цього ми зараз з ходу напишемо свою майнінг ноду і навіть спробуємо зробити новий блок раніше за всіх, хоча шанси на успіх невеликі.
Receive transactions
По-хорошому тут потрібно знову занурюватися в специфікацію протоколу, встановлювати контакт з іншими нодами і чекати, поки нам пришлють свіжі транзакції. В цьому випадку у нас вийде справжнісінький real-time майнер, нічим не гірше вже готових рішень (але це не точно).
Я пропоную піти спрощеним шляхом. Відкриваємо blockchain.info і вибираємо кілька транзакцій зі списку "Останні транзакції". Вони тільки-тільки потрапили в мережу і поки що не входять ні в один з блоків. Далі відкриваємо інший block explorer — chainquery.com. Він вміє видавати транзакції в сирому форматі та за хэшам отримуємо транзакції у вже знайомому нам вигляді. Я обмежився двома (раз два):
txn_pool = []
txn_pool.append("0100000001440d795fa6267cbae00ae18e921a7b287eaa37d7f41b96ccbc61ef9a323a003d010000006a47304402204137ef9ca79bcd8a953c0def89578838bbe882fe7814d6a7144eaa25ed156f66022043a4ab91a7ee3bf58155d08e5f3f221a783f645daf9ac54fed519e18ca434aea012102965a03e05b2e2983c031b870c9f4afef1141bf30dc5bb993197ee4a52f1443e0feffffff0200a3e111000000001976a914f1cfa585d096ea3c759940d7bacd8c7259bbd4d488ac4e513208000000001976a9146701f2540186d4135eec14dad6cb25bf757fc43088accbd50600")
txn_pool.append("0100000001517063b3d932693635999b8daaed9ebf020c66c43abf504f3043850bca5a936d010000006a47304402207473cda71b68a414a53e01dc340615958d0d79dd67196c4193a0ebcf0d9f70530220387934e7317b60297f5c6e0ca4bf527faaad830aff45f1f5522e842595939e460121031d53a2c228aedcde79b6ccd2e8f5bcfb56e2046b4681c4ea2173e3c3d7ffc686ffffffff0220bcbe00000000001976a9148cc3704cbb6af566598fea13a3352b46f859581188acba2cfb09000000001976a914b59b9df3700adae0ea819738c89db3c2af4e47d188ac00000000")

Check
Наступним кроком потрібно перевірити отримані транзакції. Я цього робити не буду, просто перерахую основні пункти:
  • Вірно дотримані структура і синтаксис транзакції
  • Список входів / виходів не може бути порожнім
  • Транзакції на вході повинні існувати або в UTXO pool, або в пулі непідтверджених транзакцій
  • Сума входів не менше суми виходів
  • Повний список можете знайти на тут
Деякі майнеры відкидають транзакції з нульовою або дуже маленькою комісією, але це кожен вирішує сам.
Sort
На всякий випадок поясню, що ніщо не заважає вам включати транзакції в блок в якому порядку, головне, щоб вони пройшли всі перевірки. В моєму випадку транзакцій всього дві, тому сортувати їх тим більше немає ніякого сенсу. Але не варто забувати, що розмір блоку обмежений 1 МБ, тому якщо у вас в пулі 10.000 транзакцій, то буде розумно відсортувати їх за комісії і записати в блок тільки самі "дорогі".
BTW Часто трапляються статті / книги, в яких сказано, що перед майнингом нового блоку, Bitcoin Core сортує транзакції за спеціальним параметром priority, який вважається як
Priority = Sum (Value of input * Input Age) / Transaction Size

Це було вірно аж до версії 0.12.0, потім сортування priority отключили.
Get reward
block
Якщо ви подивитеся на структуру будь-якого блоку, то найпершою завжди йде так звана coinbase транзакція — саме вона відправляє винагороду на адресу майнера. На відміну від звичайних транзакцій, coinbase transaction не витрачає в якості входів виходи з UTXO pool. Замість цього у неї є лише один вхід, званий coinbase, який "створює" монети з нічого. Вихід у такої транзакції теж тільки один. Він відправляє на адресу майнера нагороду за блок плюс суму комісій з усіх транзакцій в блоці. У моєму випадку це
12.5 + 0.00018939 + 0.0001469 = 12.50033629
.
Давайте детальніше розглянемо структуру coinbase транзакції, а якщо конкретніше — її вхід. На всяк випадок нагадаю, як виглядає вхід у "звичайної" операції:

Ось три відмінності входу coinbase транзакції:
  • Замість справжнього transaction hash вказується 32 нульових байта
  • Замість output index зазначається
    0xFFFFFFFF
    .
  • У поле unlocking script можна вказати що завгодно розміром від 2 до 100 байт, тому це поле ще називають coinbase data. Наприклад genesis block там захована фраза
    "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"
    . Як правило, майнеры вставляють coinbase data своє ім'я / ім'я майнінг пулу / ще що-небудь.
Часто coinbase data вставляють так званий extra nonce докладніше тут. Суть в тому, що може не знайтися необхідного nonce, при якому хеш блоку менше target (насправді це буде відбуватися в більшості випадків). Тоді залишається що-небудь міняти в транзакції, щоб вийшли інші хеші, наприклад — UNIX timestamp. Але якщо ви читали Bitcoin in a nutshell — Blockchain, то знаєте, що timestamp теж сильно не зміниш, інакше інші ноди відкинутий ваш блок. Рішення виявилося досить простим: достатньо додати яке-небудь число coinbase data і змінювати його, якщо для поточного header не знайшлося потрібного nonce.
Процес створення нової транзакції докладно описаний у розділі Bitcoin in a nutshell — Protocol, тому тут я просто наведу вже отриману coinbase transaction, весь код, як правило, доступний на [Github]():
coinbase_txn = "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff8a47304402207e8495986ec27ed4556fee9dcd897ea028d4eb2023959c2299eb573e0771dee702201489e40115ccc45d4c23f1109cb56b513543517f3efc0031965ad94d94d3d2d901410497e922cac2c9065a0cac998c0735d9995ff42fb6641d29300e8c0071277eb5b4e770fcc086f322339bdefef4d5b51a23d88755969d28e965dacaaa5d0d2a0e09ffffffff01ddff814a000000001976a91478e10cf8e4bd38266d8fd4ed5c8b430d30a3cde888ac00000000"

Залишилося тільки порахувати для цих трьох транзакцій merkle root. Для цього скористаємося фрагментом коду з Bitcoin in a nutshell — Blockchain:
txn_pool.insert(0, coinbase_txn)
txn_hashes = map(getTxnHash, txn_pool)

print "Merkle root: ", merkle(txn_hashes)
# Merkle root: 4b9ff9ab901df82050f858accde99b9169067acafaeade25598ea5505fb53836

Target
Як я вже написав вище, весь майнінг зводиться до того, щоб знайти хеш блоку менше числа, званого target. В структурі блоку це число записується у полі bits, наприклад для блоку #277,316, target дорівнював
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"
}

У bits насправді записані відразу два числа: перший байт
0x19
— експонента, які залишилися три байти
0x03a30c
— мантиса. Для того, щоб отримати target з bits, потрібно скористатися наступною формулою:
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'

Інший термін, що відображає складність майнінгу, — difficulty. Наприклад для блоку #449.584 він дорівнював
392,963,262,344.37
. Цей параметр представляє з себе ставлення
max_target / current_target
,
max_target
— максимально можливий target, а саме
0x00000000FFFF0000000000000000000000000000000000000000000000000000
(
0x1d00ffff
у форматі bits). Саме bits як правило вказується у всі block explorer.
BTW чим менше target, тим більше difficulty і навпаки.
PoW
Тепер, коли ви розібралися з усіма нюансами, можна запускати майнер:
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

Hash rate
Якщо ви дочекалися заповітної рядка
Success!
, то у вас або Intel Core i7, або дуже багато вільного часу. Я поняття не маю, коли цей код закінчить свою роботу і знайде він nonce взагалі, тому що поточна складність просто жахливо велика. Навіть якщо припустити, що наша програма здатна обрахувати 100.000 хешей в секунду (а це не так), то вона все одно в мільйони разів повільніше будь-якого справжнього майнера, тому на пошук nonce у неї може піти кілька днів.
Щоб ви усвідомили масштаб проблеми: існує метрика hashrate. Вона відображає сумарну потужність майнер в мережі Bitcoin, одиниця виміру — хеші SHA256 в секунду. Ось її графік:
hashrate
Будемо вважати, що хэшрейт становить 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 Blocks 1 Chain
Fork
Давайте на хвилину уявимо, що майнеры шукають блок #123456. І приблизно в один і той же час він був знайдений двома незалежними майнерами, один з яких живе в Австралії, а інший в США. Кожен з них починає розкидати свою версію блоку по мережі, і в результаті виходить, що у однієї половини світу один блокчейн, а в іншого — інший.
чи Можливо таке і що станеться в цьому випадку?
fork1
Так, можливо. Більше того, таке відбувається досить часто. У цьому випадку кожна нода продовжує дотримуватися своєї версії блокчейна до тих пір, поки хто-небудь не знайде наступний блок. Припустимо, що новий блок продовжує "зеленого" гілку, як на картинці нижче.
fork2
В цьому випадку ті ноди, які дотримуються "червоної" версії, автоматично синхронізує зелену, тому що в світі Bitcoin працює правило: "істинна" найдовша версія блокчейна. "Червона" версія блокчейна буде просто забута, разом з нагородами для тих, хто її знайшов.
Ви можете запитати: а що якщо форк піде далі? Тобто одночасно з "фіолетовим" блоком знайдуть ще один, який буде продовжувати "червону" версію блокчейна?
Швидше за все, цю книгу будуть читати не тільки люди з хорошим математичною освітою, тому дам самий загальний відповідь — таке безумовно можливо. Але ймовірність навіть першого форк досить мала, другого — ще менше і так далі. Щоб ви розуміли, найдовший форк за всю історію Bitcoin склав всього 4 блоку. Так що в якийсь момент одна з гілок все таки вирветься вперед, і вся мережа перейде на неї.
Якщо вам цікава ця проблема саме з ракурсу теорії ймовірностей, то можете прочитати "What is the probability of породження in blockchain?" Ще це питання непогано розписано в знаменитій "Bitcoin: A Peer-to-Peer Electronic Cash System" by Satoshi Nakamoto.
51% attack
На тому простому факті, що в блокчейне найдовша ланцюжок — домінуюча, заснована ціла атака:
Уявіть, що ви шахрай і купуєте товар на 1000 BTC в якому-небудь магазині. Ви домовляєтеся з продавцем і відправляєте йому гроші. Продавець перевіряє блокчейн, бачить, що така транзакція дійсно була, пройшла всі перевірки і навіть потрапила в якийсь блок, наприклад #123. Після цього продавець йде на пошту і відправляє вам товар.

В це час ви включаєте свою майнінг-ферму і починаєте майнить, починаючи з блоку #122. Якщо у вас достатньо потужностей, то ви можете обігнати решту мережу і швидше за всіх дорахувати до блоку #124, після чого весь світ перейде на вашу версію блокчейна. При цьому свою транзакцію на 1000 BTC, ви не будете включати до жодного з блоків, а значить, вона буде назавжди забуто, як ніби її ніколи й не було. У результаті продавець позбудеться товару і не отримає своїх грошей.
Не буду вдаватися в теорію ймовірностей, але здійснити таку атаку неможливо, якщо тільки у вас немає як мінімум половини хэшрейта всій мережі. Детальніше можете прочитати в bitcoin.pdf.
Тим не менш, деякі майнінг пули мають дуже значними потужностями. Так наприклад BTC Guild в 2013 році майже подолав поріг у 51% хэшрейта. У якийсь момент вони замайнили відразу 6 блоків поспіль, так що при бажанні змогли б здійснити дану атаку. Тому рекомендується вважати транзакцію підтвердженої тільки після того, як було створено 6 блоків зверху.
Hardware
Можете відразу забути про майнінг на CPU або GPU. Щоб ви розуміли, нижче зображено хэшрэйт на початок 2017 року. Будемо вважати, що він в середньому становить 2.300.000 TH/S, тобто 2.300.000.000.000 MH/s. Для порівняння, звірячі відеокарти, такі як ATI Radeon HD 5870 Eyefinity або AMD Radeon HD 7970 (x3), видають у кращому випадку 2000 MH/S. Серед процесорів перше місце посідає Xeon Phi 5100 зі смішними 140 MH/s.
hashrate
Так що навіть виходячи з курсу в 1000 $/BTC і маючи на руках 10.000 MH/s, ви в середньому будете заробляти 20 центів на місяць.
gpu
CPU майнінг перестав бути рентабельним ще в 2011 році, GPU тримався приблизно до 2013 року, але теж прогорів, коли широке розповсюдження отримали так звані application-specific integrated circuitASIC. Це спеціальні чіпи, заточені під майнінг на рівні заліза. Найпростіші коштують в районі 100$, що сильно дешевше топової відеокарти, але при цьому здатні видавати від 1 TH/s.
тобто при інших рівних, маючи два Antminer S9 3.000$ за штуку, ви будете заробляти майже 700 доларів на місяць (без обліку рахунків за електрику)

Але й на цьому ще не все. Ви можете об'єднатися з іншими майнерами mining pool і почати майнить разом, а зароблені гроші ділити пропорційно вкладеним потужностей. Це, очевидно, набагато вигідніше, ніж намагатися заробити хоч що-небудь самостійно, тому саме пули на сьогоднішній день складають головну рушійну силу в світі майнінгу. На початок 2017 року основними гравцями на ринку пулів є AntPool, F2Pool і Bitfury, забезпечують більше 40% хэшрейта всієї мережі.
Pools
Завершення
На цій високій ноті я закінчую свою розповідь про технічний пристрій Bitcoin. Джерело тексту плюс приклади коду тут, там же pdf версія. Pull requests welcome, ставте свої запитання в Issues або в коментарях.
Obama out
Links
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.