Comments 23
Может ли кто-нибудь на пальцах объяснить, как это достигается? Сколько я ни спрашивал, никто толком так и не смог ответить.
А именно, идет ли здесь завязка за какой-то таймер и астрономическое время, или же просто говорится «мощность компьютера растет в среднем как 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 блоков, то есть имеется некий гистерезис, который позволяет прогнозировать условия, выставляемые сетью для новых блоков.
Любые конфликты в блокчейне регулируются по извечному принципу «у кого длиннее, тот и круче». Ну да, некоторые блоки могли быть одновременно найдены несколькими участниками (или блоки с недостаточной сложностью были ошибочно пущены в оборот), но рано или поздно консенсус сойдется на одном из вариантов.
Именно поэтому, прежде чем считать транзакцию валидной и принять оплату, надо дождаться нескольких независимых подтверждений, но это уже вопрос гарантий.
Первоисточник — таймстемп в блоке, который на 2016 назад.
А при валидация блока проверяется его таймстамп и если он сильно не корректен (кажется 2 часа, лень лезть проверять), то сеть его не принимает.
Так как расчет идет не на каждый блок а на каждые 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
Сложность пересчитывается каждые 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 который использовался как голос в поддержку своей подсети. По результатам голосования, проигравшая подсеть перестраивала свои адреса.
Поскольку шансы победы напрямую зависели от совокупной вычислительной мощности подсети, это автоматически решало задачу в пользу большинства. То есть никогда не возникало ситуации, когда крупный сегмент сети вынужден был бы перестраивать свои адреса в пользу одной единственной ноды.
Не будь этого механизма, всю сеть можно было бы положить одним узлом, постоянно меняющим свои адреса.
Владельцы ключа github, владельцы домена и доступа к репозитарию, с которого пользователи загружают новые версии, владельцы PR-аккаунта на форумах типа bitcointalk.org — все они имеют абсолютную власть, с оглядкой на пулы майнинга (и, косвенно, майнеров).
Это было с Ethereum из-за краха DAO (ошибка в контракте, позволила хакеру юридически легально забрать монеты почти всех пользователей DAO себе, и основатели хардфорком буквально отобрали эти монеты и вернули владельцам — несогласное сообщество создало ethereum classic), это происходит с bitcoin сейчас (bitcoin core нарушая все договоренности удерживает лимит размера блока и отказывается его менять в принципе, а ведь его уже не хватает, комиссии за транзакцию растут, 30-40р уже сейчас).
И пока сообщество не выработает механизмы по ограничению разработчиков — криптовалюта не будет действительно децентрализованной.
8 апреля 2017 года в биткойн-сети наблюдалось 7025 узлов с полной копией блокчейна
А не получится так, что со временем их количество начнет сокращаться? Сколько сейчас уже весит база? За сотню гигабайт, наверное? Причем, чтобы хранить копию базы — недостаточно ее просто скачать, надо еще ее всю перепроверить. Так что мне кажется что со временем будет все меньше желающих тратить на нее вычислительные мощности (ну кроме непосредственно майнеров). В итоге получим несколько (десятков/сотен) крупных узлов с полной копией базы.
Во вторых такие технологии как Lighting Network позволят полным нодам зарабатывать на комиссиях моментальных переводов в открытых каналах с той нодой, т.е. у владельца тяжелой ноды появится финансовая заинтересованность ее держать (правда это будет сопряжено с большими вложениями, и тем более, если разработчики bitcoin core будут продолжать играть дурочку и не расширять лимит размера блока).
Блок генерируется 10 минут. Транзакция вроде как считается подтвержденной, если за ее блоком появилось еще пять. Получается час. То есть быстро оплачивать биткоином не получится?
Если ничего не путаю, потребуется 10 минут на то, чтобы кто-то нашел очередной блок и внес в него вашу транзакцию (если его устроит комиссия) и еще сколько-то от узлов аудиторов на его подтверждение.
Что за подписи на уже существующем блоке? Где то видно сколько подписей на блоках?
подтверждение это и есть запись в только что созданный блок, переделать блок нельзя, кроме как заново решив задачу.
Плюс, в альткоинах экспериментируют с другими алгоритмами пересчета сложности (в реальном времени) обычно этот алгоритм заметно глючит на резких изменениях сложности, и вакханалия с блоками может длиться несколько перерасчетов.
«Алгоритмы консенсуса»: Подтверждение доли и доказательство работы