Что такое «быстрая» синхронизация Geth и почему она быстрее?

В одном из ответов на этот вопрос предлагалось использовать --fastфлаг Geth для быстрой синхронизации данных блока.

Как работает флаг и как его использование ускоряет синхронизацию? Мы синхронизируем меньше данных или каким-то образом меньше проверяем их целостность или источник?

Редактировать:

Начиная с Geth версии 1.6.0 флаг --fastстал --syncmode=fast(хотя --fastпока еще можно использовать).

Ответы (4)

На github есть много подробностей об этом PR . Вот цитата:

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

Почему бы не сделать --fast значением по умолчанию?
Потому что тогда вы теряете с ним государство. В квитанциях говорится только о том, что эти действия произошли, они фактически не показывают результаты выполнения.
@ VoR0220 потеря состояния не является проблемой. Проблема в том, что когда мы включаем --fastна любой момент времени , мы открываем себя для атак, когда у злоумышленника есть бесконечное временное окно, в котором он может атаковать жертву, приняв действительный заголовок, но с недопустимым состоянием. Эта проблема существует и при наверстывании с нуля, но из-за некоторой рандомизации мы можем легко бороться с этим.
Итак, @JeffreyW. Вы говорите, что мы не должны использовать geth --fast из соображений безопасности? Я синхронизирую с ним geth прямо сейчас, и мне нужно знать, становлюсь ли я уязвимым для хакеров, делая это.
Синхронизация с нуля — это нормально, вы не уязвимы

Не забудьте использовать SSD

Если у вас есть возможность, лучше использовать твердотельный накопитель NVMe.

Если у вас ограниченное пространство на SSD, см. раздел Можно ли разделить цепочку данных на два (или более) места?

Тем не менее, состояние Ethereum велико и становится больше. Будьте терпеливы, и это того стоит.

Как я могу заставить узел geth быстро загрузить блокчейн? Вики обновилась. Этот ответ был обновлен для тех, кто нашел это и имеет проблемы с синхронизацией.


Предыдущий ответ

Поскольку --fastэто часто единственное, что связано с быстрой синхронизацией, не забывайте об этом --cache.

Из путеводителя по усадьбе:

Ниже приведены некоторые флаги, которые следует использовать, если вы хотите ускорить синхронизацию клиента.

--быстро

Этот флаг включает быструю синхронизацию через загрузку состояния, а не загрузку данных полного блока. Это также значительно уменьшит размер вашего блокчейна. ПРИМЕЧАНИЕ. --fast можно запустить только в том случае, если вы синхронизируете свою цепочку блоков с нуля и только при первой загрузке цепочки блоков из соображений безопасности. См. этот пост Reddit для получения дополнительной информации.

--кэш=1024

Мегабайты памяти, выделенные для внутреннего кэширования (мин. 16 МБ/база данных принудительно). По умолчанию установлено значение 16 МБ, поэтому увеличение этого значения до 256, 512, 1024 (1 ГБ) или 2048 (2 ГБ) в зависимости от объема оперативной памяти вашего компьютера должно иметь значение.

" fast" является значением по умолчанию для --syncmodeключа

Это означает, что нет разницы использовать --syncmode fastили не использовать его.

Информация с https://github.com/ethereum/go-ethereum/wiki/command-line-options

--syncmode value      Blockchain sync mode ("fast", "full", or "light") (default: fast)
Это уже не так:Blockchain sync mode ("fast", "full", "snap" or "light") (default: snap)

Из часто задаваемых вопросов Geth https://geth.ethereum.org/docs/faq

В. Как работает синхронизация Ethereum?

О. Текущий режим синхронизации по умолчанию для Geth называется быстрой синхронизацией. Вместо того, чтобы начинать с блока генезиса и повторно обрабатывать все транзакции, которые когда-либо происходили (что может занять недели), быстрая синхронизация загружает блоки и проверяет только связанные с ними доказательства работы. Загрузка всех блоков — простая и быстрая процедура, которая относительно быстро соберет всю цепочку.

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

Итак, что такое состояние? В основной сети Ethereum уже существует множество учетных записей, которые отслеживают баланс, одноразовый номер и т. д. каждого пользователя/контракта. Однако самих учетных записей недостаточно для запуска узла, они должны быть криптографически связаны с каждым блоком, чтобы узлы могли фактически проверить, что учетная запись не подделана. Это криптографическое связывание осуществляется путем создания древовидной структуры данных над учетными записями, при этом каждый уровень объединяет нижележащий уровень в еще меньший уровень, пока вы не достигнете единственного корня. Эта гигантская структура данных, содержащая все учетные записи и промежуточные криптографические подтверждения, называется деревом состояний.

Хорошо, так почему это создает проблему? Эта структура данных trie представляет собой сложную взаимосвязь сотен миллионов крошечных криптографических доказательств (узлов trie). Чтобы действительно иметь синхронизированный узел, вам необходимо загрузить все данные учетной записи, а также все крошечные криптографические доказательства, чтобы убедиться, что никто в сети не пытается вас обмануть. Это само по себе уже безумное количество элементов данных. Еще более запутанным становится то, что эти данные постоянно трансформируются: в каждом блоке (15 секунд) из этого дерева удаляется около 1000 узлов и добавляется около 2000 новых. Это означает, что вашему узлу необходимо синхронизировать набор данных, который меняется 200 раз в секунду. Хуже всего то, что пока вы синхронизируетесь, сеть движется вперед, и сообщение о том, что вы начали загрузку, может исчезнуть, пока вы скачиваете, поэтому ваш узел должен постоянно следить за сетью, пытаясь собрать все последние данные. Но пока вы на самом деле не соберете все данные, ваш локальный узел нельзя будет использовать, поскольку он не может криптографически доказать что-либо относительно каких-либо учетных записей.

Если вы видите, что вы отстаете от основной сети на 64 блока, вы еще не синхронизированы, даже близко. Вы только что закончили фазу загрузки блока и все еще выполняете загрузку состояния. Вы можете убедиться в этом сами по кажущемуся бесконечным [...] потоку журналов импортированных записей состояния. Вам также нужно будет подождать, прежде чем ваш узел станет действительно онлайн.


Прочтите остальную часть FAQ для получения дополнительных ответов, таких как:

В: Нода просто зависает при импорте сущностей состояния?!

В: Я застрял на 64 блоках позади основной сети?!

В: Почему загрузка состояния занимает так много времени, у меня хорошая пропускная способность?

В: Подождите, я не могу запустить полный узел на жестком диске?