Настройка приёма ставок в Bitcoin для казино
Bitcoin в iGaming — это не просто ещё один способ оплаты. Здесь специфика: высокочастотные транзакции малого номинала, требование к мгновенному зачислению для ставок, волатильность BTC против фиатного баланса казино, и жёсткие требования к provably fair. Стандартные on-chain транзакции с 10-минутным ожиданием подтверждения для ставок не работают — нужна Lightning Network или кастодиальная модель с внутренними балансами.
Архитектурные подходы: три модели
Модель 1: Кастодиальный кошелёк с внутренними балансами
Самая распространённая в индустрии. Bitcoin принимается on-chain, конвертируется во внутренние кредиты, ставки проходят через внутреннюю систему:
BTC on-chain deposit → Internal credit balance → Bets (no blockchain) → Withdraw to BTC
Плюсы: мгновенные ставки, нет комиссий per-bet, простой rollback при ошибке. Минусы: казино хранит ключи пользователей, custody risk, требуется доверие.
Модель 2: Lightning Network для ставок
Ставки через LN-каналы — мгновенно и без кастодии крупных сумм. Архитектура описана ниже.
Модель 3: Гибридная (рекомендуемая)
Депозит/вывод — on-chain BTC (для крупных сумм) + Lightning (для мелких). Игровой баланс — кастодиальный. Это баланс между UX, безопасностью и операционной сложностью.
On-chain интеграция: BTCPay Server
Для production — не изобретать велосипед с биткоин-нодой напрямую. BTCPay Server — open-source, self-hosted, проверенное решение:
# Docker деплой BTCPay Server
git clone https://github.com/btcpayserver/btcpayserver-docker
cd btcpayserver-docker
export BTCPAY_HOST="pay.yourcasino.com"
export NBITCOIN_NETWORK="mainnet"
export BTCPAYGEN_CRYPTO1="btc"
export BTCPAYGEN_LIGHTNING="lnd" # Lightning встроен
. btcpay-setup.sh -i
API для создания инвойса депозита:
import httpx
BTCPAY_URL = "https://pay.yourcasino.com"
BTCPAY_API_KEY = "your_api_key"
STORE_ID = "your_store_id"
async def create_deposit_invoice(user_id: str, amount_usd: float) -> dict:
async with httpx.AsyncClient() as client:
response = await client.post(
f"{BTCPAY_URL}/api/v1/stores/{STORE_ID}/invoices",
headers={"Authorization": f"token {BTCPAY_API_KEY}"},
json={
"amount": amount_usd,
"currency": "USD",
"metadata": {"userId": user_id},
"checkout": {
"expirationMinutes": 60,
"redirectURL": f"https://casino.com/deposit/success?user={user_id}"
}
}
)
invoice = response.json()
return {
"invoice_id": invoice["id"],
"payment_url": invoice["checkoutLink"],
"btc_address": invoice["addresses"]["BTC"],
"btc_amount": invoice["cryptoInfo"][0]["due"]
}
Webhook от BTCPay
@app.post("/btcpay/webhook")
async def btcpay_webhook(request: Request):
body = await request.body()
signature = request.headers.get("BTCPay-Sig")
# Верификация HMAC-SHA256
expected = "sha256=" + hmac.new(
WEBHOOK_SECRET.encode(), body, hashlib.sha256
).hexdigest()
if not hmac.compare_digest(expected, signature):
raise HTTPException(status_code=401)
event = json.loads(body)
if event["type"] == "InvoiceSettled":
invoice_id = event["invoiceId"]
invoice = await get_invoice_details(invoice_id)
user_id = invoice["metadata"]["userId"]
usd_amount = float(invoice["amount"])
await credit_user_balance(user_id, usd_amount)
await notify_user_deposit_confirmed(user_id, usd_amount)
Работа с волатильностью
BTC/USD может двигаться на 5–10% за несколько часов. Для казино с фиатной бухгалтерией нужна стратегия:
Опция 1: Немедленная конвертация — полученный BTC конвертируется в USDT/USDC через биржевой API (Binance, Kraken) в момент подтверждения. Баланс игрока в USD, курсовой риск минимален.
async def convert_btc_to_usd(btc_amount: float) -> float:
binance = ccxt.binance({'apiKey': KEY, 'secret': SECRET})
order = await binance.create_order(
symbol='BTC/USDT',
type='market',
side='sell',
amount=btc_amount
)
return float(order['cost']) # USD получено
Опция 2: Удержание BTC — казино принимает риск волатильности. Оправдано только если владелец целенаправленно аккумулирует BTC.
Опция 3: BTC-номинированный баланс — ставки в сатоши, выплаты в сатоши. Игрок несёт курсовой риск. Популярно в Bitcoin-ориентированных казино.
Lightning Network для мгновенных платежей
Для ставок с маленьким номиналом (0.0001–0.01 BTC) — Lightning позволяет делать их мгновенно и без on-chain комиссии:
# LND gRPC клиент для создания invoice
import grpc, codecs
from lnd_grpc_pb2 import Invoice
stub = create_lnd_stub(LND_HOST, MACAROON, TLS_CERT)
def create_lightning_invoice(amount_sats: int, memo: str) -> dict:
invoice = Invoice(
value=amount_sats,
memo=memo,
expiry=3600 # 1 час
)
response = stub.AddInvoice(invoice)
return {
"payment_hash": codecs.encode(response.r_hash, 'hex').decode(),
"payment_request": response.payment_request # BOLT11 invoice
}
def check_invoice_paid(payment_hash: str) -> bool:
lookup = stub.LookupInvoice(PaymentHash(r_hash=codecs.decode(payment_hash, 'hex')))
return lookup.state == Invoice.SETTLED
Управление ликвидностью Lightning — отдельная операционная задача: каналы нужно держать открытыми, инбаунд ликвидность обеспечивать через loop-out или LSP.
Провабли фэйр (Provably Fair)
Честные казино публикуют алгоритм верификации результата ставки. Стандартная схема:
import hashlib, hmac
def generate_game_result(server_seed: str, client_seed: str, nonce: int) -> float:
"""Возвращает число [0, 1) для определения результата"""
message = f"{client_seed}-{nonce}"
h = hmac.new(server_seed.encode(), message.encode(), hashlib.sha256).hexdigest()
# Первые 8 символов hex → float
return int(h[:8], 16) / 0xFFFFFFFF
# Игрок может верифицировать: сервер публикует server_seed_hash до игры,
# после игры раскрывает server_seed — игрок проверяет совпадение hash
Лимиты и AML
Основные регуляторные требования для криптоказино:
- Порог идентификации: обычно 2000 EUR/сутки требует KYC
- Хранить историю транзакций минимум 5 лет
- Скрининг адресов на санкции (OFAC список) перед зачислением
- Подозрительная активность (структурирование, быстрые депозит/вывод) — SAR репорт
Настройка полной BTC-интеграции с BTCPay Server, webhook обработчиком, конвертацией в USD и Lightning поддержкой: 2–4 недели включая тестирование на testnet.







