Ethereum для новичков: как работает сеть, транзакции и почему есть комиссии
12-12-2025, 21:58
Авторизуйтесь или зарегистрируйтесь, чтобы оценивать материалы, создавать записи и писать комментарии.
Авторизоваться© 2026 24k.ru. Все материалы носят исключительно информационный характер и не являются индивидуальной инвестиционной рекомендацией (ФЗ-39 «О рынке ценных бумаг»). Криптовалюты не являются законным средством платежа в РФ (ФЗ-259). Используя сайт, вы соглашаетесь с нашей Политикой конфиденциальности и использованием cookie.
Оптимизация газа в EVM — это про простую вещь: какие операции в Ethereum реально “дорогие” и как писать код так, чтобы не переплачивать за storage, лишние вычисления и внешние вызовы. В 2025+ это особенно важно для DeFi и L2: в L1 комиссия чувствительнее, а в L2 вы всё равно платите за выполнение и (часто) за данные. Поэтому “дешевле сеть” не отменяет того, что плохой код может сделать операцию дорогой и медленной.
База по терминам: газ в Ethereum, комиссии. Углублённо: паттерны оптимизации газа, опкоды EVM.
Коротко: в большинстве контрактов главный “пожиратель” газа — storage (SSTORE/SLOAD) и лишние внешние вызовы. Оптимизация почти всегда начинается с (1) уменьшения количества записей в storage, (2) кэширования чтений, (3) правильной работы с calldata/memory, (4) событий вместо хранения лишних данных.
Чтение и особенно запись в storage стоят дорого, потому что storage — это часть состояния блокчейна, которое должны хранить и обслуживать все узлы. Поэтому любое “лишнее состояние” в контракте — это системная стоимость.
Каждый внешний вызов (вызов токена, DEX, оракула, другого контракта) — это дополнительные операции, потенциальные revert-сценарии, а иногда и расширение поверхности атаки (например, reentrancy). Часто оптимизация газа совпадает с упрощением архитектуры.
Параметры функций, массивы, строки, ABI-кодирование — всё это создаёт накладные расходы. Для публичных функций особенно важно, где вы держите данные: calldata или memory.
Если вы несколько раз читаете одну и ту же переменную из storage — разумно прочитать один раз и работать с локальной копией. Это особенно заметно в циклах и сложных функциях.
Если функция внешняя и вы не меняете входные данные, используйте calldata вместо memory. Это уменьшает копирование данных.
Мелкие типы (uint128/uint64/bool) могут быть упакованы в один слот, если стоят рядом. Это снижает количество storage-слотов и экономит на хранении. Но есть важная оговорка: если контракт апгрейдируемый, упаковка повышает риск ошибок storage layout при изменениях. Для upgradeable контрактов оптимизация через packing должна быть осознанной и проверяемой.
Хранить логику истории в storage дорого. Если вам нужно, чтобы фронтенд/индексатор видел факт, используйте events. Храните в storage только то, что нужно для дальнейших вычислений на цепочке.
Циклы по динамическим массивам в storage могут стать непредсказуемо дорогими. В худшем случае функция станет невыполнимой при росте массива. Лучше проектировать логику так, чтобы:
Если пользователь часто делает несколько шагов подряд, можно дать “батч”-функцию, которая выполняет серию действий за одну транзакцию. Это экономит на постоянных накладных расходах (call overhead) и иногда упрощает UX. Но батчи увеличивают сложность и требуют хороших тестов.
Самая частая ошибка — тратить время на мелочи (типы, инкременты, трюки), когда основной расход — лишние SSTORE или внешние вызовы. Сначала оптимизируют структуру состояния и количество записей, и только потом — микродетали.
Оптимизация не должна ломать безопасность: например, сокращение проверок доступа, упрощение логики внешних вызовов без защиты от reentrancy, или попытки “сэкономить” на валидности входных данных. В безопасности стоимость ошибки обычно на порядки выше, чем экономия газа.
Если вы используете прокси-апгрейды, любое изменение layout может убить контракт. Слишком плотная упаковка мелких типов усложняет безопасные изменения и повышает вероятность storage collision. Иногда “чуть дороже, но стабильнее” — правильный выбор.
Новички часто пишут в storage всё подряд: прошлые цены, историю транзакций, списки всех участников. В итоге функция дорожает, массивы растут, и через год контракт становится непригодным для использования из-за газ-лимитов. Историю обычно лучше вести через events и индексацию.
| Тип контракта | Где чаще всего “горят” деньги | Что даёт наибольший эффект |
|---|---|---|
| ERC-20 / учёт балансов | SSTORE на обновлении балансов/allowance | минимизировать лишние записи, аккуратно с allowance, события для истории |
| DEX / AMM | сложные вычисления + множественные записи | кэширование, батчи, оптимизация формул, сокращение промежуточных записей |
| Лендинг | пересчёты процентов/индексов, циклы, обновления позиций | ленивые обновления (lazy), индексы, порционность операций |
| NFT (721/1155) | минт партиями, хранение метаданных/списков | батч-минт, события вместо лишних массивов, аккуратные маппинги |
Сокращение количества записей в storage и уменьшение числа внешних вызовов. В большинстве контрактов это сильнее любых микрооптимизаций.
Потому что storage — часть глобального состояния блокчейна. Его должны хранить и обслуживать все узлы, поэтому операции чтения/записи имеют высокую стоимость по газу.
Не всегда. Packing может снизить количество слотов, но усложняет апгрейды и повышает риск ошибок layout. В upgradeable контрактах это нужно делать очень осознанно.
События не хранятся в storage контракта и обычно подходят для истории и индексации. Но события — это не “память для ончейна”: контракт не может читать события обратно, поэтому храните в storage только то, что нужно для дальнейшей логики.
Нет. В L2 операции часто дешевле, но плохой код всё равно делает транзакции дорогими и может упереться в лимиты или ухудшить UX. Плюс многие L2 учитывают стоимость данных, и “болтливые” транзакции могут быть неожиданно дорогими.
Материал носит исключительно информационный характер и не является индивидуальной инвестиционной рекомендацией (ФЗ-39). Криптовалюты не являются законным средством платежа в РФ (ФЗ-259).
12-12-2025, 21:58
13-12-2025, 02:11
26-11-2025, 17:35
13-12-2025, 01:29
13-12-2025, 18:49
Комментариев нет