9 钱包体现充值怎么设计

vvEcho 2026-03-13 10:47:07
Categories: Tags:

这个问题其实分为充值和体现两个流程

充值流程

用户转账 -> 区块链 -> 监听程序监听区块 -> 识别充值地址 -> 记录充值订单 -> 确认区块数 -> 用户账户入账

这里怎么签名?

用户操作点击转账 → 构造对应的交易数据(此时数据为未签名)

1
2
3
4
5
6
nonce: 10
to: 0x交易所充值地址
value: 1 ETH
gasPrice: xxx
gasLimit: xxx
chainId: 1

-> 前端调起用户钱包例如Metamask -> 过程中钱包会用户的私钥对这笔交易进行签名 -> 然后用户在钱包中点击确认 -> 钱包发起转账,钱被转到对应链上 -> 后端监听程序会监听对应链上的区块 -> 识别对应的充值地址 -> 确认区块数(6~12)-> 充值成功

如果回滚,用户钱包里的钱到对应地址了吗?

交易分为三个阶段,用户发起转账,用户签名,用户确认然后发起交易
1.进入交易广播的阶段, 这个时候钱还在用户钱包里,只是准备转出去
2.已上链(1个确认数),这个时候钱已经到目标地址了,已被打包进区块;但:不安全(可能被回滚)
3.多确认(最终确认),6 / 12 confirmations,这时候:钱在目标地址:基本不可回滚(安全)

为啥BTC是6个,ETH是12个呢?

因为BTC是的出块时间约为10分钟,分叉概率低;一般确认数为6,因为超过这个确认数,如果需要从前置6个节点挖出一条新链的难度极高
而ETH出块快,分叉率又高所以需要确认数达到12个,基本大于12个块后就不会有新链产生

出块时间 分叉概率 推荐确认数
BTC ~10分钟 6
ETH ~12秒 12~20

如果没有对应的确认数,会有啥问题?

那就是著名的双花攻击,双花攻击利用的是区块链的概率最终性,在交易尚未达到足够确认数前,通过构造竞争链来回滚交易
攻击操作:

  1. 让 Tx1先被交易所看到(甚至1确认)
  2. 交易所提前入账
  3. 攻击者加大算力/手续费 推 Tx2
  4. 产生链重组(Reorg)
  5. Tx1 被踢出链
  6. Tx2 成为主链
    这个时候钱其实还在攻击者钱包里,但是对应到交易所账号里,用户对应的余额却增加了
    解决办法:每条链都设置对应的确认数;针对大额交易增大确认数,用户充值可以延迟入账,针对异常地址提高确认数,增加风控校验

监听对应区块链,怎么识别到对应的地址呢?

交易所后端在用户注册后,通常为Kyc认证通过后才允许用户充值,这个时候会在用户表相关映射表里维护一个充值地址;这个充值地址是通过HD钱包生成的,即一个主私钥可以无限生成多个子私钥,然后再生成子私钥对应的地址;一般做法是一个用户+对应链类型->映射出一个充值地址

通常情况下,交易所为每个用户在每条链上分配一个固定充值地址,该地址由HD钱包派生生成并永久绑定用户。后续充值复用该地址,通过监听链上交易的toAddress实现用户映射

提现流程

用户申请提现 -> 风控检查 -> 生成提现订单 -> 签名交易 -> 广播区块链(把你签名好的交易发送到区块链网络,让全网节点知道这笔交易)


记录txHash -> 确认完成

提现怎么签名?

提现签名由交易所热钱包完成,通过安全签名服务隔离私钥,交易广播后需持续跟踪链上状态,并通过状态机驱动用户通知与资金确认

体现这一步怎么广播对应的交易

一般大厂都是自建节点,小公司是调用三方的节点;本质都是调用这些节点的rpc服务,将签名后的交易发送给节点,由节点负责校验并加入 mempool,再通过P2P网络广播给全网

冷热钱包

冷钱包 (大额) -> 热钱包(小额) -> 用户提现