Тестирование Peggo

Добро пожаловать в среду тестирования PegGo. Цель этой сборки согласована с общей целью проекта — привести вещи в соответствие и ускорить итерации. Используя один и тот же язык для модуля, оркестратора и теста, мы можем добиться полного охвата тестами всех логических ветвей.

Это особое место, где нас не волнуют такие вещи, как:

  • Версия ноды

  • Мириады пакетов JS, жалующихся на версии и несоответствия API

  • Различные местоположения артефактов контракта ERC20

  • Всё развертывается медленно

  • Отладка ошибок Ganache

Мы заботимся о:

  • Скорости работы

  • Отчеты о коде Go

  • Отсутствии проблем, связанных с инструментами или средой разработки

  • Кроссплатформенности (macOS)

  • Поддержке любой целевой EVM, реализующей Ethereum JSON-RPC

  • 100% совместимости с реальной сетью

Предварительные Требования

Вы можете указать любой удаленный EVM эндпоинт для запуска теста, но лучший и наиболее стабильный способ всё протестировать — запустить экземпляр Ganache или Hardhat. Hardhat используется исключительно как поставщик узлов JSON-RPC.

Предпочтительный инструментарий компилятора Solc:

solc-select

Запустите solc-select use 0.8.2 перед запуском любых тестов.

Запуск С Использованием Hardhat

Hardhat — более новая альтернатива Ganache, которая имеет удобную инициализацию через файл конфигурации.

Запуск скрипта инициализации установит модули ноды в директорию ./test/ethereum

$ ./test/ethereum/hardhat-init.sh

После того, как инициализация выполнена, следующая команда поможет запустить сервер Hardhat:

$ ./test/ethereum/hardhat.sh

Единственная опция, которая может быть установлена через переменную окружения:

  • HARDHAT_PORT - укажите, какой порт слушать. По умолчанию 8545.

Остальные опции могут быть откорректированы по адресу ./test/ethereum/hardhat.config.js

Подготовка к тестированию с помощью Geth

Чтобы получить максимальную совместимость с реальной средой блокчейна и избежать каких-либо ошибок в среде выполнения EVM Hardhat/Ganache, а также проверить различные условия времени блокировки, можно непосредственно запустить Geth.

Запуск этого скрипта запустит постоянное хранилище данных для частной сети.

$ ./test/ethereum/geth-init.sh

Опции инициализации могут быть установлены в переменных окружения:

  • GETH_NETWORK_ID - укажите ID сети Ethereum, по умолчанию 50.

  • GETH_ALGO - укажите алгоритм консенсуса для производства блоков. По умолчанию clique (PoA), но ethash (PoW) также поддерживается. Убедитесь, что установили сложность, пропатчив ваш Geth (смотреть в конце этой страницы)

  • CHAIN_DIR - укажите директорию данных, префикс для всех директорий с данными и логов. По умолчанию ./data

Настройки блокчейна могут быть изменены по адресу ./test/ethereum/geth/genesis.json

После завершения инициализации можно использовать следующую команду для запуска полной ноды Geth:

$ ./test/ethereum/geth.sh

Опции запуска могут быть установлены в переменных окружения:

  • GETH_NETWORK_ID - укажите ID сети Ethereum, по умолчанию 50.

  • GETH_ALGO - укажите алгоритм консенсуса для производства блоков. По умолчанию ethash (PoW), но clique (PoA) также поддерживается.

  • GETH_PORT - укажите порт сервера для прослушивания. По умолчанию 8545.

  • CHAIN_DIR - укажите директорию данных, префикс для всех директорий с данными и логов. По умолчанию ./data

Cosmos Daemon

Этот набор тестов поддерживает различные бэкэнды Cosmos, в основном подойдет любое приложение со встроенным gravity модулем . Мы ожидаем, что универсальное приложение совместимо с Cosmos-SDK и имеет интерфейс командной строки, очень похожий на gaiad. Существует сценарий, который запустит изолированную полную сеть из 3 узлов, изначально работающую на хост-компьютере. Просто не забудьте указать целевой исполняемый файл в качестве аргумента.

$ CHAIN_ID=888 DENOM=inj ./test/cosmos/multinode.sh injectived
$ CHAIN_ID=somm DENOM=samoleans STAKE_DENOM=stake SCALE_FACTOR=000000 ./test/cosmos/multinode.sh sommelier

Полный список поддерживаемых переменных окружения:

  • CHAIN_ID - указывает Cosmos Chain ID, например, gravity-1

  • CHAIN_DIR - префикс для всех директорий с данными и логами, будет удален если CLEANUP=1

  • DENOM - номинал монет в Cosmos, монета сети по умолчанию. Пример: uatom, aphoton, samoleans и т.д.

  • STAKE_DENOM - номинал монет Cosmos, который используется для стейкинга и управления. В Cosmos Hub это stake. По умолчанию равен DENOM в скрипте.

  • SCALE_FACTOR - фактор разрядности монет Cosmos. По умолчанию 1e18 чтобы отражать баланс токенов Ethereum. Используйте 000000 чтобы придерживаться стиля Cosmos uatom (1e6).

  • CLEANUP - если эта опция установлена как 1, следовательно CHAIN_DIR будет удалено самым небезопасным способом.

  • LOG_LEVEL - устанавливает уровень логов конфигурации ноды Cosmos. По умолчанию main:info,state:info,statesync:info,*:error.

Важно: безопасно запускать скрипт несколько раз, он остановит узлы при запуске и, возможно, очистит состояние. Если состояние не пусто, скрипт запустит узлы без повторного запуска инициализации. Таким образом, его можно использовать для повторных тестов вручную.

Аккаунты Cosmos

Скрипт импортирует 3 аккаунта валидатора и 1 аккаунт пользователя, указанные мнемоникой в самом скрипте. Каждая учетная запись валидатора доступна как val на соответствующих узлах, а учетная запись пользователя используется всеми тремя узлами как пользователь.

Дополнение: Патчинг Geth

Geth по умолчанию масштабирует сложность блоков, чтобы достичь целевого темпа блока. Таким образом, даже если ваша сеть начинается со difficulty=1 в генезисе, сложность в следующих блоках будет выше, а время ожидания будет очень большим. Особенно фазы регенерации DAG. Решением этой проблемы в локальной настройке будет либо использование clique консенсуса для создания блоков в стиле PoA, либо просто исправление кода Geth, чтобы сложность не возрастала.

Просто скопируйте репозиторий go-ethereum:

diff --git a/consensus/ethash/consensus.go b/consensus/ethash/consensus.go
index bdc02098a..c17ea5b76 100644
--- a/consensus/ethash/consensus.go
+++ b/consensus/ethash/consensus.go
@@ -315,19 +315,7 @@ func (ethash *Ethash) CalcDifficulty(chain consensus.ChainHeaderReader, time uin
 // the difficulty that a new block should have when created at time
 // given the parent block's time and difficulty.
 func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Header) *big.Int {
-       next := new(big.Int).Add(parent.Number, big1)
-       switch {
-       case config.IsMuirGlacier(next):
-               return calcDifficultyEip2384(time, parent)
-       case config.IsConstantinople(next):
-               return calcDifficultyConstantinople(time, parent)
-       case config.IsByzantium(next):
-               return calcDifficultyByzantium(time, parent)
-       case config.IsHomestead(next):
-               return calcDifficultyHomestead(time, parent)
-       default:
-               return calcDifficultyFrontier(time, parent)
-       }
+       return big1
 }

И установите его с помощью go install ./cmd/geth . Добро пожаловать в форк Geth!

Last updated