Архитектура блокчейна для 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:

  1. Перевод: Между аккаунтами, проверка балансов, нулевая и максимальная сумма
  2. Одобрение: approve и transferFrom, проверка allowance
  3. Edge cases: Нулевой адрес, больше баланса, overflow
  4. Контроль доступа: Только авторизованные могут mint/burn
  5. Gas: Измерить потребление для типичных операций
Руководство по решению
  • Перевод 100 токенов: баланс A -100, B +100, supply без изменений
  • Перевод больше баланса: должен откатиться
  • Reentrancy: callback во время перевода не должен позволить двойное списание

Советы из практики

  1. Тестируйте на форкнутом mainnet — testnet не воспроизводит реальные взаимодействия
  2. Аудит перед деплоем — баги перманентны
  3. Тестируйте gas при перегрузке сети — транзакции могут стать запретительно дорогими
  4. Проверяйте каждую деталь транзакции — фишинг через обманчивые отображения
  5. Тестируйте несколько провайдеров кошельков — разные потоки

Ключевые выводы

  1. Неизменяемость делает предрелизное тестирование критичнее, чем в любом другом домене
  2. Тестирование безопасности — главный приоритет
  3. Тестирование dApp должно покрывать кошельки, жизненный цикл транзакций и состояние блокчейна
  4. Оптимизация gas предотвращает неудачные транзакции и чрезмерные затраты