← BACK · 返回原型集
MECHANICS · LIVE 10 / MECHANICS BSC / ETH / TRON
CHAIN MECHANICS · 链上原理动画

4 个核心原理,看动画就懂 DRAW · SWEEP · HOT/COLD WALLET · WITHDRAW

链上随机数怎么变成中奖号 · 用户钱怎么从一堆地址归集到热钱包 · 冷热钱包怎么分层防风险 · 用户的提现怎么走 sign-service 出去。 面向老板 / 投资人 / 新员工,技术细节放在折叠区,主线看动画。
Four key mechanics explained with animations: how the draw works, how funds get swept, hot/cold tiering, and how withdrawals flow through the isolated sign-service.

SERVICES · 后端服务对照 sign-service 签名服务 wallet-service 钱包账户 chain-service 链上交互 game-service 抽奖(开奖) admin-service 运营后台 message-service 站内信 / TG 推送
01 · DRAW

开奖原理BLOCK HASH → RANDOMNESS → WINNER

平台不能决定谁中奖。中奖号由链上随机数算出来 —— 区块产生时谁也无法预测, 产生后所有人都能看到,任何人都能用同样的算法独立复算结果。
本节演示 VRF_ONLY 模式:Chainlink VRF 在 BSC 上提供随机数,game-service 链下取模算中奖号。

本节定位 30 秒搞懂"为什么链上开奖是公平的"。三种引擎的取舍 / RNG 风险 / 合约可升级与否等深度技术决策,见 三种开奖引擎怎么选 →

▸ BSC ON-CHAIN RANDOMNESS
BLOCK 49,128,901
0x9b2c8af4...
...e7c1d8a2bf
→ randomness
▸ TAKE MOD
randomness
mod 1024
= 1024
▸ WINNER NUMBER
1024
中奖号码 / Winning ticket
关键:randomness 由 Chainlink VRF 在 BSC 上生成,平台拿到时已经在链上了; 取模运算公开(任何号码池大小 N,winner = randomness mod N),任何人都可以在区块浏览器查到 randomness 后自行验证。 平台无法干预、无法回滚、无法作弊。
▸ 完整调用链 / END-TO-END VRF CALL

用户不需要钱包、不连链;服务端怎么真的拿到一个随机数

USER · 用户侧
  • 不需要装 MetaMask / TronLink 等任何钱包。
  • 不需要连接钱包、签名、付 gas。
  • 只在 TG Mini App 里点"购票",号码加进活动;开奖后直接看中奖结果。
  • 用户钱包私钥从未参与开奖;中奖号生成与"用户钱包是否在线"完全无关。
SYSTEM · 平台侧
  • game-service:开奖调度,决定何时触发,何时取模。
  • chain-service:持有 BSC RPC 长连接(HTTPS / WebSocket),扫块、发交易、监听事件。
  • sign-service:内部隔离子网,唯一持有平台私钥;调一次发出 VRF 请求的合约调用 tx,签名后交回 chain-service 广播。
  • 平台只需要 一个合约调用账户和一点 BNB 作 gas,整个生命周期就够了,不是每次开奖都付钱。
5 步拿到随机数 / 5 STEPS TO GET RANDOMNESS
  1. ① 触发请求

    game-service 在售罄(或截止时间)那刻,发一条内部 Kafka 消息 game.draw.requested,draw-engine consumer 拿到后委托 chain-service 调合约。

  2. ② 链上 requestRandomWords

    chain-service 构造一笔 tx 调 TreasureParadise.requestRandomWords(),tx 经 sign-service 签名后发到 BSC。合约内部转调 IVRFCoordinatorV2Plus.requestRandomWords(),返回一个 uint256 requestId。这个 tx 写到链上立刻可见。

  3. ③ Chainlink 链下计算 + 链上回调

    Chainlink 节点网络(多节点联合,单点不能作恶)在链下用 VRF 算法生成 256-bit 随机数与证明,再发一笔 fulfillment tx 调合约的 fulfillRandomWords(requestId, randomWords) 回调。这一步通常 1–3 分钟。

  4. ④ 合约取模 + 广播事件

    合约在回调里 winningIndex = randomWords[0] % ticketAll 算出获奖下标,emit WinnerDecided(round, winningIndex, requestId, randomness) 事件并把结果固化到合约存储。randomness 与下标都明文写在事件里

  5. ⑤ 平台 + 用户各自核对

    chain-service 监听到 WinnerDecided → 反查中奖票的拥有者 → game-service 派奖 → 用户在 Mini App 收到通知。任何用户也可以在 BscScan 找这条 fulfillment tx,看 fulfillRandomWords() 调用,自己 mod 一遍验证。

需要钱包?
用户:不需要。平台:需要 1 个合约调用账户 + 一点 BNB(由 sign-service 持有)。
需要连接链?
用户:不需要。chain-service 与 BSC 节点保持长连接(自建或 QuickNode / Infura),用户全程不接触 RPC。
怎么拿到随机数?
合约 → Chainlink VRF v2.5 → fulfillRandomWords 回调 → emit 事件 → chain-service 监听 → game-service 取模算中奖号。
🎲
随机数从哪来

Chainlink VRF 由全球多个独立节点合作生成,单一节点串通其他节点的成本极高。

🔍
怎么验证

tx hash 公开,进 BscScan 看 fulfillRandomWords() 事件,randomness 一目了然。

🚫
平台能不能改

不能。开奖凭证(tx hash)一旦上链就不可篡改;平台只能消费这个数字。

三种引擎对比 DRAW MODES

  • FULL_CHAIN:抽奖逻辑全部写进 Solidity 合约,最强信任,但 gas 贵。
  • VRF_ONLY(本演示):链上 VRF 提供随机数,链下取模。折中:高信任 + gas 友好。
  • BACKEND:完全链下,留作降级 / 合规兜底。凭证仍写一条 anchor tx 上链。
  • 切换走 Nacos one.draw.mode详见 draw-modes-explainer →

TRON 怎么办 TRON CAVEAT

  • Chainlink VRF 不支持 TRON
  • TRON 侧 VRF_ONLY 需要替代 RNG(Pyth、TRON 节点 DRAND 等),v1.0 待评估
  • 过渡方案:TRON 侧默认走 FULL_CHAINBACKEND,BSC 侧主推 VRF_ONLY
  • environment × executionChain 正交配置实现。
02 · SWEEP

钱包归集USER ADDRESSES → HOT WALLET

每个用户在每条链上有独立的充值地址,方便系统识别"这笔钱是谁的"。 但散落在一堆地址里的 USDT 没法直接出款。需要把它们定期归集到统一的热钱包。 归集会烧一点 gas,但换来资金集中管理 + 出款效率。

👤
0xa1...8e
12.5
👤
0xb2...4f
8.3
👤
0xc3...91
25.0
👤
0xd4...7a
5.6
👤
0xe5...2c
40.2
👤
0xf6...d3
15.8
👤
TRX...x1
7.2
👤
TRX...m5
33.5
👤
TRX...k9
9.0
👤
TRX...p4
18.4
👤
TRX...n7
22.1
👤
TRX...b2
11.7
▸ HOT WALLET · 热钱包
平台主热钱包
209.3 USDT
↑ 累计归集 · sign-service 控制
动画:12 个用户地址(6 个 BSC + 6 个 TRON)的余额像金币一样流向中间的热钱包。 实际中归集是定时任务 + 阈值触发,不是实时流动 —— 但本质就是这个方向。

触发条件 WHEN TO SWEEP

  • 定时:每日凌晨低峰扫描所有用户地址。
  • 阈值:单个地址 ≥ $50 USDT 立即归集(不等定时)。
  • 聚合:单链一次性多个地址打包成一个 batch tx,省 gas。
  • 跳过:余额 < $5(gas 不划算)的地址等积累。

背后的服务 SERVICES INVOLVED

  • chain-service:扫地址余额、构造 batch tx。
  • sign-service:签名(用户地址的私钥也归 sign-service)。
  • wallet-service:归集记账(账本不变 —— 用户余额不动,是平台内部的物理调度)。
  • admin-service:运维监控归集成功率、gas 成本、异常地址。
03 · HOT / COLD

冷热钱包分层TIER-BASED TREASURY MANAGEMENT

资金不能都放在同一个钱包里 —— 如果热钱包被攻破,损失就是全部资金。 分层做法:热钱包只放维持日常出款的最小余额;超出部分推到冷钱包长期储备。 热钱包余额低于阈值时,从冷钱包回填。冷钱包是离线签名,攻击面极小。

用户充值地址
USER ADDRESSES · MANY · SMALL BAL
~$200 12 active addresses
SWEEP · 归集
热钱包 · Hot Wallet
FOR DAILY PAYOUTS · ONLINE
~$10,000 target balance
SURPLUS PUSH · 推到冷钱包
冷钱包 · Cold Wallet
LONG-TERM TREASURY · OFFLINE
~$100,000 offline · multisig
规则 · RULES 热钱包目标余额 $10k。 ↑ 余额超过 $15k → 推 $5k 到冷钱包; ↓ 余额低于 $5k → 触发运维告警,从冷钱包人工回填。 冷钱包不联网,回填需要多人多签离线签名。
动画:3 层柱状余额条 —— 用户地址(黄)→ 热钱包(红,2px 边框示意"业务前线")→ 冷钱包(冰蓝,离线储备)。 虚线箭头标示资金流向。

热钱包 HOT WALLET · ONLINE

  • 用途:日常出款(中奖派发、用户提现)的"工作账户"。
  • 余额:维持目标余额 $10k,覆盖 ~24 小时高峰出款。
  • 签名:sign-service 持有私钥,独立 subnet + KMS 加密。
  • 风险:暴露面有限 —— 最坏损失约 $10–15k
  • Phase 2:单签 → m-of-n 多签,降低单点风险。

冷钱包 COLD WALLET · OFFLINE

  • 用途:长期资金储备(用户充值净值的大头)。
  • 签名:硬件钱包 + 多签 + 物理隔离 —— 完全离线
  • 使用频率:低(一周几次甚至更少),按需向热钱包回填。
  • 风险:远程攻击面接近零;线下风险(社工 / 物理)按行业最佳实践管控。
  • 访问:运维 + 财务联合人工流程,全程审计留痕。
04 · WITHDRAW

出款原理WITHDRAW VIA ISOLATED SIGN-SERVICE

用户点提现到链上完成,6 步 —— 但只有 第 4 步真正接触私钥。 私钥永远只在 sign-service 子网里,业务服务永远不持有 —— 这是整个系统最重要的安全边界。

本节定位 视觉直觉版 —— 解释为什么需要 sign-service。每一步的参数 / nonce / idempotency / 失败回滚等工程细节,见 提现 + 签名隔离时序 →

USER
1
提现申请
用户在 TG Mini App 点"提现 50 USDT 到 BSC 地址 0xUSER..."
PAY-SVC
PAY-SVC
2
校验 + 锁余额
余额够吗?日限额够吗?地址在黑名单?通过 → 标 PENDING_OUT。 v1.0 默认全部走运营审核(不分金额;小额自动放行为后续可配置开关)。
审核 / 放行
PAY-SVC
3
请求签名
构造 raw tx(from=hot wallet, to=0xUSER, amount=50 USDT),通过 mTLS + IP 白名单 调 sign-service。
🔒→
SIGN-SVC
SIGN-SVC
4
签名 · 唯一接触私钥的环节
内部检查:调用方在白名单?nonce 防重?单笔限额?日累计限额? 通过 → 从 AWS KMS 读 key 完成签名 → 返回 raw signed tx。 私钥永远不离开 sign-service 子网
←🔒
PAY-SVC
PAY-SVC
5
广播到链上
chain-service 用 ChainAdapter 把 signed tx 发到 BSC(或 TRON),拿到 txHash。
BSC / TRON
CHAIN-SVC
6
确认到账
监听 N 个区块确认 → 推 Kafka withdraw.confirmed → wallet-service 标 DONE → message-service 推 TG Bot 通知 "已到账 + tx hash"
USER
动画:6 行依次淡入,标 🔒 的两条(第 3、4 步)走 sign-service,红色高亮 —— 这两条是唯一需要私钥的环节

为什么 sign-service 单独成一个服务、单独一个 subnet

如果业务服务(wallet-service / game-service)直接持有私钥,任何 RCE 漏洞 / SQL 注入 / 容器逃逸都可能直接提走资金。 把私钥隔离到 sign-service,业务面的攻击只能调用有限的内部签名 API,签名前还有白名单 / nonce / 限额多重校验。 即使业务面被打穿,资金仍然安全
这是整个系统的最关键安全边界,所有动手前都要 review 是否动了这条线。

限额 + 防重 RATE LIMITS

  • 单笔上限$1,000 USDT,超出走运营审核。
  • 日累计$10,000 USDT / 用户,避免账户被盗 + 一次性掏空。
  • Nonce 防重:每次签名带递增 nonce,重放攻击直接拒绝。
  • IP 白名单:sign-service 只接受 wallet-service / game-service 等指定 service IP。

失败处理 FAILURE MODES

  • gas 不够:chain-service 重试 + 切换到备用 RPC + 调整 gas price。
  • nonce 冲突:sign-service 内部 nonce 管理 + 重新签名重发。
  • 区块确认超时:保留 PENDING 状态 N 小时,超时进人工队列。
  • 地址错误 / 已废弃:广播前预检 + 用户二次确认 + 客服 SOP。
← 返回原型集 · BACK TO HUB