Что такое сложность майнинга? На примере Bitcoin. Кто такие сложные люди? Сложность версия

Что такое сложность майнинга? На примере Bitcoin.

Майнинг криптовалют может стать очень выгодной инвестицией. Но чтобы заработать на добыче валют, нужно хорошо разбираться в нюансах отрасли. Одним из важнейших понятий для любого майнера является сложность добычи. От сложности майнинга напрямую зависит доход. В этой статье подробно рассказывается о том, что такое сложность майнинга, как она формируется и от чего зависит.

Что означает термин «сложность майнинга».

Майнинг криптовалюты – это процесс, который представляет из себя генерацию новых блоков цепи блокчейна и запись транзакций. Майнеров можно сравнить с бухгалтерами, которые постоянно трудятся над поддержанием актуальности бухгалтерских книг, занося в них сведения о всех переводах. Но любая работа должна оплачиваться. Майнеры получают от системы награду в виде монет добываемой валюты.

Одна из особенностей криптовалют – это дефляционный характер. Это означает, что совокупное количество добытых монет не может превышать заданное программным кодом число. Например, максимальное количество биткоинов равно 21 миллиону монет. При чем, последний биткоин будет добыт только в 2140 году. Несмотря на количество майнеров, каждые 10 минут добывается только 12,5 BTC. Эти монеты распределяются между майнерами согласно затраченной вычислительной мощности. Награда за подписанный блок не увеличивается (а раз в 4 года даже сокращается наполовину). И если количество майнеров увеличивается, то пропорционально уменьшается доход каждого отдельного добытчика. С приходом все новых криптодобытчиков растет конкуренция за ограниченную награду.

Для наглядной демонстрации этой ситуации введен вычисляемый параметр сети криптовалюты «сложность майнинга». Сложность майнинга – это показатель, который отражает, насколько трудно решить математическую задачу для подписания блока и получения награды за него. Сложность автоматически пересчитывается через определенный промежуток времени. У каждой криптовалюты он разный. Например, пересчет сложности добычи биткоина происходит каждые 2016 блоков, добыча которых занимает примерно 2 недели. Согласно программному коду, сложность подстраивается так, чтобы поиск очередного блока занимал примерно 10 минут в независимости от количества майнеров и совокупного хешрейта.

Сложность автоматически увеличивается, если поиск последних 2016 блоков занял меньше двух недель. Это говорит о том, что совокупная вычислительная мощность майнинг устройств выросла. И наоборот, сигналом к уменьшению сложности станет замедление поиска 2016 блоков, так как хешрейт всех устройств сократился. Результатом становится жесткий контроль за скоростью выпуска новых монет.

Где найти сложность майнинга. Сложность добычи топ-10 криптовалют.

Сложность майнинга – это динамический показатель, который периодически пересчитывается. С увеличением вычислительной мощности оборудования, занятого в майнинге, растет и сложность. Актуальную информацию о состоянии сложности майнинга критовалюты лучше всего искать на официальных сайтах валют. Однако это бывает трудно. Ссылки на статистические данные о майнинге даже на официальных сайтах иногда сложно отыскать. Для упрощения процесса созданы сайты-агрегаторы статистической информации обо всех криптовалютах. Они собирают, обрабатывают и публикуют актуальные данные не только о сложности майнинга, но и еще несколько десятков показателей: цена, капитализация, хешрейт, прибыльность, количество транзакции и так далее.

Актуальную информацию о более чем 100 криптовалютах можно найти на сайтах:

  • https://www.coinwarz.com/charts/difficulty-charts
  • https://bitinfocharts.com/ru/
Название криптовалюты Капитализация (12.11.2017 Ссылка на график сложности*
Bitcoin $102 337 870 442 https://blockchain.info/ru/charts/difficulty

Https://bitinfocharts.com/ru/comparison/difficulty-btc-nmc.html

Https://www.coinwarz.com/difficulty-charts/bitcoin-difficulty-chart

Bitcoin Cash $29 402 898 569 https://bitinfocharts.com/ru/comparison/bitcoin%20cash-difficulty.html

Https://www.coinwarz.com/difficulty-charts/bitcoincash-difficulty-chart

Ethereum $28 727 632 599 https://bitinfocharts.com/ru/comparison/ethereum-difficulty.html

Https://www.coinwarz.com/difficulty-charts/ethereum-difficulty-chart

Ripple $7 559 040 243 Майнинг недоступен**
Litecoin $3 143 298 761 https://bitinfocharts.com/ru/comparison/litecoin-difficulty.html

Https://www.coinwarz.com/difficulty-charts/litecoin-difficulty-chart

Dash $2 603 868 832 https://bitinfocharts.com/ru/comparison/dash-difficulty.html

Https://www.coinwarz.com/difficulty-charts/dash-difficulty-chart

Ethereum Classic $1 867 386 337 https://bitinfocharts.com/ru/comparison/ethereum%20classic-difficulty.html

Https://www.coinwarz.com/difficulty-charts/ethereum-classic-difficulty-chart

Monero $1 745 200 256 https://bitinfocharts.com/ru/comparison/monero-difficulty.html

Https://www.coinwarz.com/difficulty-charts/monero-difficulty-chart

NEO $1 703 832 000 Майнинг недоступен**
NEM $1 595 538 000 Майнинг недоступен**

* Нужно учитывать, что сложность майнинга меняется с течением времени, поэтому разные сайты могут выдавать разные данные о сложности. Иногда разница достигает 10-20% по валюте на двух разных агрегаторах. Если вы ищите показатель сложности майнинга не просто для удовлетворения любопытства, а для использования в практических целях, то ориентируйтесь на средние цифры. Например, если строите прогноз изменения сложности майнинга в будущем на основе исторической динамики, то разумнее брать данные за последние полгода-год, а не две-четыре недели.

** Ряд криптовалют невозможно майнить в традиционном смысле. Одни используют POS-майнинг, при котором на монеты, лежащие в кошельке, периодически начисляются проценты. Для POS-майнинга не нужно покупать специализированное оборудование и тратить деньги на электричество. Другие криптовалюты (например, Ripple) уже полностью добыты и только перераспределяются между владельцами.

Сложность майнинга: на что влияет и почему растет.

Сложность майнинга оказывает определяющее значение на доход майнера. Количество добытых монет обратно пропорционально сложности майнинга. Если сложность сети увеличивается на 20%, то доход в криптовалюте каждого отдельного майнера сокращается на 20%.

Например, асик для добычи биткоина antminer s7 в середине 2017 года (а точнее при сложности на 1 июля 2017) добывал 0,06 BTC в месяц. Но сложность сети биткоин непрерывно росла. По данным на 1 ноября 2017 года это же оборудование добудет уже 0,026 BTC за месяц. Доход майнера всего за 4 месяца просел более чем наполовину.

Но даже еженедельное сокращение дохода не делает инвестиции в майнинг менее привлекательными. Отчасти выручка в криптовалюте компенсируется ростом обменного курса к фиату. В нашем примере 1 июля курс биткоина равнялся 2.400$, а уже 1 ноября котировки выросли почти до 6.700$. Получается, что доходы майнеров в фиате увеличились даже несмотря на быстрый рост сложности добычи.

В этом заключается логика создателей криптовалют с динамической сложностью. И хотя прямой зависимости между ценой валюты и тем, насколько трудно ее добывать, нет, все же есть косвенная взаимосвязь. Предполагается, что рост сложности означает увеличение популярности криптовалюты в широких массах населения. Кто-то из узнавших о децентрализованных валютах попробует майнить. Это приведет к росту сложности. Но в тоже время с высокой вероятностью вырастет спрос, а, значит, и курс. Выходит, что растущий интерес в обществе стимулирует одновременно и рост курса, и рост сложности майнинга.

С технической точки зрения показатель сложности майнинга зависит от:

  • хешрейта сети (количества и вычислительной мощности оборудования всех майнеров);
  • скорости добычи 2016 блоков;

Все три показателя находятся в прямой зависимости. Рост хешрейта сети означает, что к майнингу присоединились новые участники, и конкуренция выросла. С увеличением количества майнеров время, затрачиваемое на поиск очередного блока, сокращается. После 2016 блока происходит пересчет сложности добычи. Изменение показателя описывается закономерностью:

Сложность майнинга биткоина.

Рост сложности обусловлен целым рядом факторов, которые тесно взаимосвязаны:

  • развитие чипов асиков и выход на рынок более производительных моделей;
  • популяризация биткоина и приток новых майнеров;
  • высокая рентабельность инвестиций в майнинг по причине опережающего роста курса биткоина к доллару;
  • перенос вычислительной мощности с других валют, котировки которых падают или растут медленнее биткоина;
  • другие факторы;

Сложность майнинга биткоина с 2016 года выросла в 5-6 раз. Рост продолжался практически беспрерывно. Только в августе 2017 года впервые за год наблюдалось уменьшение показателя. Возможно, на это повлиял августовский SegWit биткоина, заставивший часть майнеров перенести мощности на альткоины.

6 ответов

Сложность всегда указывается относительно конкретной переменной или набора переменных. Поэтому, когда стандарт говорит о постоянной вставке времени, речь идет о постоянном времени относительно количества элементов в списке. То есть, O (1) вставки означает, что количество элементов, находящихся в списке, не влияет на общую сложность вставок. Список может содержать 500 или 50000000 элементов, а сложность операции вставки будет одинаковой.

Например, std::list имеет O (1) вставки и удаления; количество элементов в списке не зависит от сложности вставок. Однако сложность распределения памяти может зависеть от количества вещей, которые уже были выделены. Но поскольку O (1) говорит о количестве элементов в списке, оно не распространяется на это. И это не предполагается, потому что тогда мы будем измерять сложность распределителя памяти, а не структуру данных.

Короче: это другое измерение.

Это означает, что мы можем реализовать наш алгоритм так сильно, как нам нравится, в том числе тот, где время на самом деле не является постоянным в каком-либо прагматическом смысле, но где мы соблюдали количество "операций" над содержащимися объектами.

Сложность не указана относительно реализаций. Он задан относительно алгоритмов. Не имеет значения, что контекст может переключаться, потому что время выполнения не является сложной задачей.

Как и выше, вы можете реализовать std::list с помощью распределителя памяти, который является O (log (n)) относительно делеций (где n - количество распределений). Однако удаление элемента в списке все равно будет O (1) по отношению к количеству элементов в списке.

Не путайте сложность с общей производительностью. Целью сложности является наличие общей метрики для алгоритмов относительно разных переменных. Цель программиста, который хочет, чтобы их код работал быстро, заключается в том, чтобы найти разумную реализацию алгоритма, который соответствует сложности, необходимой для достижения этой производительности.

Сложность - это инструмент для оценки эффективности алгоритма. Сложность не означает, что вы можете перестать думать.

А что именно означает "амортизация"?

Насколько я понимаю, постоянная сложность означает, что операция O(1) : вы можете заранее сказать, сколько элементарных операций (чтение/запись, инструкции по сборке, что угодно) будет выполняться. И эта оценка является общей границей для всех возможных состояний целевого объекта. Здесь есть улов: в многопоточной среде вы не можете предсказать потоковые коммутаторы, поэтому вы можете сделать некоторые рассуждения по истекшему времени работы только в ОС реального времени.

Об амортизированной постоянной сложности, это еще слабее. Составляя резюме ответов , это гарантия того, что в среднем ваша операция является постоянной. Это означает, что число элементарных операций для N последующих операций O(N) . Это означает, что число элементарных операций составляет около O(1) , но допускает некоторые редкие прыжки. Например, добавление элемента к хвосту вектора обычно является постоянным, но иногда требуется дополнительная тяжелая операция; имеющее амортизированное постоянное время, означает, что дополнительная операция выполняется не так часто и занимает предсказуемое количество времени, так что общее время операции N все еще O(N) . Конечно, здесь применяется и тот же улов.

Итак, отвечая на ваши вопросы:

  • Сложные гарантии стандарта применяются действительно только к числу инструкций машинного кода, необходимых для выполнения операции, и не подразумевают, что время выполнения каким-то образом ограничено. (Действительно, до недавнего времени на С++ даже не было указателя на тему, связанного с языком, поэтому со стандартной точки зрения С++ к этому времени программа была выполнена на специализированной С++-машине.)
  • Амортизация "ограничена константой в среднем", что обычно происходит в случае почти всегда постоянного ограниченного времени операции с некоторыми довольно редкими отклонениями.

Edit:
Вы можете посмотреть на, например, раздел 23.1 стандарта С++:

Все требования к сложности в этом разделе указаны исключительно в терминах количества операций над содержащимися объекты.

если говорят, что операция имеет "постоянную сложность", в первую очередь это обычно относится к временной сложности. Я мог бы ссылаться на пространственную сложность, но если это так, то будет явно указано нормально.

Теперь сложность операции относится к тому, сколько времени для выполнения операции будет увеличиваться, когда количество элементов, обрабатываемых в операции, увеличивается. Для операции с постоянной сложностью функция будет занимать одинаковое количество времени, независимо от того, будут ли обработаны нулевые предметы или десять миллионов элементов.

    swap() - это постоянная сложность, потому что неважно, сколько элементов находится в векторе, операция займет столько же времени.

    нажмите на список. является постоянной сложностью, потому что хотя для размещения нового элемента может потребоваться некоторое количество времени, это время распределения не увеличивается, потому что список содержит 10 миллионов элементов (по крайней мере, не в алгоритмическом смысле - конечно, если свободная память становится больше и более истощенный, распределение может занять больше времени, но с алгоритмической точки зрения имеется бесконечное количество памяти).

    push_back() для вектора называется константой "амортизируется", поскольку в нормальном случае, когда перераспределение не должно происходить, количество времени, которое займет операция, не связано с тем, сколько элементов находится в вектор уже - такое же количество времени берется, чтобы добавить новый элемент к вектору нулевой длины относительно вектора длины 10 миллионов. Однако, если вектор необходимо перераспределить, необходимо будет иметь копию существующих элементов, и это не постоянная операция - это линейная операция. Но предполагается, что вектор должен быть сконструирован таким образом, чтобы перераспределение происходило нечасто, чтобы они могли быть amortized в течение многих операций push_back() .

но сделать push_back на векторе еще более непредсказуем. В большинстве случаев это будет очень быстро, но время от времени ему придется перераспределять пространство для всех данных и копировать каждый элемент в новое место. Таким образом, он менее предсказуем с точки зрения времени выполнения, чем один список:: push_front, но он по-прежнему называется постоянным (амортизируется). В среднем, добавление большого количества данных в вектор займет сложность, которая не зависит от добавленной суммы, и именно поэтому она называется "амортизированным постоянным" временем. (Правильно?)

Сложность O (1) - константа (с учетом временной сложности) означает, что время завершения алгоритма не связано с размером проблемы.

Итак, поиск значения в хешированной структуре - это O (1), потому что время, необходимое для этого, не зависит от количества его значений. Однако то же самое не относится к связанному списку, потому что мы должны сканировать значения (число которых изменяется по мере увеличения количества элементов), чтобы найти наше значение.

В случае 3, когда он копирует каждый элемент, это не операция O (1), а операция O (N) (но большую часть времени это O (1), поэтому она обычно постоянна). Амортизация учитывает это, отмечая, что алгоритм обычно завершается в O (1) раз и редко попадает в этот случай O (N).