﻿---
title: "Инфляционная атака на первый депозит ERC-4626: как округление может обнулить доли"
description: "Узнайте, как прямое пожертвование может изменить обменный курс пустого хранилища ERC-4626, округлить доли вкладчика до нуля и как разработчики и пользователи могут снизить риск."
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Инфляционная атака на первый депозит ERC-4626: как округление может обнулить доли

> Только в образовательных целях; это не инвестиционный совет. Инвестиции могут привести к убыткам.

<a id="answer"></a>

## Краткий ответ

Инфляционная атака на первый депозит нацелена на пустое или почти пустое хранилище ERC-4626. Злоумышленник вносит минимальную сумму, чтобы получить первые доли, а затем напрямую переводит базовые активы в хранилище. Это пожертвование увеличивает `totalAssets()`, не увеличивая `totalSupply()`, поэтому каждая существующая доля становится дороже.

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

<a id="mechanism"></a>

## Как это работает

В простом хранилище без комиссий и защитных смещений число выпускаемых за депозит долей примерно равно `assets * totalSupply / totalAssets`. ERC-4626 требует округлять расчёт долей для заданной суммы активов вниз в пользу хранилища. При обычном обменном курсе потери от округления малы, но после искусственного роста цены доли депозит стоимостью меньше одной доли может потерять 100% из-за округления.

Успех атаки зависит от деталей реализации. Прямой перевод ERC-20 может увеличить учитываемые активы хранилища без выпуска долей, особенно если `totalAssets()` считывает баланс токенов хранилища. Злоумышленник также должен опередить жертву, пока предложение долей остаётся очень низким. Хранилища с другим методом учёта или явными мерами защиты могут не иметь такой уязвимости.

<a id="example"></a>

## Пример

Предположим, что уязвимое пустое хранилище начинает с курса 1:1. Злоумышленник вносит 1 единицу актива и получает 1 долю, а затем напрямую жертвует 999 единиц. Теперь в хранилище 1,000 активов, обеспечивающих 1 долю. Жертва вносит 999 единиц, поэтому после целочисленного округления простой расчёт даёт `999 * 1 / 1,000 = 0` долей.

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

<a id="risks"></a>

## Риски и защита

Разработчики могут снизить риск, предоставив значимую начальную ликвидность, сжигая или блокируя первоначальные доли, требуя выпуск как минимум одной доли либо используя модель обменного курса с виртуальными активами и виртуальными долями. Реализация OpenZeppelin добавляет виртуальные суммы и повышает точность долей с помощью смещения десятичных знаков; в документированной модели виртуальные доли получают часть каждого пожертвования, делая манипуляцию невыгодной или значительно более дорогой. У каждой меры защиты есть свои допущения, и её следует проверять на прямых переводах, границах округления, комиссиях, убытках и нестандартном поведении токенов.

Пользователям и интеграторам следует считать `previewDeposit()` котировкой, а не гарантированным минимумом. Отправляйте депозиты через функцию или маршрутизатор, который обеспечивает минимально допустимое число долей и отменяет транзакцию, если граница не достигнута. Перед депозитом в новое хранилище или хранилище с малым предложением долей проверьте `totalAssets()`, `totalSupply()`, формулу конвертации реализации и влияние незапрошенных переводов токенов на учёт. Выгодная котировка интерфейса не защищает транзакцию, порядок исполнения которой можно изменить.

<a id="misconceptions"></a>

## Распространённые заблуждения

- **Миф 1: ERC-4626 сам гарантирует безопасный обменный курс.** Стандарт определяет общий интерфейс и правила округления, но не защищает любую реализацию от манипуляции обменным курсом.

- **Миф 2: вызов `previewDeposit()` непосредственно перед `deposit()` гарантирует этот результат.** Состояние сети может измениться между вызовами или до исполнения. Путь депозита должен обеспечивать минимальную границу числа долей.

- **Миф 3: достаточно отклонять только депозиты с нулевым числом долей.** Это предотвращает самый крайний исход, но злоумышленник всё равно может оставить депозиту малое число долей и вызвать крупные потери от округления. Защита должна ограничивать допустимое проскальзывание, а не просто требовать ненулевой результат.

<a id="related"></a>

## Похожие темы

- [Стандарт хранилищ ERC-4626](/ru/crypto/erc4626-vault/)
- [Доказательство мошенничества](/ru/crypto/fraud-proof/)
- [Захват инициализатора обновляемого контракта](/ru/crypto/initializer-takeover/)
- [Смарт-контракт](/ru/crypto/smart-contract/)
- [Симуляция транзакции](/ru/crypto/transaction-simulation/)

<a id="sources"></a>

## Источники

- [ERC-4626: токенизированные хранилища](https://eips.ethereum.org/EIPS/eip-4626) - Ethereum Improvement Proposals (дата обращения: 2026-08-20)
- [Стандарт токенизированных хранилищ ERC-4626](https://docs.openzeppelin.com/contracts/4.x/erc4626) - OpenZeppelin (дата обращения: 2026-08-20)
- [Реализация ERC4626 от OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/ERC4626.sol) - OpenZeppelin (дата обращения: 2026-08-20)

Source: https://wiki.fcontext.com/ru/crypto/erc4626-inflation-attack/index.mdx
