
币、余额与账户:为什么「我有多少」有三种不同的答案
打开一个支持多条链的钱包,如果你看得仔细,会发现一件怪事。比特币余额和以太坊余额都不过是屏幕上的数字,但它们在底层的计算方式截然不同——而在 Solana 上,又是第三套安排。
这不是冷知识。它解释了为什么比特币的手续费取决于你的交易历史、为什么一笔以太坊交易可能失败却照样花掉你的钱,以及为什么一个 Solana 账户没法被简单地清空到零。
UTXO 模型:你拥有的是币,不是余额
比特币没有账户,也不存储余额。它存储的是一组未花费的交易输出——UTXO——其中每一个都是一块被某种花费条件锁住的、彼此分立的价值。
想想现金。你口袋里并没有「47 元」;你有一张 20 元、两张 10 元、一张 5 元和两枚 1 元硬币。要付 23 元,你递出 20 元和 5 元,然后找回 2 元。你没法把一张钞票撕成两半。
UTXO 就是这样运作的。每一个都必须整个花掉。要从一个 1 BTC 的输出里支付 0.3 BTC,你的钱包会消耗掉整整 1 BTC,并创建两个新的输出:0.3 给收款方,约 0.7 作为找零回到你手上。那个 1 BTC 的 UTXO 不复存在。
因此你的「余额」是一个推算出来的数字——你的钱包扫描全链,寻找那些锁在你能满足的条件之下的输出,然后把它们加起来。比特币区块链上任何地方都没有一条记录说你拥有某个特定的金额。
由此得出三个结论,而且三个都很实际:
手续费取决于你的历史,而不只是金额。 手续费按字节收取,而你每花掉一个输入就多出一些字节。用一个大额 UTXO 支付 50 元很便宜;把三十个极小的 UTXO 凑起来支付同样的 50 元就很贵,因为交易在物理上更大。这正是为什么值得在手续费低时归集 UTXO。
找零是一个必须去往某处的真实输出。 每个钱包都会自动处理它,但它也正是链上分析者用来把你的地址串联起来的那套找零地址启发式背后的机制。
花费天然是并行的。 不同的 UTXO 彼此独立,因此没有什么会迫使你的交易遵循严格的先后顺序。
比特币、莱特币、狗狗币、比特币现金、Zcash、Ravencoin 和 Flux 都是这样运作的。这是更古老的模型,也是「不是你的密钥,就不是你的币」这句话最字面成立的模型——不存在账户,只有附带条件的币。
账户模型:你拥有一个余额,和一个计数器
以太坊抛弃了这一套,改用更接近银行账本的东西。链上保存的是一份状态:一个从地址到余额(对合约而言则是到存储数据)的巨大映射。发送 0.3 ETH,就是从一个数字里减去 0.3,再加到另一个数字上。没有输入,没有输出,也没有找零。
这更简单,也正是它让智能合约变得可行的原因——合约需要可读可写的持久化存储,而当世界由一枚枚分立的币构成时,这件事会很别扭。
但账户模型引入了一个 UTXO 没有的问题。如果一笔交易只是「从爱丽丝那里减去 0.3」,那么任何看到它的人都可以反复重播它,把她的账户掏空。解决办法是 nonce:一个按账户计的计数器,包含在每一笔交易里,且必须恰好递增一。第 7 号交易只能在第 6 号之后被打包,而且只能一次。
nonce 正是 EVM 链之所以如此行事的原因:
你的交易被严格排序。 一笔卡住的交易会阻塞同一地址之后的每一笔,因为它们无法乱序处理。
即使交易失败,手续费照样支付。 gas 支付的是被尝试的计算,而不是成功的计算。一次被回滚的合约调用同样消耗了验证者的工作,所以同样要花钱。这件事不断让人吃惊,而且是与 UTXO 世界的真实差别——在那边,一笔无效交易只是永远不会被确认,也不花一分钱。
nonce 管理是真正的基础设施。 对普通钱包而言这是隐形的。而对于一个需要两台设备就交易达成一致后才广播的多签来说,nonce 必须被预留、被追踪、被释放——这正是为什么 nonce 的处理在双设备签名中是一个反复出现的主题,而不是一个实现细节。
以太坊、Polygon、BSC、Avalanche、Base 和 XDC 都使用这一模型。
Solana:要交租的账户
Solana 也是基于账户的,但有一处让人措手不及的转折。
在 Solana 上,几乎一切都是账户——你的钱包、你持有的每一种代币、每个程序的数据。而由于这些账户占用验证者的内存,它们必须保有一个最低余额才能继续存活。这就是免租:存够了,账户便无限期存续;低于这个线,它就可能被回收。
实际效果是:持有一种 SPL 代币需要一个单独的代币账户,并用少量 SOL 为其提供资金,别人才有可能把那种代币发给你。接收并不是免费的。这一点不同寻常,而且值得在你需要之前就弄明白,因为「我把代币发给你了,可什么都没到」往往只是缺了一个代币账户。
为什么多链钱包必须把三种模型都建模出来
一个支持这些链的钱包,无法共用同一套内部的「余额」概念。它需要:
- 对 UTXO 链:一组输出,每个带有金额和脚本,外加一套决定花哪些的选币逻辑。
- 对 EVM 链:一个余额数字加一个 nonce,以及一条尊重顺序的队列。
- 对 Solana:一个余额、一组关联代币账户,以及对免租下限的认知。
安全架构同样必须随之调整。在 UTXO 链上,SSP 的二取二是一段脚本:一个需要两枚签名才能解锁的 P2WSH 输出,由链自身的脚本规则强制执行。在 EVM 链上,普通账户并没有等价的脚本系统,所以多签是通过账户抽象实现的——一个验证逻辑要求两枚签名的智能合约账户。在 Solana 上,它是一个程序派生地址,由链上的一个程序掌控。
三套截然不同的机制,一个面向用户的理念:没有两台设备,什么都动不了。底层实现彼此毫不相像,恰恰就是这项保证必须在每条链上重新建立、重新审计,而不能被假定为自动继承的原因。
这对你意味着什么
当比特币手续费对一笔小额付款显得偏高时,看看你的输入。 金额本身不如它由多少块碎片组成来得要紧。
当一笔以太坊交易卡住时,同一地址之后的交易都被堵在它后面。 那是 nonce,不是故障。解决第一笔就能疏通队列。
当一笔失败的 EVM 交易照样收你的钱时,模型正按设计运作。 模拟有助于避免这种情况——这也是为什么签名前先模拟在基于账户的链上比在 UTXO 链上更有价值。
当一笔 Solana 代币转账「消失」时,去找找代币账户。 什么都没丢;只是目的地可能还不存在。
以上没有一条是某个特定钱包的怪癖。它们都是各条链多年前所做的一个设计决定的后果;而一旦你能看清自己身处哪种模型,许多原本令人费解的行为就变得可以预料了。


