System Design শেখো
সব কেস স্টাডি

Crypto Wallet Service ডিজাইন

15 মিনিটadvanced
এক নজরে
  • একটা crypto wallet আসলে কয়েন রাখে না — রাখে private key; কয়েন সবসময় blockchain-এ থাকে, key দিয়ে শুধু তার নিয়ন্ত্রণ প্রমাণ করা হয়।
  • Key management-ই মূল চ্যালেঞ্জ — hot wallet (online, দ্রুত) vs cold wallet (offline, নিরাপদ), HSM, multisig আর seed phrase backup।
  • Balance ও transaction history blockchain node থেকে indexer দিয়ে track করা হয়, আর transaction পাঠানো মানে private key দিয়ে sign করে network-এ broadcast করা।

আজকের প্রশ্ন — "একটা crypto wallet service ডিজাইন করো।" শুরুতেই একটা ভুল ধারণা সরিয়ে ফেলি: wallet আসলে কোনো কয়েন রাখে না। কয়েন সবসময় blockchain-এ থাকে। Wallet রাখে private key — এমন একটা গোপন সংখ্যা যা দিয়ে তুমি প্রমাণ করো ওই কয়েন নাড়ানোর অধিকার তোমার আছে।

সহজ উদাহরণ

ভাবো একটা ব্যাংক লকার রুম, যেখানে হাজার হাজার লকার সবার সামনে খোলা চোখে দেখা যায় (এটাই blockchain — public ledger)। প্রতিটা লকারে টাকা আছে, সবাই দেখতে পায় কোন লকারে কত আছে। কিন্তু একটা নির্দিষ্ট লকার খোলার চাবি (private key) শুধু একজনের কাছে। Wallet হলো সেই চাবির ব্যবস্থাপক — চাবিটা রাখা, হারিয়ে গেলে duplicate বানানোর উপায় (seed), আর চাবি দিয়ে লকার খুলে টাকা নাড়ানো (signing)।

১. সমস্যা বোঝা (Requirements)

দুই ধরনের wallet হয়: custodial (key আমরা রাখি, যেমন exchange) আর non-custodial (key user-এর হাতে)। আমরা একটা hybrid wallet service ধরব যা key management নিরাপদে সামলায়।

Functional requirements:

  • নতুন wallet তৈরি — key pair generate, address তৈরি।
  • Balance দেখানো — প্রতিটা asset-এর current balance।
  • Transaction history দেখানো।
  • কয়েন পাঠানো (send) — transaction তৈরি, sign, broadcast।
  • কয়েন গ্রহণ (receive) — address দেওয়া, incoming detect করা।
  • Seed phrase backup ও recovery
  • একাধিক blockchain support (BTC, ETH, ...)।

Non-functional requirements:

  • Security সবার আগে: private key চুরি = fund চুরি। এটাই system-এর প্রাণ।
  • Correctness: balance ভুল দেখানো যাবে না।
  • Availability: wallet ২৪x৭ চালু।
  • Auditability: প্রতিটা signing operation logged।

২. স্কেল আন্দাজ (Estimation)

ধরি:
- মোট user           = 20 মিলিয়ন
- DAU                = 2 মিলিয়ন
- প্রতি user প্রতিদিন balance check = 10 বার
  -> read = 2M * 10 = 20M reads/day ~ 230 reads/sec (avg)
  -> peak ~ 5x = ~1,200 reads/sec  (cache দিয়ে সামলানো)

- প্রতি user প্রতিদিন send = 0.5
  -> 1M signing ops/day ~ 12 ops/sec avg, peak ~ 60/sec
  -> প্রতিটা signing HSM-এ -> HSM throughput বটলনেক হতে পারে

Key/wallet storage:
- 20M user * (যদি ~5 chain * key material ~কয়েক KB encrypted)
  -> কয়েক শত GB encrypted key blob (KMS/HSM-backed)

Blockchain node:
- প্রতি chain full/archive node, balance ও tx index করতে
- index storage: chain-ভেদে শত GB থেকে কয়েক TB

মূল শিক্ষা: read (balance) heavy কিন্তু cache দিয়ে সহজ; signing কম volume কিন্তু সবচেয়ে স্পর্শকাতর ও বটলনেক।

৩. API ডিজাইন

POST   /v1/wallets                 # নতুন wallet (key pair) তৈরি
GET    /v1/wallets/{id}/address?asset=ETH   # receive address
GET    /v1/wallets/{id}/balance?asset=ETH   # current balance
GET    /v1/wallets/{id}/transactions        # history

POST   /v1/transactions            # send: {asset, to, amount} -> sign + broadcast
GET    /v1/transactions/{txid}     # status (pending/confirmed)

POST   /v1/wallets/{id}/backup     # encrypted seed backup blob
POST   /v1/wallets/recover         # seed phrase দিয়ে recover

লক্ষ্য করো: API কখনো raw private key বা plaintext seed return করে না। সর্বোচ্চ encrypted blob দেয়, যা শুধু user-এর passphrase দিয়ে খোলে।

৪. ডেটা মডেল

Dataকোথায়কেন
Balance, ownershipOn-chain (blockchain)Source of truth সবসময় chain
Transaction recordOn-chainআসল transfer chain-এ
Private key (encrypted)HSM / KMSকখনো plaintext DB-তে নয়
Address ↔ user mappingOff-chain DBদ্রুত lookup, indexing
Cached balanceCache (Redis)দ্রুত read, chain থেকে refresh

কয়েকটা মূল table:

Tableমূল কলাম
walletswallet_id, user_id, created_at
addressesaddress, wallet_id, asset, derivation_path
key_materialwallet_id, encrypted_key_ref (HSM/KMS handle), algo
tx_cachetxid, address, asset, amount, direction, confirmations, status
balances_cachewallet_id, asset, balance, last_synced_block

গুরুত্বপূর্ণ: balances_cache কখনো source of truth নয়। আসল balance সবসময় blockchain। Cache শুধু দ্রুত দেখানোর জন্য, indexer দিয়ে নিয়মিত sync হয়।

৫. হাই-লেভেল ডিজাইন

মূল component:

  • API Gateway / Auth: auth, 2FA, rate limit।
  • Wallet Service: wallet তৈরি, address derive, request orchestrate।
  • Key Management / Signing Service: HSM/KMS-এর সাথে কথা বলে। private key কখনো এর বাইরে যায় না — transaction ভেতরে গিয়ে sign হয়ে signed bytes ফেরত আসে।
  • Blockchain Nodes: নিজস্ব full node — balance query, tx broadcast।
  • Indexer: নতুন block scan করে watched address-এর tx ও balance update করে।
  • Cache (Redis): balance ও recent tx।
  • DB (PostgreSQL): wallet, address, encrypted key reference।

Send flow:

  1. User send request দেয় (asset, to, amount)।
  2. Wallet Service balance ও input validate করে।
  3. একটা unsigned transaction তৈরি হয় (proper nonce/UTXO, gas/fee)।
  4. Unsigned tx Signing Service-এ যায় → HSM private key দিয়ে sign করে।
  5. Signed tx blockchain node দিয়ে network-এ broadcast।
  6. Txid নিয়ে status track শুরু, confirmation পেলে confirmed।

Receive flow: user-কে address দেওয়া হয় → Indexer ওই address-এ incoming tx detect করে → confirmation পেলে cache balance update + notification।

৬. গভীরে (Deep Dive)

৬.১ Key Management ও Public/Private Key

মূল ভিত্তি asymmetric cryptography:

  • Private key: গোপন। এটা দিয়ে transaction sign করা হয়। যার কাছে private key, fund তার।
  • Public key / address: সবার সাথে শেয়ার করা যায়। এতে fund পাঠানো হয়, আর signature যাচাই করা হয়।

আধুনিক wallet HD wallet (Hierarchical Deterministic, BIP-32/39/44) — একটা seed থেকে গাছের মতো অসংখ্য key derive হয় (m/44'/60'/0'/0/0 এর মতো path)। মানে একটা seed backup করলেই সব key recover হয়।

Custodial wallet-এ private key কখনো application server-এ plaintext-এ থাকে না:

  • HSM (Hardware Security Module): একটা tamper-resistant hardware যেখানে key generate ও signing হয়, key কখনো বের হয় না।
  • KMS / envelope encryption: key encrypted অবস্থায় DB-তে, master key HSM-এ।
সাবধান

Seed phrase (১২/২৪ শব্দ) = তোমার সব fund-এর master key। এটা কখনো screenshot, email, cloud notes বা chat-এ রাখবে না। Self-custody wallet-এ seed হারালে কোনো recovery নেই — কোনো "forgot password" নেই, কোনো support team fund ফেরত দিতে পারবে না। আবার কেউ seed পেলে নিমিষে সব নিয়ে যাবে। তাই offline, একাধিক জায়গায় (যেমন কাগজে/metal plate-এ) backup রাখাই নিয়ম।

৬.২ Hot vs Cold Wallet ও Multisig

  • Hot wallet: online, signing দ্রুত। অল্প fund। ঝুঁকি বেশি, তাই কম রাখা হয়।
  • Cold wallet: offline/air-gapped, key কখনো internet দেখে না। বেশিরভাগ fund। signing করতে hardware device বা manual process লাগে।
  • Multisig: একটা address-এ একাধিক key, কয়েকটার signature লাগে (যেমন 2-of-3)। একটা key চুরি হলেও attacker একা fund নাড়াতে পারবে না। বড় custody-তে multisig + geographic distribution standard।
MPC একটা আধুনিক বিকল্প

আজকাল অনেক wallet MPC (Multi-Party Computation) ব্যবহার করে — private key কখনো পুরোটা একসাথে তৈরিই হয় না; কয়েকটা party যৌথভাবে sign করে, কোনো single point of failure নেই।

৬.৩ Balance Tracking via Blockchain Nodes

Balance কোথায় store করব না — chain-ই source of truth। দুই মডেল:

  • UTXO (Bitcoin): balance = ওই address-এর সব unspent output-এর যোগফল।
  • Account (Ethereum): প্রতিটা account-এর একটা state balance।

আমাদের Indexer প্রতিটা নতুন block scan করে, watched address-এর সাথে মেলায়, এবং balances_cache + tx_cache update করে। User balance চাইলে cache থেকে দ্রুত আসে, কিন্তু পেছনে chain-এর সাথে নিয়মিত reconcile হয়। Node lag বা reorg হলে cache সংশোধন করতে হয় — তাই last_synced_block track করা জরুরি।

৭. বটলনেক ও স্কেলিং

  • Signing throughput: সব signing HSM-এ হয়, HSM-এর ops/sec সীমিত। Scale করতে একাধিক HSM, request queue, আর batching। Hot path বলে এখানে careful capacity planning দরকার।
  • Blockchain node load ও lag: balance/tx নির্ভর করে node-এর ওপর। একাধিক node, read replica node, আর archive node দিয়ে scale। Node sync পিছিয়ে গেলে balance stale দেখাবে।
  • Indexing: প্রতি chain প্রতি block scan ভারী। Parallel indexer, address bloom filter, আর reorg-handling logic লাগে।
  • Key security vs availability tradeoff: সব fund cold-এ রাখলে নিরাপদ কিন্তু send ধীর; hot-এ রাখলে দ্রুত কিন্তু ঝুঁকি। তাই hot/cold ratio, alert, আর auto-rebalancing।
  • Cache consistency: balance cache কখনো ভুল দেখালে user আস্থা হারায়। তাই confirmation-aware update আর periodic full reconcile।

৮. সারসংক্ষেপ

একটা crypto wallet service-এর আসল কাজ কয়েন রাখা নয় — private key নিরাপদে রাখা ও দিয়ে নিরাপদে sign করা। ভিত্তি হলো public/private key cryptography, HD seed, আর কঠোর key management (HSM, KMS, multisig/MPC)। Balance ও history blockchain node + indexer থেকে আসে, কখনো cache-কে source of truth ধরা যায় না। Send = unsigned tx বানানো → HSM-এ sign → broadcast।

ইন্টারভিউয়ার কী খোঁজেন

ইন্টারভিউয়ার সবার আগে দেখেন তুমি বোঝো কিনা যে wallet কয়েন নয়, key রাখে — এই একটা পার্থক্য না বললে design দুর্বল মনে হয়। তারপর তারা চান key management depth: private key কখনো plaintext-এ নয়, HSM/KMS, hot/cold split, multisig/MPC, আর seed backup/recovery-র tradeoff। সাথে balance-এর source of truth যে chain (cache নয়) এটা স্পষ্ট করলে, এবং signing-কে বটলনেক হিসেবে চিনলে তোমার সিনিয়র-লেভেল চিন্তা ফুটে ওঠে।

মিনি কুইজ

1. একটা crypto wallet আসলে কী 'রাখে'?

2. Seed phrase (mnemonic) হারিয়ে গেলে কী হয়?

3. Transaction 'sign' করার মানে কী?