Разработка холодного кошелька биржи
Холодное хранение — это хранение приватных ключей в полностью изолированной от интернета среде. 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 месяца.







