Как рассчитывается трудность?

Может ли кто-нибудь объяснить мне на простом английском языке, как вычисляется трудность. У меня очень приблизительное понимание того, что он рассчитывается на основе количества хэш-мощности во всем сообществе биткойнов в течение определенного периода времени. Но это очень расплывчато.

И я понимаю, что это может измениться очень быстро. Может ли это только увеличиться? Есть ли какая-либо формула, как вычислить ее или предсказать?

Спасибо за подробный ответ, Мени Розенфельд. Просто чтобы убедиться, что все правильно. Я суммирую все время, чтобы получить последние 2016 блоков. А затем примените формулу.

50 голосов | спросил Salvador Dali 18 TueEurope/Moscow2012-12-18T22:30:56+04:00Europe/Moscow12bEurope/MoscowTue, 18 Dec 2012 22:30:56 +0400 2012, 22:30:56

2 ответа


67

проблема биткойнов началась с 1 (и никогда не может идти ниже этого). Затем для каждых 2016 блоков, которые найдены, отметки времени блоков сравниваются, чтобы узнать, сколько времени потребовалось, чтобы найти 2016 блоков, назовите его Т. Мы хотим, чтобы блоки 2016 занимали 2 недели, поэтому, если T отличается, мы умножаем сложность на (2 недели /T) - таким образом, если хешетат продолжается так, как это было, теперь потребуется 2 недели, чтобы найти 2016 блоков.

Например, если это заняло всего 10 дней, это означает, что трудность слишком низкая и, следовательно, будет увеличена на 40%.

Трудность может увеличиться или уменьшиться в зависимости от того, потребовалось ли меньше или больше 2 недель, чтобы найти 2016 блоков. Как правило, сложность будет уменьшаться после снижения хэш-скорости сети.

Если коэффициент коррекции больше 4 (или меньше 1/4), вместо этого используются 4 или 1/4, чтобы предотвратить слишком резкое изменение.

В реализации есть ошибка, из-за которой вычисление основано на времени для поиска последних блоков 2015 года, а не 2016. Для его фиксации потребуется жесткая вилка и, таким образом, откладывается на данный момент.

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

ответил Meni Rosenfeld 18 TueEurope/Moscow2012-12-18T23:43:54+04:00Europe/Moscow12bEurope/MoscowTue, 18 Dec 2012 23:43:54 +0400 2012, 23:43:54
11

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

Давайте посмотрим на заголовок блока генерации Сатоши (часть связанной информации):

$ bitcoin-cli getblockhash 0
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

$ bitcoin-cli getblockheader 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
{
  ...
  "height": 0,
  ...
  "bits": "1d00ffff",
  "difficulty": 1,
  ...
}

Как мы видим выше, блок генезиса имеет бит «1» и бит «1d00ffff». биткойн-бит означает, что ' target "хэш-значение, новый сгенерированный блок должен удовлетворять условию: двойное значение SHA-256 заголовка блока должно быть меньше этого целевого значения.

Значение битов «1d00ffff» в блоке генеза означает значение «target»:

[0x00000000,0xffff,{0x00..0x00}]
                   {0x00..0x00} at above has 26 bytes 0x00.

Затем, чтобы найти новый блок, вы должны выполнить поиск этого 32-битного значения nNonce (и nTimes и hashMerkleRoot также), пока значение хеш-блока не будет иметь 4 байта. Кстати, nNonce является одним из полей в структуре заголовка блока:

 struct header_structure{            // BYTES   NAME
     uint32_t nVersion;              // 4       version
     uint8_t hashPrevBlock[32];      // 32      previous block header hash
     uint8_t hashMerkleRoot[32];     // 32      merkle root hash
     uint32_t nTime;                 // 4       time
     uint32_t nBits;                 // 4       target
     uint32_t nNonce;                // 4       nonce
 };

Поскольку алгоритм SHS-256 (а также любой криптографически безопасный алгоритм хеширования) выдает вывод, который появится , как равномерная случайная последовательность , практический метод« проб и ошибок »- единственный способ найти новый блок для выполнения условия. Вероятность найти блок с нулевым ведомым хэш-значением 4 байта равна 1 /(2 ^ 32), что означает, что средние числа «проб и ошибок» равны 2 ^ 32 (т. Е. 4G).

Для простого понимания человеком этого хэш-значения целевого значения мы определяем термин «трудность», что означает, что среднее число «проб и ошибок» позволяет найти блок для соответствия «целевому» условию. И мы определяем ' сложность ": 1 'трудность' = 4G хэши

Затем, до сегодняшнего дня, высота блока биткойнов достигает 501509, давайте посмотрим на его заголовок:

$ bitcoin-cli getblockheader 0000000000000000006c5532f4fd9ee03e07f94df165c556b89c495e97680147
{
  ...
  "height": 501509,
  ...
  "bits": "18009645",
  "difficulty": 1873105475221.611,
  ...
}

Биты блока 501509 = 0x18009645, это компактный формат, состоящий из 256 битов, его формат в 256 бит:

[0x00000000,0x00000000,0x009645,{0x00..0x00}]
                                {0x00..0x00} at above has 21 bytes 0x00.
that is  0x009645 * (256 ^ 21) 
The genesis block's target is  ( 0x00ffff * 256 ^ 26 )which is the difficulty unit '1.0'.
So, the difficulty 
= (0x00ffff * 256 ^ 26)/ (0x009645 * 256 ^ 21)
= 65535/38469 * (256^5)
= 1.703579505575918 * 2^40
= 1873105475221.611

До сих пор у вас есть все подробности о том, как рассчитать «трудность». В некоторых случаях мы также используем простой формат 1.7T , чтобы сказать трудность, в приведенном выше примере.

 (1.703579505575918 * 2^40) = 1.703579505575918T
 1T = 2^40 = 1024^4
ответил gary 29 FriEurope/Moscow2017-12-29T07:30:57+03:00Europe/Moscow12bEurope/MoscowFri, 29 Dec 2017 07:30:57 +0300 2017, 07:30:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132