先忘掉“银行余额”那一张数字
银行 App 显示“你有 128.5 元”,背后是账户模型:一个账户一个余额,转账就加减。比特币常用的是 UTXO(Unspent Transaction Output,未花费交易输出):更像你口袋里好几张面额不同的收据。
举例:你有三张票据——0.01、0.04、0.10 BTC。要付 0.05,可能花掉 0.04 和 0.01,或花掉 0.10 再找回 0.05。被花掉的票据作废,新票据(找零与收款)被创造出来。
为什么要这样设计?
UTXO 让“哪些币被花过”变得清晰可验证,便于并行校验与防止双花。没有这套结构,节点更难快速判断一笔输入是否还从未花费。
对用户的体感:钱包显示的“余额”其实是把你能控制的 UTXO 加总后的友好界面。真正签名时,钱包在挑选要花哪些票据。
找零地址:为什么有时会冒出“陌生地址”
你转给同学 0.01,自己钱包却出现另一个地址多了一笔——那常常是找零。现代钱包多用分层派生,找零地址仍属于你的同一套钥匙。
新手惊吓点:以为币被转走了。对策:用自己的钱包查看、在浏览器核对输出是否回到你的找零地址。
和手续费的关系
交易体积大致与输入/输出个数有关。用很多小 UTXO 拼一笔大额支付,可能更“胖”,手续费更高。这就是有人会做“零钱整理”(consolidate)的原因——但整理本身也要付费,且有隐私权衡。
把一笔交易拆成“输入/输出”阅读
打开任意浏览器里的一笔交易:上方常见输入列表(花费哪些旧票据),下方是输出列表(新票据给谁)。若输出比“付款金额”多出一个回到自己的部分,那就是找零。
练习:在测试网给自己转一笔,记下txid,到浏览器指出哪一个输出是找零。做三次,UTXO 就不再抽象。
超市找零:把 UTXO 演一遍
假设你口袋里有三张“比特币收据”:
- 票据 A:0.02 BTC(上次别人转给你的)
- 票据 B:0.03 BTC
- 票据 C:0.10 BTC
你要付给同学 0.05 BTC。钱包可能选择花掉 C(0.10),然后创造两张新票据:一张 0.05 给同学,一张 0.05 找零回你(再减去手续费后数字会略少)。A、B 仍未花费,继续躺在口袋。
另一种策略:花 A+B(0.05)刚好付给同学,可能几乎没有找零(仍要留一点手续费差额)。钱包算法会在“手续费、隐私、未来零钱数量”之间权衡——你平时看到的只是最终余额。
为什么银行显示一个数字就够,比特币却要票据?
银行数据库在内部也可以拆成很多行,但对你只展示一个余额,因为银行是可信中心,它说“扣了”就算。比特币没有中心裁判,每个节点必须能独立验证:你拿出来花的每一张票据,是否从未被花过。
UTXO 集合就像全市所有未兑现支票的清单。节点更新清单:旧支票作废,新支票生效。双花攻击等于试图把同一张支票交给两家店——全网竞赛记账让其中一笔最终失败。
找零地址吓人案例(课堂模拟)
小明第一次用钱包转 0.001 BTC 给测试地址,浏览器里看到:输入花掉了他原来的 0.01,输出有两笔——一笔到同学,一笔到一个他“不认识”的地址。他以为被盗,截图发群。
老师带他打开钱包的“找零/派生地址”说明:那个陌生地址仍由他的助记词派生,余额还在。恐怖来自“地址会变”,不是币飞了。
现代钱包常用分层确定性(HD)派生:同一套种子生出收付款与找零多条地址。备份助记词 = 备份整棵地址树。
粉尘与零钱整理
很多极小 UTXO 像一堆钢镚。付一笔大额时可能要塞进很多输入,交易变“胖”,按字节计费就更贵。consolidate(合并零钱)是主动花掉许多小票、换成一张大票——但合并本身要付费,且可能让观察者更容易把地址簇到一起(隐私变差)。
教育结论:余额数字相同,UTXO 结构可以很不一样;结构会影响费用与隐私。
和以太坊账户模型对照一句
以太坊更像“账户里有一个余额字段”。比特币 UTXO 更像“一叠支票”。两边都能防双花,但区块浏览器页面长得不同:BTC 看 inputs/outputs,ETH 看 from/to 与内部调用。跨站学习时别混着背。
示意图:花掉旧票据,生成新票据(含找零)