Архитектура блокчейна для QA
Блокчейн — распределённый, неизменяемый реестр транзакций. Баги перманентны — подтверждённую транзакцию нельзя отменить.
Ключевые компоненты
- Узлы (Nodes): Хранят копии блокчейна и валидируют транзакции
- Механизм консенсуса: Proof of Work, Proof of Stake
- Смарт-контракты: Самоисполняющиеся программы (Solidity для Ethereum)
- Кошельки (Wallets): Управление криптоключами и подписание транзакций
- dApps: Децентрализованные приложения
Тестирование смарт-контрактов
Распространённые уязвимости
- Reentrancy: Внешние вызовы до обновления состояния
- Integer overflow/underflow: Арифметические ошибки в расчётах токенов
- Контроль доступа: Отсутствие проверок разрешений
- Front-running: Переупорядочивание транзакций майнерами
- Flash loan атаки: Манипуляция рынками через мгновенные займы
Инструменты
- Hardhat/Foundry: Фреймворки со встроенным тестированием
- Slither: Статический анализ Solidity
- Echidna: Фаззинг смарт-контрактов
Тестирование фронтенда dApp
- Подключение кошелька (MetaMask, WalletConnect)
- Подписание транзакций — проверка показанных деталей
- Переключение между сетями
- Обработка ошибок (недостаточно gas, отклонение)
- Обновление UI после подтверждения блока
graph LR
A[Действие пользователя] --> B[Фронтенд dApp]
B --> C[Подпись в кошельке]
C --> D[Сеть блокчейна]
D --> E[Исполнение контракта]
E --> F[Изменение состояния]
F --> G[Эмиссия события]
G --> B
Продвинутое тестирование
Testnet vs. Mainnet
- Всегда сначала тестировать на testnet
- Fork mainnet для реалистичного тестирования
- Тестировать точность оценки gas
Аудит безопасности
- Формальная верификация критичной логики
- Тестирование инвариантов
- Симуляция экономических атак
- Тестирование механизмов обновления (proxy patterns)
Практическое задание
Разработайте тест-план для токена ERC-20:
- Перевод: Между аккаунтами, проверка балансов, нулевая и максимальная сумма
- Одобрение: approve и transferFrom, проверка allowance
- Edge cases: Нулевой адрес, больше баланса, overflow
- Контроль доступа: Только авторизованные могут mint/burn
- Gas: Измерить потребление для типичных операций
Руководство по решению
- Перевод 100 токенов: баланс A -100, B +100, supply без изменений
- Перевод больше баланса: должен откатиться
- Reentrancy: callback во время перевода не должен позволить двойное списание
Советы из практики
- Тестируйте на форкнутом mainnet — testnet не воспроизводит реальные взаимодействия
- Аудит перед деплоем — баги перманентны
- Тестируйте gas при перегрузке сети — транзакции могут стать запретительно дорогими
- Проверяйте каждую деталь транзакции — фишинг через обманчивые отображения
- Тестируйте несколько провайдеров кошельков — разные потоки
Ключевые выводы
- Неизменяемость делает предрелизное тестирование критичнее, чем в любом другом домене
- Тестирование безопасности — главный приоритет
- Тестирование dApp должно покрывать кошельки, жизненный цикл транзакций и состояние блокчейна
- Оптимизация gas предотвращает неудачные транзакции и чрезмерные затраты