Bitcoin Forum
April 18, 2014, 02:19:20 PM *
News: Due to the OpenSSL heartbleed bug, changing your forum password is recommended.
 
   Home   Help Search Donate Login Register  
Pages: [1]
  Print  
Author Topic: Сложность, цель - что это?  (Read 2999 times)
kiav
Member
**
Offline Offline

Activity: 87



View Profile WWW

Ignore
August 27, 2010, 07:59:52 PM
 #1

Есть несколько статей на эту тему, но по-английски:
Есть белые страницы о технической стороне дела (ссылку сходу не нашел). Я не математик и это все мало объясняет что происходит.

Что я понял:

Информация о транзакциях (в том числе "найденных" монетах) хранится в блоках, которые есть у всех участников сети. Более того, для контроля времени, эти блоки выстраиваются в цепочку. Есть сложность создания блока, которая создана искусственно и специально для того, чтобы исключить подделки. Вот в этом основные непонятки.

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

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

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

Теперь собственно вопрос - а как все-таки корректируется цель, если блоки генерятся слишком быстро или слишком медленно? Формулу для расчета сложности я тоже не понял. Что она означает?
1397830760
Hero Member
*
Offline Offline

Posts: 1397830760

View Profile Personal Message (Offline)

Ignore
1397830760
Reply with quote  #2

1397830760
Report to moderator
    mBitCASINOWIN BITCOINS IN OUR
24/7 LIVE DEALER CASINO

Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction. Advertise here.
1397830760
Hero Member
*
Offline Offline

Posts: 1397830760

View Profile Personal Message (Offline)

Ignore
1397830760
Reply with quote  #2

1397830760
Report to moderator
1397830760
Hero Member
*
Offline Offline

Posts: 1397830760

View Profile Personal Message (Offline)

Ignore
1397830760
Reply with quote  #2

1397830760
Report to moderator
1397830760
Hero Member
*
Offline Offline

Posts: 1397830760

View Profile Personal Message (Offline)

Ignore
1397830760
Reply with quote  #2

1397830760
Report to moderator
checker
Sr. Member
****
Offline Offline

Activity: 350



View Profile

Ignore
August 27, 2010, 08:22:01 PM
 #2

блок -- русская версия
цель -- (поправляйте неточности если есть)

Хочешь отблагодарить - кинь биткоинов, сколько не жалко- буду рад!
(If u want to say me thanx - give me some bitcoins Smiley )
1NXsbppu1B2exLUY8i5cYbQxbc2zWtiTAY
kiav
Member
**
Offline Offline

Activity: 87



View Profile WWW

Ignore
August 28, 2010, 11:28:39 AM
 #3

блок -- русская версия
цель -- (поправляйте неточности если есть)
Дословно, все нормально. Есть одно "нерусское" предложение
Quote
Одно изменение цели никогда не изменит саму цель более чем в 4 раза для того чтобы предотвратить большие изменения в затруднительном положении.
Самое главное здесь смысл, который и в исходном варианте был непонятным и остался таковым.

Quote
Блок считается “решённым” (опубликованным и проверенным другими узлами), когда хэш SHA-256 этого блока ниже указанной на тот момент цели. Скорее всего, с первого раза это не случится, так что в таком случае число nonce увеличивается на единицу, и хэш пересчитывается до тех пор, пока не “попадёт” в указанную цель.
Хотелось бы понять, действительно ли случайное число генерится один раз, а потом просто увеличивается на единицу. Или оно все-таки генерится снова (новое случайное число).

Quote
Сеть пытается создавать по 6 блоков в час. Каждые 2016 блоков (две недели), все клиенты Bitcoin сравнивают результат с ожидаемым количеством и изменяют “цель” соответственно разнице. Тем самым увеличивается или уменьшается сложность генерации блоков.
Т.е. цель хранится у каждого клиента и каждый и них ее изменяет? Если кто-то изменил цель не так, как сделали остальные, то блок принят не будет?

Quote
Для обеспечения стабильности и низкой задержки транзакций, сеть пытается производить один блок каждые 10 минут. Каждые 2016 блоков - на просчет которых должно уйти (в идеале)две недели - каждый клиент BitCoin сравнивает фактическое время, которое потребовалось для создания этих блоков с 2 недели цели и модифицирует цель по разнице в процентах. Это увеличивает или уменьшает сложность. Одно изменение цели никогда не изменит саму цель более чем в 4 раза для того чтобы предотвратить большие изменения в затруднительном положении.
Т.е. когда подходит момент Х (уже по часам и календарю) клиенты сравнивают количество созданных блоков за две недели и если есть отклонение от 2016 то цель корректируется? Если создано, например, 1500 блоков, то клиентов в сети стало меньше и сложность на последующие две недели уменьшается, а если создано 5000 блоков, то сложность на ближайшие две недели наоборот - увеличивается?
В статье, сказано, что цель не может измениться более, чем в 4 раза. Тогда, если сгенерено не 2016, а в 5 раз больше (10 080 блоков), то цель уменьшиться в 4 раза, а не в 5?
checker
Sr. Member
****
Offline Offline

Activity: 350



View Profile

Ignore
August 28, 2010, 02:33:26 PM
 #4

Скажу сразу - статью о блоках делал не я - по этому у нас имеются небольшие расхождения Нужно согласоваться и выправить обе статьи чтобы у пользователя не было недопонимания.
Я про цель переводил.

Quote from: kiav
Самое главное здесь смысл, который и в исходном варианте был непонятным и остался таковым.
А по моему смысл тут  достаточно ясен. Затруднительное положение - это когда внезапно пропал народ и цель увеличилась в 10 раз -> сложность упала в эти 10 раз - ну и народ тут может массово сгенерить кучу биткоинов.... а теперь 10 превратим в 100... и т.п... вот для предотвращения таких резких скачков и установлено ограничение изменения цели. Могу это добавить в вики- вообще старался максимально приблизить к оригиналу. Но если достаточно "вольного" перевода ,  да если еще и разъяснения имеет смысл впихивать - можете ожидать что русская вика прилично разрастется - буду пытаться максимально упростить переваривание смысла.
Quote from: kiav
Quote
Блок считается “решённым” (опубликованным и проверенным другими узлами), когда хэш SHA-256 этого блока ниже указанной на тот момент цели. Скорее всего, с первого раза это не случится, так что в таком случае число nonce увеличивается на единицу, и хэш пересчитывается до тех пор, пока не “попадёт” в указанную цель.
Хотелось бы понять, действительно ли случайное число генерится один раз, а потом просто увеличивается на единицу. Или оно все-таки генерится снова (новое случайное число).
в английской версии сказано  
Quote
increment the nonce
что значит нечто вроде прибавляется данное время (данный случай) -- я не понял как это интерпретировать по этому совсем убрал, но там так же сказано что хеш меняется полностью.  В русской версии target я указал что хеш генерируется заново что (на мой взгляд равносильно утверждению что создается абсолютно новый хэш, если это не очевидно - могу добавить)

Quote
Т.е. цель хранится у каждого клиента и каждый и них ее изменяет? Если кто-то изменил цель не так, как сделали остальные, то блок принят не будет?
Вероятно так Но как бы цель он изменит не так как остальные если он хакнут или какая то мистическая ошибка вычисления. И собственно против хаков и мистических ошибок - система подтверждений работает (насколько я понял). В общем этот вопрос нуждается в разъяснении но я полагаю что наши с вами предположения верны.

Quote
Т.е. когда подходит момент Х (уже по часам и календарю) клиенты сравнивают количество созданных блоков за две недели и если есть отклонение от 2016 то цель корректируется? Если создано, например, 1500 блоков, то клиентов в сети стало меньше и сложность на последующие две недели уменьшается, а если создано 5000 блоков, то сложность на ближайшие две недели наоборот - увеличивается?
А вот тут небольшие расхождения в статье про блоки и статье про цель ввели вас в заблуждение. через каждые 2016 блоков "сеть" делает сверку - сколько времени ушло на просчет этих блоков. В идеале должно быть 2 недели, если имеется разница - то система корректирует цель так чтобы следующие 2016 блоков вычислились за 2 недели (если вычисления будут  идти с той же скоростью с какой были в этот раз). например:
(момент времени - событие когда программа решает менять ли цель и насколько сильно её менять)
время - допустим считается с момента последнего принятия решения о смене\или не смене цели т.е.
Момент времени А:
вычислено 0 блоков
время =0
момент времени Б:
вычислено 2016 блоков
время = 2 недели-
цель остается такая же

момент времени В:
вычислено 4032 блоков
время = 2 недели
цель остается такая же

момент времени Г:
вычислено блоков 6048
время 1 неделя
цель уменьшить в 2 раза

..и .т.д.

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

Как то так Smiley

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

Хочешь отблагодарить - кинь биткоинов, сколько не жалко- буду рад!
(If u want to say me thanx - give me some bitcoins Smiley )
1NXsbppu1B2exLUY8i5cYbQxbc2zWtiTAY
kiav
Member
**
Offline Offline

Activity: 87



View Profile WWW

Ignore
August 28, 2010, 05:42:43 PM
 #5

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

P.s. еще раз напомню - статью про блоки переводил не я- надо разобраться что в оригинале было про блоки -- может быть не совсем точно переведено, а может быть у них в английской версии вики так непонятно написано. Появится время -разберусь.
Да, именно так. В оригинале непонятно написано. Само собой, перевод таким же будет. Тем более, что есть задача переложить на другой язык непонятный текст.

...в английской версии сказано 
Quote
increment the nonce
что значит нечто вроде прибавляется данное время (данный случай) -- я не понял как это интерпретировать по этому совсем убрал, но там так же сказано что хеш меняется полностью.  В русской версии target я указал что хеш генерируется заново что (на мой взгляд равносильно утверждению что создается абсолютно новый хэш, если это не очевидно - могу добавить)
Я тоже не понял этого слова. Здесь нужен спец. Хеш не может генериться не заново. Он будет новым если хоть один байт изменился в исходном сообщении. Здесь для изменений как раз меняется этот самый nonce. Вопрос в том, он генерится как случайное число один раз, а потом увеличивается каждый раз при пересчете на единицу, или генерится по Rnd каждый раз.

Quote
Т.е. когда подходит момент Х (уже по часам и календарю) клиенты сравнивают количество созданных блоков за две недели и если есть отклонение от 2016 то цель корректируется? Если создано, например, 1500 блоков, то клиентов в сети стало меньше и сложность на последующие две недели уменьшается, а если создано 5000 блоков, то сложность на ближайшие две недели наоборот - увеличивается?
А вот тут небольшие расхождения в статье про блоки и статье про цель ввели вас в заблуждение. через каждые 2016 блоков "сеть" делает сверку - сколько времени ушло на просчет этих блоков. В идеале должно быть 2 недели, если имеется разница - то система корректирует цель так чтобы следующие 2016 блоков вычислились за 2 недели (если вычисления будут  идти с той же скоростью с какой были в этот раз). например:
(момент времени - событие когда программа решает менять ли цель и насколько сильно её менять)
время - допустим считается с момента последнего принятия решения о смене\или не смене цели т.е.
Момент времени А:
вычислено 0 блоков
время =0
момент времени Б:
вычислено 2016 блоков
время = 2 недели-
цель остается такая же

момент времени В:
вычислено 4032 блоков
время = 2 недели
цель остается такая же

момент времени Г:
вычислено блоков 6048
время 1 неделя
цель уменьшить в 2 раза

..и .т.д.

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

Как то так Smiley
...
А я по тексту понял, что все эти моменты (А, Б, В, Г) обязательно должны быть разделены временем в две недели. Т.е. решение всегда принимается раз в две недели. Вы же думаете, что решение принимается каждые 2016 блоков и смотрится за какое время они были посчитаны. По идее, для всех этих расчетов в блоках должно записываться и время. Но я что-то не слышал об этом - только последовательность.
nimnul
Sr. Member
****
Offline Offline

Activity: 253


View Profile WWW

Ignore
August 28, 2010, 07:04:23 PM
 #6

Есть белые страницы о технической стороне дела (ссылку сходу не нашел). Я не математик и это все мало объясняет что происходит.
Ну, я "математик", спрашивайте Smiley
Quote
Что я понял:

Информация о транзакциях (в том числе "найденных" монетах) хранится в блоках, которые есть у всех участников сети. Более того, для контроля времени, эти блоки выстраиваются в цепочку. Есть сложность создания блока, которая создана искусственно и специально для того, чтобы исключить подделки. Вот в этом основные непонятки.
"Монет" как таковых в системе нет. Есть список транзакций (со счета А на счет Б переведена сумма Х), в котором есть фиктивные транзакции "на счет Б из ниоткуда зачислено 50").

Блоки выстраиваются в цепочку не только для контроля времени - на выстраивании в цепочку основан механизм разрешения конфликтов, когда с одного счета делается попытка перевести в 2 места, а денег на счету хватает только на один из этих переводов.


Quote
Для создания блоков используются хеши. Это всего-лишь вычисленное определенным образом число (в Биткоин оно очень большое - 256 бит) на основе данных самого блока. Сам алгоритм вычисления хеша сейчас неважен. Его можно найти в энциклопедии. Важно то, что этот процесс сам по себе очень быстр и детерменирован (его результат неслучаен).

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

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

Число включено неслучайное - программа всегда начинает с 0 и каждый раз увеличивает на единицу.

Секрет в том, что блоки у всех разные - я пытаюсь решить блок, в который входит транзакция о зачислении 50 монет на МОЙ счет. Поэтому для разрешения коллизий случайность не нужна - элемент случайности вносит номер счета.
Quote
Теперь собственно вопрос - а как все-таки корректируется цель, если блоки генерятся слишком быстро или слишком медленно? Формулу для расчета сложности я тоже не понял. Что она означает?
Раз в неделю сложность увеличивается или уменьшается так, чтобы среднее время генерации блока было 10 минут. При этом есть ограничение - уменьшение или увеличение сложности не может быть больше, чем в 4 раза.

kiav
Member
**
Offline Offline

Activity: 87



View Profile WWW

Ignore
August 28, 2010, 10:12:32 PM
 #7

...Раз в неделю сложность увеличивается или уменьшается так, чтобы среднее время генерации блока было 10 минут. При этом есть ограничение - уменьшение или увеличение сложности не может быть больше, чем в 4 раза.
Откуда взялась эта неделя, если в документации пишут о двух?
checker
Sr. Member
****
Offline Offline

Activity: 350



View Profile

Ignore
August 28, 2010, 11:18:59 PM
 #8

Quote
Ну, как уже было сказано, цель меняется ровно раз в неделю, а не каждые 2016 блоков.

Смотрим на английскую документацию:
Quote
Every 2016 blocks – which should take two weeks if this goal is kept perfectly –, every BitCoin client compares the actual time it took to generate these blocks with the two week goal and modifies the target by the percentage difference.

Каждые 2016 блоков - которые должны занять две недели если цель сохранена отлично - каждый биткоин клиент сравнивает время затраченное на генерацию этих блоками двухнедельной целью и модифицирует цель по разнице в процентах.
Это если дословно переводить.
Откуда у вас такая информация ? Т.к. я ссылаюсь на английские вики. На что ссылаетесь вы? Может я где то  не так перевел? Где конкретно?
В принципе если вопрос зайдет в тупик - я конечно полезу в код, но мне пока что лениво Smiley

Хочешь отблагодарить - кинь биткоинов, сколько не жалко- буду рад!
(If u want to say me thanx - give me some bitcoins Smiley )
1NXsbppu1B2exLUY8i5cYbQxbc2zWtiTAY
kiav
Member
**
Offline Offline

Activity: 87



View Profile WWW

Ignore
August 29, 2010, 01:08:11 PM
 #9

Quote
Ну, как уже было сказано, цель меняется ровно раз в неделю, а не каждые 2016 блоков.

Смотрим на английскую документацию:
Quote
Every 2016 blocks – which should take two weeks if this goal is kept perfectly –, every BitCoin client compares the actual time it took to generate these blocks with the two week goal and modifies the target by the percentage difference.

Каждые 2016 блоков - которые должны занять две недели если цель сохранена отлично - каждый биткоин клиент сравнивает время затраченное на генерацию этих блоками двухнедельной целью и модифицирует цель по разнице в процентах.
Это если дословно переводить.
Откуда у вас такая информация ? Т.к. я ссылаюсь на английские вики. На что ссылаетесь вы? Может я где то  не так перевел? Где конкретно?
В принципе если вопрос зайдет в тупик - я конечно полезу в код, но мне пока что лениво Smiley
Это вопрос не Вам, checker. Информацию о неделе дал nimnul.

Добавлено: Хотя изначально именно Вы, checker, и дали информацию о неделе.
checker
Sr. Member
****
Offline Offline

Activity: 350



View Profile

Ignore
August 29, 2010, 07:09:08 PM
 #10

эх вы меня не правильно поняли скорее всего
Я полагаю что  1 неделя в моем сообщении взята вот тут

Quote
момент времени Г:
вычислено блоков 6048
время 1 неделя
цель уменьшить в 2 раза
это был просто пример , только достаточно абстрагированный ,  нужно было пояснить глубже но не было времени...
Суть в нем была такова: "очередная "стопка"  в 2016 блоков обработалась за  1 неделю - а эталон на эту стопку - 2 недели, программа сравнивая "что получилось" и "эталон" делает вывод - для того чтобы следующая стопка в 2016 блоков обработалась за 2 недели (как эталон) необходимо увеличить цель в 2 раза."

В принципе тут прослеживается достаточная логика кстати.
Это же сделано для того чтобы ориентировочно одинаково "решались" блоки за какой то промежуток времени.
Но - если привязать этот промежуток к временным рамкам то может получиться следующее. (ЭТО ОПЯТЬ ПРИМЕР! для того чтобы понять логику)
допустим что в течении недели у нас было 1000 пользователей, к концу недели (допустим воскресенье) мы проверили  сколько блоков было обработано за эту неделю. И сделали всякие там корректировки цели.
И тут в понедельник  происходит "хаброэффект" и нас уже 4000 пользователей.... понятное дело что сеть в 4000 компов будет шустрее сети в 1000 компов (где то раза в 4 допустим), и наши блоки обработаются уже не к концу недели а где то в районе вторника... и со вторника до воскресенья у нас будут считаться блоки все так же шустро в 4 раза быстрее чем надо бы по задумке. И только в воскресенье сеть, сделав очередную проверку, узнает что ей нужно тормознуть скорость просчета в 4 раза.

^^ Такой вариант развития событий имел бы место в случае если бы система корректировала себя через определенный промежуток времени (в примере приведена неделя)
А теперь допустим что сеть ориентируется на кол-во блоков:
в таком случае после "хаброэффекта" (когда в предыдущем примере скорость взлетела в 4 раза) уже ко вторнику где то досчитается эталонное кол-во блоков (2016)
и в этот момент система скорректирует сложность подстроившись под новую скорость вычислений.

И у нас уже нет дней когда система "раздавала плюшки" быстрее чем было "задуманно".

И так - у нас 3 версии было
1) через каждые 2 недели система делает корректировку
2) каждую неделю система делает корректировку
3) каждые 2016 блоков система делает корректировку

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

Хочешь отблагодарить - кинь биткоинов, сколько не жалко- буду рад!
(If u want to say me thanx - give me some bitcoins Smiley )
1NXsbppu1B2exLUY8i5cYbQxbc2zWtiTAY
LZ
Moderator
Hero Member
*
Offline Offline

Activity: 1050


Satoshi everywhere!


View Profile WWW

Ignore
August 30, 2010, 05:12:38 PM
 #11

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

"Never invest unless you can afford to lose your entire investment."  ©  S3052
Feel free to contact me using Bitmessage: BM-GtRPz1ESAoFCGjHwD2c3y8McqzXjjo1f
Pages: [1]
  Print  
 
Jump to:  

Sponsored by , a Bitcoin-accepting VPN.
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!