Разработка холодного хранилища биржи

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1 услугВсе 1306 услуг
Разработка холодного хранилища биржи
Сложная
~1-2 недели
Часто задаваемые вопросы
Направления блокчейн-разработки
Этапы блокчейн-разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1221
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1163
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    855
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1056
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    828

Разработка холодного кошелька биржи

Холодное хранение — это хранение приватных ключей в полностью изолированной от интернета среде. 70–90% резервов биржи должны находиться в cold storage. Взломы крупных бирж (Mt.Gox, Bitfinex, Binance 2019) показали: именно горячие кошельки — основная цель атак. Холодный кошелёк, построенный правильно, физически невозможно взломать удалённо.

Принципы cold storage

Air-gapped система

Air gap — физическая изоляция: компьютер для подписи транзакций никогда не подключается к интернету. Даже в "выключенном" состоянии — WiFi и Bluetooth отключены или физически удалены.

Workflow подписи транзакции:

Online Server → создаёт unsigned tx → USB/QR → Air-gapped PC → подписывает → USB/QR → Online Server → broadcast

QR-коды предпочтительнее USB (USB может быть вектором атаки через BadUSB). Animated QR (BBQR формат) позволяет передавать большие данные через серию QR-кодов.

Аппаратные кошельки

Ledger и Trezor — consumer grade HSM. Подходят для warm wallet и для операторов с небольшими объёмами. Приватный ключ создаётся и хранится внутри устройства, никогда не экспортируется.

# Интеграция с Ledger через ledgerblue
from ledgerblue.comm import getDongle

def sign_eth_transaction_with_ledger(unsigned_tx: bytes, bip44_path: str) -> bytes:
    dongle = getDongle(debug=False)
    
    # BIP44 path: m/44'/60'/0'/0/0 для первого Ethereum адреса
    path_bytes = parse_bip44_path(bip44_path)
    
    # Отправляем транзакцию на устройство для подписи
    apdu = build_sign_apdu(path_bytes, unsigned_tx)
    result = dongle.exchange(apdu)
    
    # Извлекаем v, r, s из ответа
    v = result[0]
    r = result[1:33]
    s = result[33:65]
    
    return encode_signature(v, r, s)

Для enterprise — Thales Luna HSM, AWS CloudHSM, YubiHSM. Аппаратная защита с FIPS 140-2 сертификацией, поддержка multi-party computation (MPC).

Multi-Signature кошельки

Один человек с одним ключом — единая точка отказа. Multi-sig требует M из N подписей для транзакции.

Bitcoin P2SH Multisig

from bitcoin import script, transaction

def create_multisig_address(public_keys: list[bytes], m: int) -> tuple[str, bytes]:
    """
    Создаём M-of-N P2SH мультисиг адрес
    m: количество требуемых подписей
    public_keys: список публичных ключей (N штук)
    """
    # Редим-скрипт: OP_M <key1> <key2> ... <keyN> OP_N OP_CHECKMULTISIG
    redeem_script = script.multisig(m, public_keys)
    
    # P2SH адрес = HASH160(redeem_script)
    p2sh_address = script.p2sh_address(redeem_script)
    
    return p2sh_address, redeem_script

# Пример: 2-of-3 (2 из 3 ключей должны подписать)
# key1 — CEO (hardware wallet в офисе)
# key2 — CTO (hardware wallet дома)
# key3 — CFO (hardware wallet в банковской ячейке)
address, redeem_script = create_multisig_address([key1, key2, key3], m=2)

Ethereum Gnosis Safe

Gnosis Safe — стандарт de facto для Ethereum multisig. Smart contract wallet с поддержкой M-of-N, time locks, delegate calls.

import Safe, { EthersAdapter } from '@safe-global/protocol-kit';
import { ethers } from 'ethers';

async function createEnterpriseMultisig(
  owners: string[],  // адреса владельцев
  threshold: number  // M из N
): Promise<string> {
  const provider = new ethers.JsonRpcProvider(RPC_URL);
  const deployer = new ethers.Wallet(DEPLOYER_KEY, provider);
  
  const ethAdapter = new EthersAdapter({ ethers, signerOrProvider: deployer });
  
  const safeFactory = await SafeFactory.create({ ethAdapter });
  const safeAccountConfig = {
    owners,
    threshold,
  };
  
  const safe = await safeFactory.deploySafe({ safeAccountConfig });
  console.log('Safe deployed at:', await safe.getAddress());
  return safe.getAddress();
}

// Создание и сбор подписей для вывода
async function proposeWithdrawal(
  safeAddress: string,
  to: string,
  amount: bigint,
  signerKey: string
) {
  const safeSDK = await Safe.create({ ethAdapter, safeAddress });
  
  const safeTransactionData = {
    to,
    value: amount.toString(),
    data: '0x',
  };
  
  const safeTransaction = await safeSDK.createTransaction({ transactions: [safeTransactionData] });
  const signedTx = await safeSDK.signTransaction(safeTransaction);
  
  // Сохраняем в Safe Transaction Service для остальных подписантов
  await proposeToSafeService(safeAddress, signedTx);
}

Процедуры доступа к cold wallet

Документированный SOP (Standard Operating Procedure)

Каждый вывод из cold storage должен следовать задокументированной процедуре:

ПРОЦЕДУРА ВЫВОДА ИЗ COLD STORAGE

1. ИНИЦИИРОВАНИЕ (любой из 2 уполномоченных сотрудников)
   - Создать тикет с суммой, назначением, business justification
   - Получить одобрение от второго уполномоченного

2. ПОДГОТОВКА ТРАНЗАКЦИИ (CTO или уполномоченный технический сотрудник)
   - На онлайн-машине: создать unsigned transaction
   - Записать на USB (только данные, не исполняемые файлы) или распечатать QR

3. ПОДПИСАНИЕ (в присутствии 2 свидетелей)
   - В изолированной комнате, без телефонов и камер
   - Загрузить unsigned tx на air-gapped PC
   - Верифицировать адрес и сумму на дисплее hardware wallet
   - Подписать
   - Передать signed tx на онлайн-машину через USB/QR

4. BROADCAST (после финальной верификации)
   - Ещё раз проверить адрес получателя
   - Broadcast транзакции
   - Записать TxHash в журнал аудита

5. ПОДТВЕРЖДЕНИЕ
   - Ждём N подтверждений блока
   - Обновить внутренний баланс
   - Закрыть тикет с TxHash

Каждый шаг логируется с timestamp и подписями участников.

Time locks

Для дополнительной защиты — time lock на крупные переводы. Gnosis Safe поддерживает через TimelockController:

// Любой вывод > 100 ETH исполняется только через 48 часов после proposing
uint256 public constant MIN_DELAY = 48 hours;
uint256 public constant MAX_WITHDRAWAL = 100 ether;

function scheduleWithdrawal(address to, uint256 amount) external onlyOwner {
    require(amount > MAX_WITHDRAWAL ? block.timestamp + MIN_DELAY : block.timestamp, 
            "Immediate for small amounts");
    // schedule through TimelockController
}

Если ключи скомпрометированы — у команды есть 48 часов заметить подозрительную транзакцию и отменить её.

Ключевая схема хранения

3-2-1 правило: 3 копии ключа, 2 разных носителя, 1 оффсайт.

Для биржи:

  • 2-of-3 Gnosis Safe для Ethereum резервов
  • 2-of-3 Bitcoin multisig (P2WSH) для Bitcoin резервов
  • Ключи у: CEO (HSM в офисе), CTO (HSM дома), независимый кастодиан (HSM в банковской ячейке)
  • Seed phrases на metal backup (Cryptosteel, Bilodeau) — огнеупорные и водонепроницаемые
  • Зашифрованные цифровые копии в разных юрисдикциях (AWS S3 с SSE-KMS + EncryptedLocal)
Структура хранения:
  Hot Wallet:    5–10% резервов (автоматические выводы)
  Warm Wallet:   15–20% резервов (2-of-3 multisig, пополняет hot wallet)
  Cold Storage:  70–80% резервов (air-gapped, ручной вывод по SOP)

Аудит и верификация резервов

Proof of Reserves — публичное доказательство, что биржа действительно владеет средствами, которые заявляет:

def generate_proof_of_reserves(exchange_addresses: list[str], 
                                 user_balances_merkle: bytes) -> ProofOfReserves:
    """
    Merkle tree из балансов пользователей.
    Exchange публикует:
    1. Merkle root всех балансов
    2. Балансы на блокчейне (верифицируемо публично)
    3. Каждый пользователь может верифицировать своё включение в Merkle tree
    """
    total_user_balances = sum_all_user_balances()
    merkle_root = build_merkle_tree(user_balances_merkle)
    chain_balances = get_onchain_balances(exchange_addresses)
    
    assert chain_balances >= total_user_balances, "Exchange is insolvent!"
    
    return ProofOfReserves(
        merkle_root=merkle_root,
        total_liabilities=total_user_balances,
        total_assets=chain_balances,
        timestamp=datetime.utcnow(),
        auditor_signature=sign_with_auditor_key(merkle_root),
    )

Сроки и стоимость

Компонент Срок
Gnosis Safe multi-sig setup 1 неделя
Bitcoin P2WSH multisig 2–3 недели
SOP документация + процедуры 1–2 недели
Air-gapped подписания workflow 2–3 недели
Proof of Reserves implementation 2–3 недели
Security audit 2–4 недели

Полная cold storage система с документированными процедурами и Proof of Reserves: 2–3 месяца.