Не звертайтесь до нас: найкращі методи роботи з оновленнями клієнтів Константинополя та Ethereum

Оновлення програмного забезпечення, чи підключати недоліки безпеки, виправляти помилки чи додавати нові функції, як правило, хороша річ для програм, якими ми користуємося щодня, і ми не думаємо двічі про їх застосування. Але оновлення основних фрагментів інфраструктури також можуть бути страшними, коли вони вносять порушення змін або несподіване поведінку залежних програм, або в інших випадках, коли невдача оновлення вчасно може призвести до поломки. Це питання стосується суб'єктів малого та великого розміру, і блокчейн не є винятком.

У компанії Alchemy ми надаємо нашим клієнтам надійну, масштабовану та швидку інфраструктуру Ethereum як послугу, тому їм не доведеться боротися із підтримкою вузлів і можуть зосередитись на створенні своїх додатків. В ході нашої роботи ми засвоїли багато уроків (іноді важкий шлях!) Про те, як найкраще обробляти мережеві вилки та оновлення клієнтів. За допомогою майбутнього константинопольського твердого вила ми думали, що це буде чудовою можливістю поділитися деякими нашими найкращими практиками.

Це перша з багатьох публікацій блогу, яку ми будемо писати про запуск інфраструктури Ethereum надійним, ефективним та масштабованим способом.

Константинополь

Константинополь - це чергове оновлення Ethereum у загальній системі та впровадить п’ять EIP, що фактично є частиною більшої дорожньої карти на Ethereum 2.0. Там є багато публікацій, в яких обговорюються конкретні зміни, але головне, що слід зазначити, так як це неперервний жорсткий вил, громада прийме новий вилка, зробивши маркер та інший стан на неоновлених вузлах непридатними.

Як це впливає на вас?

Для розробників dapp ключовим способом є те, що вам потрібно буде оновити свій вузол до сумісної з Константинополем версії, або це буде несумісно з рештою мережі минулого блоку 780 000. Клієнти Ethereum, швидше за все, будуть в курсі жорстких вилок до ланцюга і випускають стабільну сумісну версію свого клієнта заздалегідь до передбачуваної дати вилки, наприклад. гет і паритет. Якщо ви керуєте своїм власним вузлом клієнта Ethereum, вам потрібно буде оновити клієнта ethereum до версії, сумісної з жорсткою форкою; Паритет був би стабільним на 2.1.10 або вище, а гет - 1,88,20 або вище.

Оновлення жорстких вилок має бути декількома і далеко між ними, але оновлення клієнтів Ethereum можуть бути набагато частіше. Якщо ви користуєтеся послугою, залежною від мережі, постійне оновлення клієнта може корисно виправити недоліки безпеки або використовувати нові функції. Однак ви повинні бути обережними, щоб не вносити несподівані проблеми у свою заявку.

Кращі практики

Якщо ви працюєте з сервісом, який вимагає регулярної взаємодії з блокчейню Ethereum, кілька основних найкращих практик позбавлять вас від потенційних катастрофічних помилок при оновленні вузлів. Ми розглянемо деякі сценарії оновлень у реальному житті, які погано стали поштовхом для цієї публікації в блозі.

Запуск декількох вузлів

Ми настійно рекомендуємо запускати декілька вузлів як загальну найкращу практику щодо підтримки внутрішньої інфраструктури Ethereum через багато переваг, включаючи підвищення надійності та масштабованості. Однак це може внести у вашу систему проблеми послідовності та ідентичності, які ми вирішимо в наступній публікації блогу.

Що стосується оновлень, запуск декількох вузлів надає кілька додаткових переваг:

  1. Додаткові вузли служать резервними копіями у випадку, якщо оновлення не вдається і робить вузол неможливим
  2. Висока доступність і відсутність простоїв під час оновлення вузлів поступово
  3. Дозволяє регресійне тестування, яке порівнює оновлені вузли з оригінальними вузлами, щоб забезпечити очікувану поведінку

У сценарії невиправного вузла новому повному архівному вузлу може знадобитися до двох тижнів, щоб повністю синхронізуватися. Без резервного копіювання це неприйнятна кількість простоїв.

Приклад 1: Міграція багі DB

Одне питання, яке ми бачили під час оновлення паритету з 1.X.X до 2.X.X, було корупцією в базі даних. Оновлення включало внутрішню міграцію БД, яка неправильно перетворювала номери блоків у фільтрі розквітання, що призводило до порожніх результатів для запитів getLog для історичних блоків. Втрата даних була незворотною, тому вузол не вдалося виправити. Нам пощастило зафіксувати це через внутрішнє тестування на канарному вузлі, резервне копіювання до наших неоновлених вузлів, щоб підтримувати наші системи, і чекати, поки проблема не буде вирішена командою паритету в 2.2.3-бета-версії.

Суворі регресійні тести

Ретельне тестування завжди настійно рекомендується для будь-яких змін у вашій системі. Під час оновлення вузлів ви хочете протестувати, щоб ваш додаток та інфраструктура продовжували працювати, як очікувалося. В іншому випадку потенційно піддаватимуть ваших користувачів та ваших систем перебоями. За допомогою декількох запущених вузлів найкращим способом гарантувати це є тестування попередніх стабільних вузлів на оновлений канарний вузол. Якщо виявлені будь-які порушення, переконайтесь, що ваші системи можуть безпечно обробляти їх, перш ніж оновити решту кластеру.

Що стосується регресійних тестів, ми переходимо прямо до джерела, відтворюючи виробничі запити проти наших вузлів. Це можна зробити вручну за одноразові перевірки, але, оскільки ми підтримуємо так багато проектів, ми створили обширну автоматизовану систему тестування, яка відбирає останні запити в реальному часі, відтворює їх у різних клієнтських версіях та порівнює результати. Це дозволяє нам перевірити, що наш код може безпечно взаємодіяти з оновленими вузлами перед відправленням у виробництво. Ця структура може бути використана і для регресійних тестів щодо змін внутрішнього коду.

Приклад 2: Зміна формату виходу відповіді

Це цікаве питання, з яким ми стикалися, коли нещодавно оновлений клієнт повернув іншу відповідь на помилку виконання EVM. Паритет 1.11.1-бета повернув відповідь, яка виглядала приблизно так:

{"Jsonrpc": "2.0", "помилка": {"код": - 32015, "повідомлення": "Помилка виконання VM.", "Дані": "Відновлено 0x"}, "id": 1}

Замість відповідей попередніх версій, які виглядали так:

{"Jsonrpc": "2.0", "id": 1, "результат": "0x"}

Зміна формату відповіді насправді вигідна, оскільки вона додає більше деталей виконання для абонента, а не мовчки не вдається, але може спричинити проблеми, якщо код не був створений для його обробки. У цьому випадку порівняння результатів відповідей спричинило зміни, і ми просто оновили наші системи та попередили своїх клієнтів, щоб вони не тривожилися новою відповіддю і могли оновити їхні послуги на сумісність.

Будуйте далі!

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

Якщо ви працюєте над проектом Ethereum і не хочете мати справу з витратами на обслуговування вузлів, поговоріть з нами! Алхімія забезпечує найшвидшу, найбільш масштабовану та найнадійнішу інфраструктуру Ethereum як послугу, щоб ви могли зосередитись на створенні свого продукту. Під капотом Alchemy побудував нову революційну інфраструктуру, яка вже надає можливість провідним блокчейн-проектам, таким як Augur, топ-блокчейн-компаніям, як CryptoKitties, та топ-хедж-фондам (керуючи понад 3 млрд доларів). Дізнайтеся більше на alchemyapi.io.