Appearance
概览
本章建立对交易所钱包系统的全局视图。先从交易所整体业务出发,看钱包系统处在什么位置、与哪些外部系统交互,然后进入钱包内部,概览资金流动、分层架构和链模型差异。后续章节沿两个方向展开:第 2–5 章按业务模块纵向深入(充币、归集、资金调度、提币的完整技术链路),第 6–8 章按横切面系统横向展开(签名服务、交易生命周期管理、内部账本与对账)。
交易所业务全景
从一个用户的视角出发,能最直观地看到钱包系统在交易所中的位置。
用户注册交易所后,首先要把链上资产存进来。用户向交易所分配的充值地址转账,这笔交易发生在区块链上。钱包系统负责监听链上交易、识别出这笔充值,然后通知账户系统为用户入账。入账之后,用户在交易所内看到的余额就是账户系统数据库中的一个数字,与链上资产不再有直接对应关系。
资产进入交易所后,用户可以交易。用户挂一笔买单,撮合引擎在订单簿中找到匹配的卖单并成交,成交的结果是账户系统中买卖双方的余额变更。整个撮合过程不涉及任何链上操作——这是交易所与去中心化交易所(DEX)的根本区别。
当用户想把资产提回链上时,通过账户系统发起提币请求。风控系统对请求进行审核(额度、频率、目标地址是否在黑名单等),审核通过后,账户系统将提币指令下发给钱包系统。钱包系统构造链上交易、签名、广播,等待链上确认后回写结果,账户系统完成最终扣款。
这条线串下来可以看到:撮合引擎和账户系统处理的是交易所内部的数字流转,风控系统在关键节点做拦截判断,而钱包系统是交易所与区块链网络之间唯一的接口层——所有链上资产的进出都必须经过它。本小册聚焦的就是这个接口层内部的一切。
本小册所说的"钱包"
上一节提到了"充值地址"和"钱包系统",但还没有说清楚"钱包"在本小册的语境中到底指什么。在进入内部细节之前,需要先把这个词落地。
在日常区块链语境中,"钱包"通常指用户自己持有私钥的客户端软件,比如 MetaMask、Trust Wallet。用户安装钱包、生成私钥、自己保管助记词,所有链上操作都由用户本人发起和签名。
交易所钱包是一个完全不同的概念。它不是给用户用的客户端,而是交易所在后端运行的一套系统,负责代替用户管理链上资产。用户在交易所看到的"余额"只是数据库里的数字,真正的链上资产由交易所统一持有和调度。本小册讨论的"钱包",始终指这个后端系统。
从链上的视角看,不管是 MetaMask 还是交易所钱包,底层逻辑是一样的:谁持有私钥,谁就能花费对应地址上的资金。所谓"钱包",本质就是一个或一组链上地址,加上控制这些地址的私钥,再加上管理这些私钥的软硬件基础设施。区别在于:个人钱包里私钥由用户自己保管,交易所钱包里私钥由交易所保管。
交易所管理的链上地址分为两类。
第一类是充值地址。交易所为每个用户分配一个独立的链上地址,用户充币时向这个地址转账。这些地址的唯一目的是识别"这笔链上转账是哪个用户充的"。用户从未持有过这些地址的私钥——私钥从生成开始就由交易所保管。
第二类是运营钱包地址。这些地址跟具体用户无关,是交易所自己的"金库"。后文所说的热钱包、温钱包、冷钱包,指的都是这一类。热钱包地址用来统一处理所有用户的提币,温钱包和冷钱包地址用来存放大部分资金。充值地址上的零散资金需要定期汇总到运营钱包地址上,这个操作叫归集。
热、温、冷的区分不在于地址本身有什么不同——它们在链上看起来没有任何区别——而在于私钥的存储和使用方式:热钱包的私钥存储在联网服务器上,可以自动签名;温钱包的私钥也在线,但签名需要多方审批;冷钱包的私钥存储在完全离线的设备上,签名通过物理介质中转。安全等级的差异,归根结底是私钥离互联网有多远。
钱包系统的内部职责
明确了"钱包"的含义之后,接下来看钱包系统内部需要做哪些事情。
钱包系统的职责围绕三件事展开。充币是监听链上交易,识别属于本交易所的充值,完成内部入账。提币是接收账户系统下发的提币指令,构造链上交易,签名并广播。资产管理是在热、温、冷三层运营钱包之间调度资金,确保热钱包有足够余额处理日常提币,同时将大部分资产保留在更安全的存储层中。
资金流动全景
交易所的资金并不是静止地存放在某个地方,而是在三层运营钱包之间持续流动。理解这个流动模式,是理解后续所有业务模块的基础。
资金进入交易所的路径是:用户向充值地址转账,这笔资金首先落在热钱包管理的地址上。但热钱包直接连接互联网,安全风险最高,不能让资金在这里大量积累。所以热钱包会定期将超出日常运营需要的资金归集到温钱包。温钱包积累到一定量后,再进一步归集到完全离线的冷钱包。资金沿着"热 → 温 → 冷"的方向逐级向更安全的存储层沉淀。
资金流出交易所的路径是反方向:用户提币时,热钱包直接从自己的余额中支付。当热钱包余额不足时,温钱包向热钱包转入资金,这个操作叫补充。如果温钱包余额也不足,则由冷钱包向温钱包补充。资金沿着"冷 → 温 → 热"的方向逐级向外释放。
这两个方向的流动构成了一个持续的循环:充币带来的资金不断向内沉淀,提币消耗的资金不断从内向外释放。每一层持有的资金量与其被攻破时交易所能承受的最大损失相匹配——热钱包持有最少(通常 2–5%),冷钱包持有最多(85–95%)。
钱包分层架构
热钱包(Hot Wallet)
前面已经知道热钱包的私钥在联网服务器上,可以自动签名。这使它能承担几乎所有与用户直接相关的链上操作:接收用户充值(扫块、入账),处理用户提币(交易构造、签名、广播),执行归集,以及触发余额调度。这一节展开它的内部架构。
架构:
内存化系统(In-Memory State) 是热钱包的性能核心。热钱包的核心状态(余额、nonce、UTXO 集、交易队列)变化极其频繁,每一笔提币都需要读取余额、分配 nonce、选择 UTXO、更新交易状态。将这些状态维护在内存中,读取延迟从毫秒级降到微秒级,吞吐可达万级 TPS。
内存化的代价是进程重启后状态丢失。恢复策略有两种:
- WAL + 事件回放:每次状态变更先写入 WAL(顺序写磁盘,开销小),重启后从最近的快照回放 WAL,重建内存状态。
- 从数据库 + 链上状态重建:查数据库和链上最新状态重建内存。更慢,作为 WAL 回放失败时的兜底。
安全方面,热钱包设置单笔和单日限额,超阈值的请求需要人工审批或转由温钱包处理。签名服务作为独立进程部署,与面向公网的 API 物理隔离。签名方案通常采用 MPC-TSS 的 2-of-3 方案,即使单个节点被入侵也不足以伪造签名。
温钱包(Warm Wallet)
温钱包负责给热钱包补充资金、接收热钱包归集来的多余资金,以及在冷钱包和热钱包之间中转大额调度。它在线运行,但不直接处理用户的充提币请求——可以理解为热钱包背后的"资金中转站"。
温钱包的核心机制是阈值管理——通过设定每层钱包余额的上限和下限,自动触发归集或补充操作。以 ETH 为例:
| 钱包 | 阈值 | 数值 | 触发操作 |
|---|---|---|---|
| 热钱包 | 上限 | 500 ETH | 热→温归集 |
| 热钱包 | 下限 | 100 ETH | 温→热补充 |
| 温钱包 | 上限 | 5,000 ETH | 温→冷归集 |
| 温钱包 | 下限 | 1,000 ETH | 冷→温补充(需人工审批) |
阈值设定需要平衡:提币需求预测(下限应覆盖数小时提币量)、补充延迟(链上确认时间)、链上手续费(区间太窄导致频繁操作)、安全暴露(上限越高风险越大)。
| 维度 | 热钱包 | 温钱包 |
|---|---|---|
| 交易频率 | 每秒数十到数百笔 | 每天几笔到几十笔 |
| 单笔金额 | 通常较小 | 通常较大 |
| 签名方式 | 单签或 MPC 自动签名 | 多签(multisig) / MPC,至少两方确认 |
| 审批流程 | 自动 | 半自动,超阈值需人工确认 |
| 对外暴露 | 面向用户请求 | 仅与内部系统交互 |
冷钱包(Cold Wallet)
冷钱包的私钥存储在完全离线的设备上,签名设备从不连接互联网,通过物理介质(USB、二维码)与联网环境交换数据。
离线签名流程:
步骤 4 是安全关键环节:签名者必须在签名设备自身的屏幕上确认交易内容,不能信任联网设备的 UI。这正是 Bybit 安全事件中被攻破的环节,后面安全工程部分会详细分析。
密钥管理方面,冷钱包的密钥在密钥生成仪式(Key Ceremony)中产生——在离线、电磁屏蔽的环境中生成,多人在场,全程录像。生成后的密钥通过 Shamir's Secret Sharing 进行分片,采用 t-of-n 方案(如 3-of-5),每个分片存放在不同物理位置。交易所还会定期使用冷钱包私钥签名消息并公开发布,这就是储备证明(Proof of Reserves),用于向公众证明交易所确实控制着这些地址上的资产。
三层协作全景
UTXO 模型与 Account 模型
区块链有两种主要的状态模型,它们对钱包系统的交易构造、归集、手续费计算有根本性影响。第 2-3 章会在具体业务场景中展开这些差异,这里先建立基本概念。
UTXO 模型
UTXO(Unspent Transaction Output,未花费交易输出)是 Bitcoin 及其衍生链(Litecoin、Bitcoin Cash 等)采用的模型。
在 UTXO 模型中,不存在"账户余额"的概念。用户的资产是一组离散的 UTXO,每个 UTXO 是某笔历史交易的一个输出,记录了金额和所有权条件(锁定脚本(locking script))。
发起交易 = 选择若干 UTXO 作为输入,创建新的 UTXO 作为输出。例如要向目标地址支付 0.7 BTC:
三个输入 UTXO(共 0.9 BTC)被这笔交易消耗,同时创建两个新的输出 UTXO。输入总额与输出总额的差值(0.9 - 0.7 - 0.18 = 0.02 BTC)就是矿工手续费——它不会出现在任何输出中,而是隐含在差额里。
对钱包系统而言,UTXO 模型意味着交易构造需要 coin selection(选币算法(coin selection)),即从现有 UTXO 中选择若干来凑够目标金额。由于一笔交易可以包含多个输出,交易所可以把多个用户的提币请求合并成一笔交易批量发送,大幅节省手续费——这就是批处理(batching)。手续费与交易体积(byte size)相关,输入和输出越多,体积越大,手续费越高,但批量发送仍然比逐笔发送便宜得多。归集操作的本质就是将多个零散的 UTXO 合并为一个。
Account 模型
Account 模型是 Ethereum 及 EVM 兼容链(BSC、Polygon、Arbitrum 等)、Solana、Tron 等采用的模型。
每个地址对应一个账户,账户有全局余额和交易序号 nonce。发起交易直接扣减发送方余额、增加接收方余额。nonce 严格递增,保证交易有序性。
| 发送方 | 接收方 | |
|---|---|---|
| 交易前 | 余额 10 ETH,nonce 42 | 余额 5 ETH |
| 操作 | 转账 3 ETH(nonce=42) | |
| 交易后 | 余额 6.999 ETH,nonce 43 | 余额 8 ETH |
| 差额 0.001 ETH = gas 费 |
对钱包系统而言,Account 模型的核心难题在于 nonce 管理:nonce 必须严格连续递增,高并发下如何分配和回收 nonce 是一个复杂的工程问题。每笔交易只能有一个接收方,所以 UTXO 模型中那种把多笔提币合并成一笔交易的批处理在这里无法原生实现(需要通过智能合约模拟)。手续费与计算量相关,计算公式是 gas = gasPrice × gasUsed。归集操作需要为每个充值地址单独发送交易,每笔都需要支付 gas。ERC-20 token 的归集更加复杂,因为充值地址上可能没有 ETH 来支付 gas,需要先向该地址转入 gas 费。