Розробка системи embedded wallets

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Розробка системи embedded wallets
Складний
~1-2 тижні
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Розроблення системи 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 місяці