Представьте: игрок в хардкорный экшен должен в разгар битвы открыть MetaMask и подтвердить транзакцию на покупку зелья. В 80% случаев он либо провалит миссию, либо разочаруется в процессе. Наша задача — убрать этот разрыв, сделав криптотранзакции невидимыми для геймплея. Мы интегрировали блокчейн-кошельки в более чем 50 игровых проектов — от инди до AAA, с 6-летним опытом в GameFi. Пользователи приходят играть, а не разбираться с gas, approve и seed phrases. Разберём конкретные паттерны для разных типов игр: от WebGL на Unity до мобильных билдов с WalletConnect.
Как выбрать метод интеграции блокчейн-кошелька?
Внешние кошельки (MetaMask, Phantom)
Стандарт для аудитории, уже знакомой с криптой. Через Wagmi (React) или WalletConnect AppKit подключение выглядит так:
import { useConnect, useAccount } from "wagmi";
import { injected, walletConnect } from "wagmi/connectors";
function WalletConnect() {
const { connect, connectors } = useConnect();
const { address, isConnected } = useAccount();
if (isConnected) return <GameLobby address={address} />;
return (
<div>
<button onClick={() => connect({ connector: injected() })}>MetaMask</button>
<button onClick={() => connect({ connector: walletConnect({ projectId: WC_PROJECT_ID }) })}>WalletConnect</button>
</div>
);
}
Embedded wallets — для массовой аудитории
Для casual игр — пользователи не хотят устанавливать расширения. Embedded wallet создаётся автоматически при регистрации через Google/Apple, используя SDK вроде Web3Auth или Privy. Игра получает готовый адрес без установки кошелька. Это снижает конверсию потери на 40% по сравнению с требованием установки расширения.
Session keys: взаимодействие без подписи каждый раз
Главная UX-проблема GameFi — каждое действие требует подписи в MetaMask. Session keys решают это: пользователь один раз авторизует сессионный ключ, игра использует его для транзакций автоматически. На практике мы реализовали это через ZeroDev SDK для пошаговой RPG — количество подписей на игрока снизилось с 10 до 1 за сессию (в 10 раз быстрее).
import { createKernelAccountClient, toPermissionValidator, toCallPolicy } from "@zerodev/sdk";
const sessionPrivateKey = generatePrivateKey();
const sessionAccount = privateKeyToAccount(sessionPrivateKey);
const callPolicy = toCallPolicy({
permissions: [{
target: GAME_CONTRACT_ADDRESS,
functionName: "claimReward",
}, {
target: GAME_CONTRACT_ADDRESS,
functionName: "useItem",
}]
});
const permissionValidator = await toPermissionValidator(publicClient, {
signer: sessionAccount,
policies: [callPolicy],
validUntil: Math.floor(Date.now() / 1000) + 3600,
});
const kernelClient = await createKernelAccountClient({ account: kernelAccount });
Unity интеграция: WebGL и Mobile
WebGL: JSLib bridge
В Unity WebGL нет прямого доступа к MetaMask — нужен JavaScript bridge. Мы используем готовую обёртку для вызова ethereum API:
// Plugins/WebGL/wallet.jslib
mergeInto(LibraryManager.library, {
ConnectWallet: async function() {
if (typeof window.ethereum === 'undefined') alert('MetaMask not installed');
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
unityInstance.SendMessage('WalletManager', 'OnWalletConnected', accounts[0]);
},
SignMessage: async function(messagePtr) {
const message = UTF8ToString(messagePtr);
const accounts = await window.ethereum.request({ method: 'eth_accounts' });
const signature = await window.ethereum.request({ method: 'personal_sign', params: [message, accounts[0]] });
unityInstance.SendMessage('WalletManager', 'OnMessageSigned', signature);
}
});
На стороне C# достаточно обернуть это в MonoBehaviour:
using System.Runtime.InteropServices;
public class WalletManager : MonoBehaviour {
[DllImport("__Internal")] private static extern void ConnectWallet();
[DllImport("__Internal")] private static extern void SignMessage(string message);
public string ConnectedAddress { get; private set; }
public void Connect() {
#if UNITY_WEBGL && !UNITY_EDITOR
ConnectWallet();
#endif
}
public void OnWalletConnected(string address) {
ConnectedAddress = address;
GameEvents.WalletConnected?.Invoke(address);
}
}
Mobile: WalletConnect deep links
На мобильном Unity используем WalletConnect Sharp для открытия приложения кошелька через deep link. Это протестировано на iOS и Android — пользователь переходит в MetaMask или Trust Wallet и возвращается в игру после подписи.
Почему важна обработка транзакций в игровом контексте?
Optimistic UI updates
Ждать finality транзакции (10–30 секунд на L2, минуты на mainnet) в игре неприемлемо. Мы применяем optimistic updates: показываем результат немедленно, откатываем если транзакция фейлится. Это стандарт в нашей практике — ни один игрок не должен видеть "Pending..." дольше 2 секунд.
Account Abstraction бьёт батчингом
Account Abstraction позволяет отправить несколько операций в одной транзакции. Вместо approve + buy (2 подписи) — один multicall. Средняя экономия на gas составляет 30-50%:
const txHash = await smartAccountClient.sendUserOperation({
calls: [
{ to: TOKEN_ADDRESS, abi: erc20Abi, functionName: "approve", args: [MARKETPLACE_ADDRESS, price] },
{ to: MARKETPLACE_ADDRESS, abi: marketplaceAbi, functionName: "buyItem", args: [itemId] },
],
});
Сравнение: session keys vs стандартные подписи
| Параметр | Стандартная подпись | Session keys |
|---|---|---|
| Количество кликов на операцию | 2-3 (popup + confirm) | 0 (автоматически) |
| UX в быстрой игре | Катастрофа (отвлекает) | Плавный |
| Безопасность | Полный доступ | Ограниченный (scope) |
| Время настройки | Минуты | Часы (конфигурация политик) |
Session keys — выбор для Action/RPG с высокой частотой транзакций. Для кэжуал (одна транзакция в час) достаточно embedded wallet.
Что такое session keys и как они работают?
Session keys — это механизм, при котором пользователь подписывает сессионный ключ с ограниченными правами (например, только на функции claimReward и useItem). Ключ хранится в игре и используется для автоматической отправки транзакций в течение заданного времени. В нашем кейсе с RPG время настройки политик заняло 2 дня, но результат — 10-кратное ускорение взаимодействия.
Как мы это делаем: процесс интеграции за 4 шага
- Анализ архитектуры — выбираем метод подключения под платформу (WebGL, mobile, desktop) с учётом целевой аудитории.
- Реализация подключения — интеграция Wagmi/WalletConnect или embedded SDK.
- Настройка session keys — если требуется частая отправка транзакций, конфигурируем политики и срок действия ключей.
- UI/UX для транзакций — optimistic updates, pending-индикаторы, recovery после ошибок. Тестируем все кейсы: отказ, network switch, gas failure.
Что входит в интеграцию
- Разработка API-обёрток для взаимодействия с кошельками
- Документация по интеграции SDK и конфигурации
- Обучение команды заказчика (2-3 рабочих дня)
- Тестовая среда с mock транзакциями
- Поддержка в течение 2 недель после релиза
Сроки — от 2 недель (базовая интеграция) до 2 месяцев (полный цикл с session keys и account abstraction). Стоимость рассчитывается индивидуально. Свяжитесь с нами для предварительной оценки вашего проекта. Закажите интеграцию — получите игру, где криптотранзакции стали невидимыми.
Мы сталкивались с типичными проблемами: закрытие MetaMask popup, ошибки gas estimation, несоответствие сети и отклонение транзакции. Для каждой есть решение: очередь транзакций, статические лимиты газа с fallback RPC, автоматическое переключение сети через wallet_switchEthereumChain и корректная обработка отмены. Ключевой принцип: блокчейн асинхронен, игра — синхронна. Мы проектируем UI так, чтобы pending состояние было явным, а failure — recoverable. Получите консультацию по вашей игре — сделаем ваш GameFi проект дружелюбным для миллионов игроков.







