Сохраняет ли полный узел все действительные форки и «альтернативные» блоки из истории блокчейна?

Форки возможны при майнинге блокчейна и происходят «все время» во время майнинга.

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

Хранят ли узлы все ветки из всей истории блокчейна?

РЕДАКТИРОВАТЬ: я прочитал еще один вопрос, и логично, что узел должен возвращать транзакции из «альтернативной» ветки, в которой они находились, в пул памяти (или отбрасывать их). Но происходит ли это в тот самый момент, когда им кто-то «показывает» более длинную ветку, или они все же как-то сохраняют альтернативные ветки?

Ответы (1)

Хранят ли узлы все ветки из всей истории блокчейна?

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

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

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

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

Но зачем мне отслеживать «устаревшие» ветки? Разумно отслеживать только тот узел ответвления, который в данный момент включен.
Потому что эти «устаревшие ветки» полностью действительны и потенциально могут однажды стать основной цепью. Без отслеживания этих ветвей мы не сможем перестроиться на цепочку с наибольшим объемом работы, если окажемся в цепочке с меньшим объемом работы.
Но 99,99% этих веток бесполезны. И нам вообще не нужно их отслеживать. Если какая-либо из них в конечном итоге становится главной цепью, узел может полностью восстановить ее из точки, в которой она разошлась (и может переключиться сам).
Мы не знаем, в какой точке она расходилась. Если вы предлагаете построить цепочку, запрашивая блоки у пира, то это легко подвергается DoS-атаке.
Я не согласен. Вы спрашиваете у пира, предоставившего новый блок. Если он не сможет предоставить, мы остановимся. Нет ДоС. Более того, ситуация такая же, как если бы мы отстали на пару кварталов от его ветки (или даже основной ветки).
Атака заключается в том, что злоумышленник может постоянно сообщать вам, что он использует другой форк, заставляя вас постоянно запрашивать новые блоки, которые занимают больше места на диске, больше ЦП и ОЗУ для проверки и большую пропускную способность. Мы не знаем, что такое ветки, поэтому нам пришлось бы поверить этому партнеру на слово и посмотреть, верны ли его ветки. Отслеживая все ветки, нам не нужно этого делать, и мы знаем, что такое все ветки и их текущие подсказки.