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

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

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

Роза под любым другим названием - это… ReferenceError: anyOtherName is not defined

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

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

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

Некоторые примеры:

  • Тип Arrayish теперь разделен на Bytes (который должен быть подобен массиву) и BytesLike (который может быть подобен массиву или шестнадцатеричной строке).
  • ethers.utils.bigNumberify(v) теперь BigNumber.from(v)
  • Класс ethers.utils.BigNumber теперь ethers.BigNumber, класс ethers.utils.Wordlist теперь ethers.Wordlist, а несколько других функций были перемещены на верхний уровень.
  • Класс Interface был полностью переработан; если вы раньше использовали его для анализа фрагментов ABI, синтаксический анализ ABI теперь обрабатывается в ethers.utils.Fragment (и дочерних классах EventFragment и FunctionFragment), но обеспечивает гораздо большую гибкость для перемещения между JSON и удобочитаемыми представлениями.
  • Также в классе Interface ранее были доступны только запросы кодирования и ответы декодирования; теперь доступны как кодирование, так и декодирование как запросов, так и ответов, поэтому API немного изменился и добавил несколько других полезных методов кодирования

Модульные пакеты

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

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

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

В результате обширный набор тестовых примеров (и инструменты для создания тестовых примеров) теперь легко поддерживаются как отдельные пакеты, что уменьшает количество зависимостей разработки для большинства пользователей, а также предоставляет очень тонкий пакет изолированного теста JSON. случаи, с которыми любая другая библиотека может использовать собственные средства тестирования; например, прошивка Firefly Hardware Wallet, написанная на C, может легко запускать все соответствующие тестовые примеры для проверки генерации мнемонического закрытого ключа, подписи RFC-6979 и синтаксического анализа транзакций.

Другая библиотека, которая в значительной степени выиграет от такой модульности, - это библиотека Web3.js, которая в настоящее время включает всю библиотеку ethers.js, но требует только компонентов кодирования ethers.js ABI; как только v5 будет готов к производству, он сможет импортировать только пакет the"@ethersproject/abi".

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

Пакет "@ethersproject/experimental" - это новая площадка для случайных идей и примеров из проблем GitHub, которые можно опробовать и перенести в свои собственные пакеты или объединить в существующие пакеты, когда они созреют.

Предостережения: Хотя Lerna используется для поддержки этого монорепо, есть несколько аспектов Lerna, которые оказались проблематичными; например, нет поддержки одноразового пароля для публикации NPM, поэтому скрипты /admin/ обрабатывают большую часть процесса фиксации, например журнал изменений, управление выпусками GitHub, загрузку CDN и публикацию NPM.

Контракты

В контракты было добавлено несколько новых «корзин», которые специально направлены на то, чтобы упростить запрос исторических событий и автономные / контрфактические операции.

Добавлен метод contract.queryFilter( filter [ , fromBlock [ , toBlock ] ] ) для упрощения запроса исторических и недавних событий контракта.

Корзина callStatic упрощает вызов непостоянных функций как постоянных функций, что полезно для несогласованных запросов результатов функций или для пробных прогонов. Например, contract.callStatic.transfer(addr, amount), вместо этого будет использовать call или создать транзакцию с токеном ERC-20.

Сегмент populateTransaction может использоваться для генерации запроса транзакции, который может потребоваться для вызова функции или транзакции, что полезно для автономной подписи и контрактных кошельков в цепочке. Например, contract.populateTransaction.transfer(adds, amount) вернет объект транзакции, который можно передать в кошелек для подписи для будущей трансляции.

Кроме того, еще одно небольшое изменение, которое может повлиять на некоторых разработчиков, заключается в том, что неоднозначные методы больше не отображаются по их голому имени ни в контракте, ни в интерфейсе. Например, если в ABI указаны две конфликтующие функции с одним и тем же именем, например [ "function foo(uint256)", "function foo(address)", "function bar()"], функция foo должна быть доступна как contract["foo(uint256)"], а ссылка на bar по-прежнему может быть указана через contract.bar. В версии 4 первый метод в ABI будет доступен по его простому имени.

Более умный поставщик по умолчанию

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

Например, провайдер по умолчанию для основной сети (т.е. "homestead") имеет 4 серверных модуля (INFURA, Etherscan, Alchemy и Nodesmith), каждый с весом 1 и кворумом 2. Если сделано call , случайным образом выбираются два серверных модуля; если их ответы совпадают, Promise разрешает этот ответ, если они не совпадают, случайным образом выбирается третий серверный процесс и так далее, пока не будет достигнут консенсус между несвязанными серверными модулями.

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

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

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

Шансы и концы

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

  • Теги блокировки можно указывать как отрицательные числа в фильтрах и Provider вызовах API; например, erc20Token.queryFilter("Transfer", -1234) найдет все события передачи ERC-20 в последних 1234 блоках.
  • Новые бэкенды, любезно предоставленные Alchemy и Nodesmith, а также новый общий суперкласс, который делает добавление новых сервисов API на основе URL-адресов быстрой и простой задачей.
  • Доступен более выразительный API для управления ABI на основе JSON и удобочитаемыми форматами ABI, которые упрощают использование другими инструментами (такими как инструмент TypeScript CLI) для управления и преобразования между двумя форматами и синтаксического анализа сигнатур Solidity. В основном
  • Новый класс FixedNumber предоставляет простой объектно-ориентированный интерфейс поверх parseUnits и formatUnits и поддерживает базовую математику с фиксированной точкой, которая также включает тип Fixed в ABI (особенно для разработки Vyper)
  • Сценарии /admin обрабатывают гораздо больше задач публикации и связанной с ними безопасности (для аутентификации по-прежнему требуются четыре фактора), поэтому CDN будет оставаться синхронизированным с версией, опубликованной в NPM, выпуски GitHub будут отмечены тегами, и теперь отображается сообщение CHANGELOG. в курсе с каждым обновлением

Aion

Много времени и сил на этот релиз было потрачено благодаря щедрому гранту от Aion Foundation. Этот выпуск включает абстрагирование нескольких низкоуровневых аспектов библиотеки, что упрощает расширение и создание вспомогательных библиотек для дополнительных блокчейнов смарт-контрактов, таких как Aion.

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

Версия ethers.js со вкусом Aion (которая поддерживает как FVM на основе Ethereum, так и AVM на основе Java) также доступна для бета-тестирования от npm и доступна на GitHub.

Чтобы попробовать, используйте npm install @ethersproject-aion/ethers.

AVM (виртуальная машина Aion), основанная на виртуальной машине Java, позволяет разработчикам, уже знакомым с Java, использовать большой набор существующих инструментов для создания смарт-контрактов и взаимодействия с ними в своей сети, используя объект AvmContract в Aion. ароматизированная вилка эфиров.

Документация

Документация для v5 по-прежнему отсутствует и не обновлялась из v4 API, но постепенно обновляется, включая руководство по миграции, в формате, аналогичном руководству по миграции с v3 на v4 .

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

Обратная связь

Очевидно, что это бета-версия, поэтому будут ошибки.

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

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

Спасибо! Не стесняйтесь подписываться на меня в Twitter и на проект ethers.js на GitHub, чтобы быть в курсе последних новостей и обновлений.

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