Почему каждый должен запустить свой собственный узел Ethereum.

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

Зачем вам вообще хотеть отвечать за свой собственный узел Ethereum?

На недавней конференции Экономика в Сеуле, Южная Корея, Джо Любин выступил с речью под названием Почему Ethereum станет глобальным расчетным слоем. В нем он заявил:

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

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

Проблема

Когда блокчейн Ethereum ожил 30 июля 2015 года, его создатели предполагали, что те, кто хотел участвовать, загрузят клиентское программное обеспечение, настроят его, а затем синхронизируют своего нового клиента с блокчейном Ethereum. В то время это был единственный способ присоединиться к нам. Ранние последователи, как правило, носили технический характер, поэтому это не представляло особой проблемы. С тех пор блокчейн Ethereum становился все больше и больше, и теперь в него вовлечено все больше людей с более широкими навыками и интересами, чем у первых последователей. Кроме того, разработчики распределенных приложений (dapp) начали искать более простой и масштабируемый способ предлагать услуги своим клиентам, вместо того, чтобы создавать ферму узлов Ethereum для обработки нагрузки.

Для удовлетворения этих требований были созданы такие сервисы, как Infura, QuikNode и BlockCypher. Вместо того, чтобы брать на себя ответственность за запуск собственного клиента Ethereum, одна из этих служб сделает это за вас. Это стало одним из основных способов взаимодействия разработчиков децентрализованных приложений с блокчейном Ethereum.

В результате большие блоки сети работают на инфраструктуре Infura, которая сама по большей части полагается на Amazon Web Services (AWS). Не заблуждайтесь: Infura делает невероятную работу; сеть Ethereum была бы намного слабее, если бы внезапно исчезла. Но проблема здесь заключается в том, что большое количество узлов, которые управляют блокчейном Ethereum, принадлежат Infura и другим подобным сервисам. Из статьи на CCN:

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

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

Что мы освещаем

Когда вы выполните шаги, которые я описываю в этих статьях, вы будете безопасно запускать собственный узел Ethereum на удаленном компьютере, тем самым внося свой вклад в децентрализацию сети Ethereum. Эта машина может быть виртуальным частным сервером (VPS), например, предоставляемым Digital Ocean, Linode или AWS, или это может быть компьютер в вашем собственном доме. Вы также настроите SSH-туннель, чтобы ваш удаленный узел был доступен на вашем локальном компьютере. Вы узнаете, как указать MetaMask на своем узле, чтобы воспользоваться вашим собственным вкладом в сеть Ethereum. Я также объясняю, как сделать ваши усилия постоянными, автоматически перезагружаясь при любом сбое или перезагрузке. В общем, вы значительно опередите большую часть пользователей Ethereum. Думаю, это того стоит.

Самое сложное сначала

Для начала рассмотрим, как настроить узел Go Ethereum (geth) на сервере под управлением Linux. Это звучит пугающе, не правда ли? Не волнуйтесь, вам не придется устанавливать сам Linux. Я собираюсь дать руководство о том, как создать экземпляр Linux на Linode, провайдере Linux VPS. Фактически, я использую свой собственный geth узел на Arch Linux Linode VPS. В этом упражнении мы будем придерживаться более распространенного дистрибутива Linux - Ubuntu. В образе Ubuntu Linode предустановлено несколько утилит, таких как sshd, wget, tmux и sudo. Это избавляет от необходимости объяснять, как установить эти утилиты, позволяя нам сконцентрироваться на текущей задаче. Перейдите на https://www.linode.com/ и - если у вас его еще нет - зарегистрируйте учетную запись.

В сторону

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

Вернемся к делу

После того, как у вас будет учетная запись на Linode, войдите в систему и перейдите на свою панель управления, если вы не попали туда автоматически. Нажмите кнопку Создать вверху. В раскрывающемся меню выберите Linode. В разделе Выбрать дистрибутив щелкните Ubuntu. В разделе Регион выберите подходящий для вашего региона. В разделе Linode Plan выберите уровень обязательств, который вам удобен. По данным Etherscan, geth узел, который был быстро синхронизирован, в настоящее время занимает около 133 ГБ дискового пространства. Возможно, на время вы сможете обойтись Linode 8GB VPS с 160 ГБ памяти, но вам быстро не хватит места. Вы можете начать с этого размера, чтобы попробовать что-нибудь; Linode позволяет изменять размер экземпляра в любое время, чтобы вы могли перейти на следующий уровень, если решите сделать свой узел постоянным. На данный момент я предполагаю, что вы выбрали Linode 16GB, чтобы избежать проблем с хранением. Для Linode Label укажите имя, по которому будет ссылаться ваш VPS, или просто оставьте значение по умолчанию, созданное на ваш выбор. В разделе Root Password введите пароль, который вы должны предоставить позже, чтобы войти в свой VPS. Справа вы увидите сводку выбранных вами вариантов и большую кнопку Создать. Щелкните кнопку.

Ваш новый VPS будет создан. Когда все будет готово, нажмите Запустить консоль в правом верхнем углу. Появится новое окно с запросом на вход в систему. Войдите в систему как root, используя пароль, который вы указали при создании. Вы должны остаться в командной строке, которая выглядит следующим образом:

root@localhost:~#

Уборка

Прежде чем мы начнем geth установку, нужно кое-что сделать. Сначала создайте пользователя без полномочий root. Вы никогда не хотите входить в систему как root. Никогда. Для нормальной повседневной работы вы работаете как пользователь со стандартными привилегиями, получая привилегии root только по мере необходимости. Введите команду useradd, заменив Regular User и user на свой выбор, если, конечно, ваше имя на самом деле не Обычный пользователь. После этого добавьте этого нового пользователя в sudo систему как пользователя, который может повысить свои привилегии. Наконец, укажите пароль для пользователя. С этого момента я использую # в начале строки, чтобы указать команды, которые нужно запускать от имени пользователя root, и $, чтобы те выполнялись от имени обычного пользователя. Нет необходимости вводить этот символ.

# useradd -c "Regular User" -d /home/user -m -s /bin/bash user
# echo "%user ALL=(ALL:ALL) ALL" > /etc/sudoers.d/user
# chmod 440 /etc/sudoers.d/user
# passwd user

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

# passwd --lock root
# reboot

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

$ sudo su -
[sudo] password for user:
root@localhost:~#

Введите exit, чтобы вернуться к учетной записи обычного пользователя. Теперь вы готовы к установке geth.

Установка geth

Мы используем последнюю версию geth от команды Go Ethereum. На момент написания этой статьи это была версия Punisher (v1.8.27). Если вы читаете эту последнюю версию, перейдите сюда и щелкните правой кнопкой мыши кнопку Geth x.x.xx для Linux вверху. Выберите Копировать адрес ссылки или другой эквивалент для вашего браузера. В командной строке введите wget, затем пробел, затем вставьте только что скопированную ссылку и нажмите return. Затем распакуйте только что загруженный файл и переместите его в место, о котором известно системе. После этого вы должны проверить, что система знает, как найти geth.

$ wget https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.8.27-4bcc0a37.tar.gz
$ tar xf geth-linux-amd64-1.8.27-4bcc0a37.tar.gz
$ cd geth-linux-amd64-1.8.27-4bcc0a37
$ sudo mv geth /usr/bin/
$ cd ~
$ geth version
Geth
Version: 1.8.27-stable
Git Commit: 4bcc0a37ab70cb79b16893556cffdaad6974e7d8
Architecture: amd64
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.11.9
Operating System: linux
GOPATH=
GOROOT=/home/travis/.gimme/versions/go1.11.9.linux.amd64

Если вы не получили что-то похожее на ответ от geth, приведенный выше, вам нужно будет устранить неполадки. Если да, поздравляем! Теперь у вас есть рабочий Linux VPS с geth правильно установленным.

Синхронизация вашего узла

Прежде чем мы сможем что-либо сделать, нам нужно синхронизировать наш узел с блокчейном Ethereum. Это занимает много времени даже в «быстром» режиме. Фактически, дни. Чтобы начать процесс, введите:

$ tmux
$ geth --syncmode "fast" --cache=1024

Вы видите несколько строк вывода из geth, а затем он приостанавливается на некоторое время. Когда вы видите, что начинают появляться строки с импортированными новыми заголовками блоков, вы знаете, что синхронизация началась. Это часть, которая длится несколько дней. Чтобы безопасно закрыть окна и оставить geth для завершения синхронизации, введите ctrl-b d. Другими словами, удерживая клавишу control, нажмите b. Отпустите клавишу control и нажмите d. Вы должны увидеть следующий результат:

[detached (from session 0)]

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

$ geth attach
> web3.eth.syncing
> {
  currentBlock: 142490,
  highestBlock: 7640000,
  knownStates: 143562,
  pulledStates: 143174,
  startingBlock: 0
}
>

Нажмите ctrl-d, чтобы выйти из консоли. Проверяйте время от времени еще раз, чтобы следить за прогрессом. Когда результат меняется с количества блоков и состояний на false, ваш узел синхронизируется с основной сетью Ethereum. Вы можете безопасно закрыть это окно терминала. Когда вы вернетесь в это окно терминала, нажав ссылку Launch Console, как и раньше, вы можете повторно подключиться к своему экземпляру geth, набрав следующее:

$ tmux attach -t 0

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

Настройка вашего узла для удаленного доступа

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

Настройка доступа RPC

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

Вернитесь в панель управления Linode и убедитесь, что вы находитесь на вкладке Linodes слева. Нажмите на три вертикальные точки справа от имени, которое вы дали VPS, на котором запущен geth. В раскрывающемся меню выберите Запустить консоль. Когда появится окно терминала и вы снова войдете в систему, подключитесь к своему экземпляру geth с помощью:

$ tmux attach -t 0

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

Остановите свой geth узел с помощью ctrl-c. Для его выключения потребуется некоторое время, поскольку он выполняет некоторые служебные операции, но в конечном итоге вы останетесь в командной строке. Ваш geth мертв. Теперь мы снова запускаем его с другим набором переключателей. Введите следующее, чтобы запустить geth с включенным RPC для локального компьютера:

$ geth --rpc --rpcaddr localhost --rpcport 8545

В конечном итоге ваш узел вернется к выплевыванию строк с Импортированным новым сегментом цепочки. На этом вы завершили настройку узла geth.

Приближается

Во второй статье этой серии я объясню, как настроить локальный SSH-туннель и заставить MetaMask использовать этот туннель для взаимодействия с нашим geth узлом. В заключение я опишу, как сделать все, что мы сделали, пережить сбои и перезагрузки, чтобы все это перезапускалось автоматически. Увидимся там!

Первоначально опубликовано на https://kauri.io.

Заявление об ограничении ответственности: мнения, выраженные выше автором, не обязательно отражают точку зрения Consensys AG. ConsenSys - это децентрализованное сообщество, в котором ConsenSys Media является платформой, на которой участники могут свободно выражать свои разнообразные идеи и точки зрения. Чтобы узнать больше о ConsenSys и Ethereum, посетите наш веб-сайт.