Прошло довольно много времени с момента выпуска новой (основной) версии 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, чтобы быть в курсе последних новостей и обновлений.
«Вселенная, вероятно, усеяна могилами однопланетных культур, которые приняли разумное экономическое решение об отсутствии веских причин для полета в космос - каждая из которых была обнаружена, изучена и запомнена теми, кто принял иррациональное решение».