Тестирование Peggo
Добро пожаловать в среду тестирования PegGo. Цель этой сборки согласована с общей целью проекта — привести вещи в соответствие и ускорить итерации. Используя один и тот же язык для модуля, оркестратора и теста, мы можем добиться полного охвата тестами всех логических ветвей.
Это особое место, где нас не волнуют такие вещи, как:
Версия ноды
Мириады пакетов JS, жалующихся на версии и несоответствия API
Различные местоположения артефактов контракта ERC20
Всё развертывается медленно
Отладка ошибок Ganache
Мы заботимся о:
Скорости работы
Отчеты о коде Go
Отсутствии проблем, связанных с инструментами или средой разработки
Кроссплатформенности (macOS)
Поддержке любой целевой EVM, реализующей Ethereum JSON-RPC
100% совместимости с реальной сетью
Предварительные Требования
Вы можете указать любой удаленный EVM эндпоинт для запуска теста, но лучший и наиболее стабильный способ всё протестировать — запустить экземпляр Ganache или Hardhat. Hardhat используется исключительно как поставщик узлов JSON-RPC.
Предпочтительный инструментарий компилятора Solc:
Запустите 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-1CHAIN_DIR- префикс для всех директорий с данными и логами, будет удален еслиCLEANUP=1DENOM- номинал монет в 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