Розроблення системи embedded wallets
Embedded wallet — гаманець, який живе всередині застосунку: користувач не знає про seed phrase, не встановлює MetaMask, не думає про приватні ключі. Вони просто входять через Google/email та отримують можливість володіти активами. Це ключовий паттерн для onboarding масової аудиторії до Web3.
Проблема, яку розв'язують embedded wallets
Вимога встановити MetaMask вбиває конверсію. Дослідження показує, що 99%+ потенційних користувачів Web3-застосунків ніколи не взаємодіяли з крипто. Embedded wallet прибирає цей барʼєр: застосунок сам управляє гаманцем, надаючи знайомий UX.
Ключові вимоги до embedded wallet:
- Non-custodial (або verifiably MPC-based) — застосунок не може красти кошти
- Recoverable — користувач не втрачає доступ при змені пристрою
- Exportable — користувач може перейти на self-custody
- Seamless — не перериває UX застосунку
Технічні підходи до зберігання ключів
MPC (Multi-Party Computation)
Ключ ділиться між пристроєм користувача, сервером застосунку та (опціонально) третьою стороною. Підпис вимагає взаємодії мінімум двох учасників.
Реалізації: Privy (Shamir Secret Sharing + key sharding), Dynamic (Turnkey під капотом), Particle Network (власний MPC-TSS), Web3Auth (threshold signatures).
Key Share 1: User device (localStorage encrypted / SecureEnclave)
Key Share 2: Provider server (HSM)
Key Share 3: Recovery factor (email/social provider)
Signature = MPC протокол між Share 1 + Share 2
Recovery = MPC між Share 2 + Share 3
Жодна зі сторін не може одна відновити повний ключ.
TEE (Trusted Execution Environment)
Ключ генерується та зберігається в захищеній anclav середовищі (Intel SGX, AWS Nitro Enclaves). Turnkey використовує цей підхід. Код у TEE верифікуємий (attestation), оператор TEE не може отримати доступ до даних всередині.
Шифрування на клієнті + хмарний backup
Найпростіший підхід: key pair генерується у браузері, шифрується паролем користувача, зашифрований blob зберігається в хмарі. При вході — blob завантажується, розшифровується паролем. Privy використовує варіацію цього як fallback.
Мінус: безпека = складність пароля + безпека хмари.
Реалізація через Privy
Privy — найбільш зрілий розв'язок для embedded wallets. Підтримує social login, embedded wallet з MPC, export ключа.
import { PrivyProvider, usePrivy, useWallets } from "@privy-io/react-auth";
function App() {
return (
<PrivyProvider
appId="YOUR_APP_ID"
config={{
loginMethods: ["email", "google", "twitter", "wallet"],
embeddedWallets: {
createOnLogin: "users-without-wallets",
requireUserPasswordOnCreate: false,
showWalletUIs: true,
},
appearance: {
theme: "dark",
accentColor: "#6366f1",
},
}}
>
<Main />
</PrivyProvider>
);
}
function Main() {
const { login, authenticated, user } = usePrivy();
const { wallets } = useWallets();
const embeddedWallet = wallets.find(w => w.walletClientType === "privy");
async function signMessage() {
if (!embeddedWallet) return;
const provider = await embeddedWallet.getEthereumProvider();
const signature = await provider.request({
method: "personal_sign",
params: ["Hello World", embeddedWallet.address],
});
return signature;
}
return authenticated ? (
<div>
<p>Address: {embeddedWallet?.address}</p>
<button onClick={signMessage}>Sign</button>
</div>
) : (
<button onClick={login}>Login</button>
);
}
Власна реалізація на базі Web3Auth
Web3Auth надає MPC інфраструктуру яку можна інтегрувати напрямую без зайвих прошарків:
import { Web3Auth } from "@web3auth/modal";
import { CHAIN_NAMESPACES, WEB3AUTH_NETWORK } from "@web3auth/base";
const web3auth = new Web3Auth({
clientId: "YOUR_CLIENT_ID",
web3AuthNetwork: WEB3AUTH_NETWORK.SAPPHIRE_MAINNET,
chainConfig: {
chainNamespace: CHAIN_NAMESPACES.EIP155,
chainId: "0x1",
rpcTarget: "https://rpc.ankr.com/eth",
},
uiConfig: {
appName: "My App",
mode: "dark",
loginMethodsOrder: ["google", "twitter", "email_passwordless"],
},
});
await web3auth.initModal();
// Користувач натискає кнопку → вибирає social provider → отримує гаманець
const provider = await web3auth.connect();
const accounts = await provider.request({ method: "eth_accounts" });
Web3Auth використовує Shamir Secret Sharing: ключ ділиться на shares між nodes мережі (threshold мережа). Мінімум T з N nodes повинні согласитись, щоб відновити ключ. Архітектура верифікуєма через attestation.
Кастомний флоу відновлення
Embedded wallet без recovery = катастрофа при змені пристрою. Потрібно реалізувати:
Email recovery. При вході з нового пристрою — код підтвердження на email → відновлення key share.
Social recovery. Власник назначає guardians (інші адреси). При втраті доступу — guardians голосують за зміну власника. Реалізується через смарт-контракт поверх embedded wallet.
Passkey (WebAuthn). Біометрична аутентифікація як другий фактор. Face ID/Touch ID як key share. Підтримується у iOS Safari, Chrome на Android, macOS.
// Регістрація passkey
async function registerPasskey() {
const credential = await navigator.credentials.create({
publicKey: {
challenge: await getChallenge(),
rp: { name: "My App", id: "myapp.com" },
user: {
id: new TextEncoder().encode(userId),
name: userEmail,
displayName: userName,
},
pubKeyCredParams: [{ type: "public-key", alg: -7 }], // ES256
authenticatorSelection: {
authenticatorAttachment: "platform",
userVerification: "required",
residentKey: "required",
},
},
});
// Зберігаємо credential ID та public key
await savePasskeyCredential(credential);
}
Session Keys для бесшовного UX
Для застосунків з частими транзакціями (гри, trading) — session keys дозволяють підписувати транзакції без підтвердження користувачем кожної:
interface SessionKeyConfig {
expiresAt: number; // unix timestamp
allowedContracts: string[]; // тільки ці контракти
maxValuePerTx: bigint; // ліміт ETH за транзакцію
dailySpendLimit: bigint; // щоденний ліміт
allowedFunctions: string[]; // function selectors
}
Користувач один раз підтверджує сесію (як "дозволити застосунку X операції протягом Y"), далі застосунок використовує session key без запитів.
Порівняння провайдерів
| Провайдер | Підхід | Export ключа | Self-hosted | Passkeys |
|---|---|---|---|---|
| Privy | MPC (Shamir) | Так | Ні | Так |
| Dynamic | Turnkey (TEE) | Так | Ні | Так |
| Web3Auth | MPC (threshold) | Так | Частково | Так |
| Magic | DKMS (HSM) | Pro план | Ні | Ні |
| Particle Network | MPC-TSS | Так | Так (enterprise) | Так |
Безпека та compliance
Key export. Повинен бути реалізований: користувач натискає «Експортувати ключ», проходить додаткову верифікацію (email OTP + пароль), отримує private key або seed phrase. Критично для non-custodial позиціонування.
Server-side validation. Сервер не повинен мати можливості провести транзакцію без згоди користувача. Архітектура MPC повинна це гарантувати — і це повинно бути верифікуємо (open-source SDK, attestation).
Audit trail. Всі операції логуються (без приватних ключів даних). Користувач може переглянути історію дій зі своїм гаманцем.
Стек
Готові провайдери: Privy, Dynamic, Web3Auth, Particle Network Смарт-контракти для social recovery: Safe{Core} Recovery Module, ERC-4337 сумісні рахунки Session keys: Kernel (ZeroDev), Alchemy Modular Account Passkeys: SimpleWebAuthn (сервер), navigator.credentials (браузер)
Графік
- Базова інтеграція (Privy/Dynamic + social login + embedded wallet): 1-2 тижні
- Кастомний UI + recovery flows: +1-2 тижні
- Session keys + gasless транзакції: +1-2 тижні
- Власна MPC інфраструктура (enterprise): 3-4 місяці







