跟着一笔票的生命周期走一遍。
chain-service 监听链上事件、wallet-service 记账、game-service 编排开奖、
sign-service 独占私钥负责签名提现。
开奖时根据 one.draw.mode 进入 FULL_CHAIN 或 VRF_ONLY 分支。
Walk through a single round's life cycle: deposit confirms on-chain, ticket buy debits the ledger,
round fills and triggers draw, prize gets paid on-chain via the isolated sign-service.
用户从外部钱包转入用户专属充值地址;chain-service 监听到 tx → 等待 N 个确认 →
wallet-service 入账 → Bot 推送回执。地址由 user-service 在用户首次绑定钱包时分配并持久化。
GET /api/wallet/deposit-address?chain=BSC。
user-service 返回该用户在指定链的专属充值地址(首次访问时即时分配并入库)。
ChainAdapter 监听用户充值地址命中的 Transfer 事件。
两个 ChainAdapter 实现(BSC · TRON)封装自己的 RPC 调用细节,对上层透明。
N 个区块确认(按链分配置,BSC ≈ 15、TRON ≈ 19)后才推进。
executionChain + txHash + logIndex。
余额够 → 锁号 → 扣账本 → 写订单。活动满号 → 触发 DrawEngine(运行时按 one.draw.mode 决定走哪个分支)。
中奖号码定下来 → wallet-service 派奖 → Bot 推送中奖。
ticket.bought 事件到 Kafka 供下游消费(统计、推送)。
DrawCompleted(winnerNumber, prize) 事件。
fulfillRandomWords(),
发出 RandomnessDelivered(requestId, randomness) 事件。
BACKEND 模式(链下 RNG,凭证仍写区块浏览器可查的 anchor tx)。
所有切换都有审计日志,需要运维 + 安全二人复核。
sign-service 是唯一持有热钱包私钥的服务,业务服务永远不直接接触私钥。
所有提现 tx 都通过 mTLS 内部 API 让 sign-service 签名后广播。Phase 2 切换到多签时这条路径不变,只是签名变成 m-of-n。
本节定位 工程细节版 —— 完整 7 步带参数、nonce、限额、异步事件。 想看老板向的视觉动画版?看 prototype-mechanics.html 04 出款原理 →
0xUSER 转 100 USDT 的 tx」。
私钥永远不离开 sign-service 子网。