crosschain_test.go
Обзор
Файл crosschain_test.go содержит набор тестов для проверки функциональности, связанной с кросс-чейн действиями в игровом движке (GameEngine). Основная задача — убедиться, что кросс-чейн игровые действия корректно валидируются, обрабатываются пакетно, синхронизируются состояния игроков между цепями и соблюдаются ограничения, накладываемые на такие операции.
Тесты используют адреса игроков, различные типы игровых действий (например, крафтинг, PvP, повышение уровня) и проверяют корректность обработки данных, обновления состояний игроков и взаимодействия с контрактами.
Подробное описание компонентов
Тестовые функции
TestValidateCrossChainAction
Назначение: Проверяет функцию валидации кросс-чейн действий (
ValidateCrossChainAction) игрового движка.Параметры:
t *testing.T— объект теста.Логика: Создается игровой движок, игрок и его состояние. Затем проверяются разные сценарии кросс-чейн действий:
валидные и невалидные действия,
действия с неправильным ID целевой цепи,
действия с превышением лимитов маны,
ограничения на определённые типы действий (например, запрет турниров PvP при кросс-чейн).
Пример использования: Используется в тестах внутри функции, где создаются разные
GameManagerGameActionс параметрами и проверяется результат валидации.Возвращаемое значение: Нет — в рамках теста используется ассертирование результатов.
TestProcessCrossChainBatch
Назначение: Тестирует пакетную обработку кросс-чейн действий (
ProcessCrossChainBatch).Параметры:
t *testing.T.Логика: Создаются состояния двух игроков и два кросс-чейн действия (крафтинг и получение маны). Проверяется, что после обработки батча состояния игроков обновились корректно (уменьшение/увеличение маны, увеличение количества скрафченных предметов и т.д.).
Возвращаемое значение: Нет — используется
require.NoErrorиassertдля проверки корректности.
TestSynchronizePlayerStateAcrossChains
Назначение: Тестирует функцию синхронизации состояний игрока между двумя цепями (
SynchronizePlayerStateAcrossChains).Параметры:
t *testing.T.Логика: Создаются исходное и целевое состояния игрока с разными значениями. Проверяется, что при синхронизации итоговое состояние использует корректные правила объединения данных (максимальные значения для уровня, рейтинга и т.д., суммы для побед/поражений и маны).
Возвращаемое значение: Нет — проверяются значения итогового состояния.
TestCrossChainActionCompatibility
Назначение: Проверяет, какие типы игровых действий поддерживаются для кросс-чейн взаимодействия.
Параметры:
t *testing.T.Логика: Для разных типов действий вызывается метод
isActionTypeCrossChainCompatible, проверяется соответствие ожидаемому результату.Возвращаемое значение: Нет — используется assert.
TestCrossChainConstraintValidation
Назначение: Проверяет ограничительные условия для кросс-чейн действий (
validateCrossChainConstraints).Параметры:
t *testing.T.Логика: Создаются действия с разными параметрами (например, крафт с большим количеством предметов, повышение уровня сверх лимита) и проверяется, возникает ли ожидаемая ошибка.
Возвращаемое значение: Нет — проверяется наличие или отсутствие ошибки.
Вспомогательные функции кодирования параметров действий
Используются для формирования байтовых массивов параметров различных игровых действий (крафтинг, повышение уровня, PvP):
*encodeCraftingParams(t testing.T, recipeID, quantity uint64) []byte
Кодирует параметры крафта: ID рецепта, количество, текущий таймстамп и nonce.*encodeLevelUpParams(t testing.T, targetLevel uint64) []byte
Кодирует параметры повышения уровня: целевой уровень, таймстамп и nonce.*encodePvPParams(t testing.T, opponent common.Address, rating uint64, battleType uint8) []byte
Кодирует параметры PvP боя: адрес оппонента, рейтинг, тип боя, хеш битвы (заполнен нулями), таймстамп и nonce.
Тесты структуры данных
TestCrossChainBatchResultValidation — проверяет корректность структуры результата пакетной обработки кросс-чейн действий.
TestCrossChainActionStructure — проверяет структуру и поля кросс-чейн действия.
Важные детали реализации и алгоритмы
Валидация кросс-чейн действий учитывает ограничения на тип действия, количество используемой маны, ID целевой цепи.
Синхронизация состояний игроков объединяет данные из разных цепей, выбирая максимальные или суммарные значения в зависимости от поля.
Использование big.Int для хранения числовых характеристик игроков (манна, уровень, опыт и т.д.) обусловлено возможной большой величиной этих значений.
Параметры действий кодируются в байтовые массивы фиксированной длины с простым смещением и копированием байтов, что упрощает последующую сериализацию и проверку.
Взаимодействие с другими компонентами
Импортируется пакет
contractsизsum/internal/contracts, в котором определены типы для игровых действий (GameManagerGameAction).Используются Ethereum-адреса из
github.com/ethereum/go-ethereum/common.Взаимодействие с движком игры происходит через созданный экземпляр
GameEngine(функцияNewGameEngine()), который реализует логику проверки и обработки кросс-чейн действий.Тесты опираются на пакет
testifyдля удобной проверки условий.
Диаграмма структуры и связей
flowchart TD
subgraph Tests
TVCA[TestValidateCrossChainAction]
TPB[TestProcessCrossChainBatch]
TSPC[TestSynchronizePlayerStateAcrossChains]
TCAC[TestCrossChainActionCompatibility]
TCCV[TestCrossChainConstraintValidation]
TCBR[TestCrossChainBatchResultValidation]
TCAS[TestCrossChainActionStructure]
end
subgraph Utils
ECP[encodeCraftingParams]
ELP[encodeLevelUpParams]
EPP[encodePvPParams]
end
TVCA -->|валидирует| GameEngine
TPB -->|обрабатывает батч| GameEngine
TSPC -->|синхронизирует состояния| GameEngine
TCAC -->|проверяет совместимость действий| GameEngine
TCCV -->|валидирует ограничения| GameEngine
TVCA --> ECP
TVCA --> EPP
TCCV --> ECP
TCCV --> ELP
TCBR -->|проверяет структуру| CrossChainBatchResult
TCAS -->|проверяет структуру| CrossChainGameAction
GameEngine --> contracts.GameManagerGameAction
GameEngine --> common.Address
Пример использования (из теста TestValidateCrossChainAction)
engine := NewGameEngine()
ctx := context.Background()
player := common.HexToAddress("0x1234567890123456789012345678901234567890")
playerState := PlayerState{
Player: player,
ManaBalance: big.NewInt(5000),
Level: big.NewInt(5),
// другие поля...
}
action := contracts.GameManagerGameAction{
Player: player,
ActionType: 3, // CRAFT_ITEM
ActionParams: encodeCraftingParams(t, 100, 2),
ManaAmount: big.NewInt(100),
Nonce: big.NewInt(1),
CreatedAt: big.NewInt(time.Now().Unix()),
}
result := engine.ValidateCrossChainAction(ctx, action, playerState, 2)
if result.Success {
// действие валидно
} else {
// обработка ошибки result.Error
}
Резюме
Файл crosschain_test.go — ключевой для обеспечения корректной работы механизмов кросс-чейн взаимодействия внутри игрового движка. Он проверяет:
Валидацию и ограничения кросс-чейн игровых действий,
Корректность пакетной обработки множества действий,
Синхронизацию состояния игроков между разными блокчейн-сетями,
Совместимость типов игровых действий с кросс-чейн форматом,
Правильность структуры данных, используемых для кросс-чейн коммуникации.
Этот набор тестов обеспечивает надежность и стабильность кросс-чейн функционала в проекте.