Pull to refresh

Comments 23

> Это связано с тем, что сложность доказательства автоматически регулируется так, чтобы биткойн-сеть находила в среднем один блок в 10 минут.

Может ли кто-нибудь на пальцах объяснить, как это достигается? Сколько я ни спрашивал, никто толком так и не смог ответить.

А именно, идет ли здесь завязка за какой-то таймер и астрономическое время, или же просто говорится «мощность компьютера растет в среднем как X из года в год, поэтому и объем работы тоже будем увеличивать как X в зависимости от размера блокчейна».

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

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


Завязок на таймеры или предполагаемый рост мощности — нет, есть только завязка на фактическую суммарную вычислительную мощность.

Вот, вторая ссылка в моем гугле по запросу "биткоин сложность":


Сложность меняется каждые 2016 блоков, основываясь на времени, которое потребовалось для нахождения предыдущих 2016 блоков. Если блок будет находиться каждые 10 минут (как это задумывалось изначально для равномерной эмиссии), нахождение 2016 блоков займет ровно 2 недели. Если предыдущие 2016 блоков были найдены за срок более 2х недель – сложность будет уменьшена, если меньше – сложность будет увеличена. Чем больше (или меньше) времени было затрачено на нахождение предыдущих 2016 блоков, тем больше уменьшится (или увеличится) сложность.
ru.bitcoinwiki.org/Сложность#Изменение сложности

Не понимаю почему у вас возникли затруднения с поиском этой информации...

Насколько я понимаю, вопрос тут не в часах, а в самом факте появления очередного блока.

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

Короче говоря, получается та же самая схема с «честным большинством». Если бо́льшая часть узлов считает, что PoW должен быть X, то злонамеренному меньшинству нет смысла пытаться генерировать фальшивую PoW Y < X, поскольку:

1. Все равно нужно тратить энергию на вычисление даже PoW меньшего размера
2. Рано или поздно эта ветвь будет проигнорирована как фальшивая и по определению более короткая (ведь честных майнеров больше)

При таком подходе, фактический алгоритм вычисления уже не особо важен, главное чтобы его придерживалось большинство, сам он не имел логических дыр и хорошо работал независимо от количества узлов сети.
Значит, в схеме таки участвует таймер.

1. Зашит ли внутри каждого блока timestamp его генерации? Если да, то что происходит, если время на ноде шло неправильно? Другие же ноды не могу никак проверить корректность хода времени на этой ноде.
2. Если завязка идет реально за частоту прихода блока на каждую отдельную ноду, а не за время, вшитое в каждый блок, то ведь время может идти немного по-разному на разных нодах. Предположим, все ноды знают, что сложность равна 1 при скорости генерации 0-1000 блоков за 10 минут, и равна 2 при 1001-2000 блоков за 10 минут. Соответственно, при реальной скорости близкой к 1000 может так выйти, что часть нод решат, что скорость была 999, а часть — что 1001, и это совершенно случайный фактор. Как с этим обходятся?
Выше уже написали, что расчет сложности опирается не на время, а на сами блоки и их количество. Каждый следующий блок должен содержать хеш предыдущего (блокчейн же).

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

Любые конфликты в блокчейне регулируются по извечному принципу «у кого длиннее, тот и круче». Ну да, некоторые блоки могли быть одновременно найдены несколькими участниками (или блоки с недостаточной сложностью были ошибочно пущены в оборот), но рано или поздно консенсус сойдется на одном из вариантов.

Именно поэтому, прежде чем считать транзакцию валидной и принять оплату, надо дождаться нескольких независимых подтверждений, но это уже вопрос гарантий.
Вот, это типичный ответ на данную тему. Только, к сожалению, он не отвечает на конкретный вопрос про таймер и про то, есть завязка за таймстемпы или нет (выше пункты 1 и 2). Попробую еще раз: если в условии задачи сказано, что «2016 блоков каждые 2 недели», то нужно понять, как эти «2 недели» отмеряются. И вот это-то и является сутью вопроса. («Расчет сложности опирается не на время» — это не ответ, потому что вот же они, 2 недели в условии — время не пожет просто так ниоткуда возникнуть и вникуда исчезнуть, где-то все равно должен стоять первоисточник.)

Первоисточник — таймстемп в блоке, который на 2016 назад.
А при валидация блока проверяется его таймстамп и если он сильно не корректен (кажется 2 часа, лень лезть проверять), то сеть его не принимает.

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

Так как расчет идет не на каждый блок а на каждые 2000 блоков, любая ошибка во времени становится не критичной.

Не потомка, а предка вы хотели сказать.


Кстати похоже всё таки не каждые 2016, а каждые 2015.


Не несколько секунд, а до 2 часов вперёд. Специально полез код проверить:


 // Check timestamp
    if (nTime > GetAdjustedTime() + 2 * 60 * 60)
        return error("CheckBlock() : block timestamp too far in the future");

Вы зря взяли для примера цифры 1 и 2, потому что текущая сложность сети — 521,974,519,554

Второй вариант: начнут генерить в 10 раз быстрее до следующего пересчета сложности.

Сложность пересчитывается каждые 2016 блоков (из расчета 10 минут на блок это 2016*10/60/24 = 14 дней)
Если предыдущие 2016 блоков найдены менее чем за 2 недели, сложность вырастает. Более 2 недель — падает.

В вашем примере, генерация увеличилась в 10 раз, 2016 блоков будут найдены за 1.4 дня вместо 14, после чего сложность вырастет в 10 раз.

Историю сложности биткоина можно посмотреть например здесь: https://bitcoinwisdom.com/bitcoin/difficulty
Спасибо за статью! Довольно интересно описано.

Консенсус Накамото решает главный бич анонимных сетей — атаки Сибиллы, в которых злоумышленник создает кучу фейковых узлов, чтобы «задавить» получившимся большинством мнение честных пользователей.

Справедливости ради стоит отметить, что подобные механизмы применялись задолго до биткоина. В частности, в сети Netsukuku, о которой я писал миллион лет назад, похожая схема применялась при слиянии двух подсетей.

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

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

Чтобы разрешить подобную коллизию, был разработан механизм, который позволил решить, какая из подсетей должна поменять свои адреса.

В основе алгоритма лежала идея, очень похожая на PoW. Каждый узел сети генерировал PoW который использовался как голос в поддержку своей подсети. По результатам голосования, проигравшая подсеть перестраивала свои адреса.

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

Не будь этого механизма, всю сеть можно было бы положить одним узлом, постоянно меняющим свои адреса.
Еще одна опасность централизации криптовалюты, а точнее bitcoin — разработчики.
Владельцы ключа github, владельцы домена и доступа к репозитарию, с которого пользователи загружают новые версии, владельцы PR-аккаунта на форумах типа bitcointalk.org — все они имеют абсолютную власть, с оглядкой на пулы майнинга (и, косвенно, майнеров).

Это было с Ethereum из-за краха DAO (ошибка в контракте, позволила хакеру юридически легально забрать монеты почти всех пользователей DAO себе, и основатели хардфорком буквально отобрали эти монеты и вернули владельцам — несогласное сообщество создало ethereum classic), это происходит с bitcoin сейчас (bitcoin core нарушая все договоренности удерживает лимит размера блока и отказывается его менять в принципе, а ведь его уже не хватает, комиссии за транзакцию растут, 30-40р уже сейчас).

И пока сообщество не выработает механизмы по ограничению разработчиков — криптовалюта не будет действительно децентрализованной.
8 апреля 2017 года в биткойн-сети наблюдалось 7025 узлов с полной копией блокчейна

А не получится так, что со временем их количество начнет сокращаться? Сколько сейчас уже весит база? За сотню гигабайт, наверное? Причем, чтобы хранить копию базы — недостаточно ее просто скачать, надо еще ее всю перепроверить. Так что мне кажется что со временем будет все меньше желающих тратить на нее вычислительные мощности (ну кроме непосредственно майнеров). В итоге получим несколько (десятков/сотен) крупных узлов с полной копией базы.
Во первых существуют механизмы по уменьшению размера сохраняемой базы (пока первичная их загрузка все равно исполняется, но я думаю в будущем это не понадобится), ключ -prune позволяет выбрать режим удаляемых данных из локальной базы (например чтобы она занимала не больше 512мб), так же можно использовать внешний скрипт, который проанализирует базу и RPC запросами удалит с диска ненужные блоки

Во вторых такие технологии как Lighting Network позволят полным нодам зарабатывать на комиссиях моментальных переводов в открытых каналах с той нодой, т.е. у владельца тяжелой ноды появится финансовая заинтересованность ее держать (правда это будет сопряжено с большими вложениями, и тем более, если разработчики bitcoin core будут продолжать играть дурочку и не расширять лимит размера блока).
Кто-нибудь в курсе, как быстро подтверждается транзакция?
Блок генерируется 10 минут. Транзакция вроде как считается подтвержденной, если за ее блоком появилось еще пять. Получается час. То есть быстро оплачивать биткоином не получится?
В подавляющем большинстве случаев 1 подтверждения достаточно, мало того, некоторые виды бизнеса позволяют принимать платежи не дожидаясь подтверждения (например оплата хостинга, его всегда можно отобрать, если оплата не поступит в течении 72 часов — столько транзакция висит в мемпуле неподтвержденной)
Не путайте подтверждения и блоки. Насколько я понимаю, повесить свое подтверждение (подпись) можно на уже существующий блок. Для этого не требуется считать PoW. Количество таких подтверждений определяет ценность именно этой версии блока для сети.

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

Что за подписи на уже существующем блоке? Где то видно сколько подписей на блоках?

путаете — количество подтверждений в транзакции, это какраз количество блоков, найденных после того блока, куда добавлена транзакция.

подтверждение это и есть запись в только что созданный блок, переделать блок нельзя, кроме как заново решив задачу.
А можно подробнее описать обоснование вот этого утверждения: «оказывается, что со слишком частыми блоками работа блокчейна становится нестабильной» — слишком часто — это раз в секунду? Раз в 10 секунд? Есть же такие криптовалюты. Т.е. с чем связана нестабильность?
Если я правильно понимаю, когда запускается альткоин, до пересчета сложности новые блоки находят быстро, но время у людей на компьютерах отличается значительно (относительно скорости нахождения), соответственно эта ошибка может не позволить поместить ваш блок в блокчейн (например потому что у вас время в прошлом, относительно уже существующего блока), я точно не помню но там кажется майнеры крутят временем как хотят, как еще один nonce.

Плюс, в альткоинах экспериментируют с другими алгоритмами пересчета сложности (в реальном времени) обычно этот алгоритм заметно глючит на резких изменениях сложности, и вакханалия с блоками может длиться несколько перерасчетов.
Sign up to leave a comment.