Когда я только начал разрабатывать платформу Ethereum, синхронизация узла была одним из первых шагов, которые я сделал. Не имея никого, кто мог бы держать меня за руку, и некуда было объединить все распространенные ошибки, с которыми я столкнулся, я потратил недели, просто синхронизируя узел. Это была такая головная боль, что я почти сдался.

Незнание терминологии только усложняло задачу.

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

Быстрое вступление

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

Для синхронизации узла Ethereum нам понадобится следующее программное обеспечение:

  • Geth - Клиент для узла Ethereum.
  • Кошелек Ethereum - Пользовательский интерфейс для узла Ethereum.

Давайте начнем.

Установить Geth

Чтобы скачать Geth, перейдите здесь для пользователей Windows. Затем нажмите кнопку Geth for Windows.

Для пользователей MacOS я рекомендую загружать с помощью homebrew. Вы можете сделать это с помощью следующих команд:

brew tap ethereum/ethereum
brew install ethereum

Обратитесь к Инструкциям Geth для получения более подробной информации.

Убедитесь, что Geth установлен правильно, набрав geth version в терминале (MacOS) или PowerShell (Windows).

Установить кошелек Ethereum

Мы называем графический интерфейс, который взаимодействует с сетью, «кошельком». Вы можете найти множество различных кошельков для Ethereum с помощью быстрого поиска в Google (например, Parity, Jaxx и MyEtherWallet). Мне лично нравится использовать кошелек Ethereum. У него удобный интерфейс, и я немного предвзято отношусь к нему, потому что он разработан самим Ethereum.

Вы можете найти программу установки здесь.

Примечание. Я предпочитаю Ethereum Wallet, а не Mist. Mist - это, по сути, браузер, который отображает децентрализованные приложения (dApps) и веб-сайты.

Для разработки смарт-контракта нам понадобится только кошелек Ethereum.

Основная сеть против тестовой сети

В Ethereum есть две основные сети: основная и тестовая.

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

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

Мы называем тестовую сеть Ropsten.

Запустите Geth и Ethereum Wallet

Когда вы разрабатываете смарт-контракт, вам следует сначала синхронизировать тестовую сеть. Нам нужно будет синхронизировать основную сеть только тогда, когда мы будем готовы к развертыванию.

Для синхронизации тестовой сети вам потребуется около 30 ГБ дискового пространства. Поскольку в основной сети больше транзакций, вам потребуется около 100 ГБ для синхронизации основной сети.

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

Для пользователей Windows

Для облегчения доступа я рекомендую вам создать папку для хранения цепочки блоков. Например, «C: \ EthereumTestnet».

После создания папки попробуйте выполнить следующую команду:

geth — testnet — data-dir=”C:\EthereumTestnet” — rpc — rpcapi eth,web3,net,personal

Изменить: похоже, что некоторые аргументы изменились. Если вы столкнулись с такой ошибкой «флаг предоставлен, но не определен: -data-dir», попробуйте изменить имя аргумента на - datadir вместо data-dir.

Аргумент --testnet указывает, что мы хотим выполнить синхронизацию с сетью Ropsten. Таким образом, чтобы синхронизировать основную сеть, вам просто нужно вынуть аргумент --testnet и изменить каталог данных. Например:

geth — data-dir=”C:\EthereumMainnet” — rpc — rpcapi eth,web3,net,personal

Аргумент --rpc включает сервер HTTP-RPC. Это позволяет нам использовать определенные услуги, например то, что указано в --rpcapi eth,web3,net,personal.

После ввода команды вы должны увидеть что-то вроде этого:

Чтобы не повредить цепочку блоков, особенно после многих часов синхронизации, вы должны НЕ внезапно закрывать командную строку. Всегда останавливайте синхронизацию, нажимая Ctrl + C, и ждите, пока Geth не закроет программу за вас.

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

Просто создайте файл с помощью любого текстового редактора и сохраните его как файл .bat. Например, RunGethTestnet.bat (имя не важно). Скопируйте и вставьте команду в файл и сохраните. В следующий раз, когда вам нужно будет запустить Geth for Ropsten, просто дважды щелкните файл.

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

Как и в случае с Geth, я также сохранил для него командный файл с примером команды, такой как приведенная ниже:

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

Как вариант, вы можете добавить приложение в свой путь.

Аргумент --node-datadir="C:\EthereumTestnet" указывает, где я хранил свои цепочки, которые точно такие же, как и для Geth.

Для пользователей Mac

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

Тем не менее, я рекомендую создать файл сценария, чтобы упростить работу Geth и Ethereum Wallet.

Примечание. Geth необходимо запускать до кошелька Ethereum.

Запуск только Ethereum Wallet автоматически запустит процесс синхронизации, поскольку он автоматически запустит клиент Geth в фоновом режиме. Это удобно для пользователя, но не включает службы RPC, которые мы хотим использовать. Таким образом, мы хотим убедиться, что RPC включен как в Geth, так и в Ethereum Wallet.

Несколько заметок

  1. Процесс синхронизации очень долгий и может занять до 2–3 дней. Наберитесь терпения и оставьте компьютер включенным на ночь.
  2. Скорость синхронизации зависит от скорости вашего интернета, количества пиров и скорости записи вашего накопителя.
  3. Поскольку данные хранятся в блоках и связаны друг с другом, повреждение в одном блоке может привести к повреждению всей цепочки данных. Это может потенциально тратить ваши усилия на дни ожидания синхронизации узла. Поэтому очень важно правильно выключить ваш Geth. В некоторых случаях может потребоваться откат. Но здесь профилактика лучше, чем лечение.
  4. Индикатор выполнения на вашем кошельке Ethereum НЕ точен. Полагаясь на него, вы будете испытывать много беспокойства и разочарования.
  5. Geth работает на порту 30303 для внешнего прослушивания.
  6. Порт по умолчанию, используемый для внутренней связи, например, между вашим кошельком и Geth, - 8545.

Убедитесь, что ваш порт для клиента Geth открыт

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

Вы можете определить эту проблему, посмотрев на количество сверстников. Если он остается постоянно низким примерно на уровне 1–3 одноранговых узлов (в течение как минимум получаса), высока вероятность, что ваше соединение ограничено. Здоровый диапазон - выше 5 сверстников.

Пользователи MacOS

При запуске Geth должно появиться уведомление о разрешении подключения. Ну и, конечно, жмем «Разрешить».

Чтобы проверить, перейдите в Системные настройки ›Система и конфиденциальность.

На вкладке Брандмауэр нажмите Параметры брандмауэра.

Пользователи Windows

Чтобы открыть порт, выберите Панель управления ›Система и безопасность› Брандмауэр Защитника Windows.

Нажмите Расширенные настройки. На боковой панели нажмите Правила для входящих.

Входящие порты, которые вы хотите открыть, - это TCP и UDP 30303. Итак, я создал одно правило для TCP 30303, а другое - для UDP 30303.

Возможно, вам также потребуется открыть исходящие порты для TCP 30303.

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

Присоединяйтесь к Geth

Чтобы получить дополнительную информацию о своем узле, вы можете подключиться к клиенту Geth и выполнять с ним команды, используя службы RPC.

Вот простой способ проверить статус синхронизации: подключитесь к клиенту, введя следующую команду на отдельном терминале / консоли.

geth attach http://127.0.0.1:8545

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

После выполнения команды вы должны увидеть что-то вроде этого.

Введите web3.eth, и вы увидите много информации. Чтобы получить конкретную информацию о синхронизации, введите вместо нее web3.eth.syncing.

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

Фактически, highBlock и knownStates будут продолжать увеличиваться по мере того, как вы синхронизируете свои узлы.

Некоторые заключительные моменты

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

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

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

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