这篇文章不谈价格涨跌和投资讨论。只做一件事:把比特币的基本原理讲清楚。读完你应该能看懂区块浏览器里一笔交易的"输入/输出",能理解为什么在没有银行的情况下,比特币也能维护余额和支付。
需要的前置知识不多,你只需要了解三件基础概念即可:公钥/私钥与数字签名(私钥像"签名章",用来证明你有权花钱) 、哈希(像数据指纹) 、以及分布式系统的入门概念。这不是密码学课程,所以我们不会推导数学证明,只用直觉和例子把机制讲明白。
比特币是什么?
在完整理解比特币是一个去中心化的账本/交易数据库/支付系统 之前,你可以先把比特币当成:一份公开的、全网同步的"历史记录",上面只写两类信息------"哪些钱还没被花掉"和"这些钱未来需要满足什么条件才允许被花"。任何人都可以保存一份副本(运行节点),并用同一套公开规则检查:新来的记录有没有作弊、有没有双花、有没有伪造签名。它不像银行系统那样由某个机构维护"账户余额表",更像一个班级共同维护的共享记账本:没有班长能单方面改分数,每个人都可以拿规则对照检查。不过这个"共享账本为什么不会乱、为什么最后大家能收敛到同一份版本、为什么有人愿意付出成本来维护它",要到后面讲完网络规则与挖矿机制后,你才会彻底吃透------而今天我们先从最底层的"钱的形态"开始:UTXO。
比特币与区块链的关系
读比特币相关内容时,最容易混淆的其实不是技术细节,而是名词。我们先把几个常见词拆开:
区块链(blockchain):从字面上看就是"区块组成的链"。它是一种数据组织方式:把一批记录打包成"区块",再用哈希把新区块和前一个区块链接起来,让历史记录更难被悄悄篡改。你可以把它理解为一种"按时间顺序装订成册、每页都盖了前一页指纹"的账本结构。
而 比特币(Bitcoin) :是一套运行在互联网上的系统(协议 + 软件 + 节点网络 + 规则),它用区块链来保存交易历史 ,并用一套公开规则让全网在"哪些交易有效、哪些区块算数"上达成一致。换句话说:区块链是比特币使用的一种账本结构,但比特币不仅仅是区块链 ------它还有交易格式、验证规则、网络传播、挖矿激励等一整套机制。在比特币系统里,词语 比特币(bitcoin / BTC):这个词也是这个系统里的"记账单位/资产"。
比特币是区块链思想最早的大规模成功落地之一,因此影响力最大、生态最成熟;但区块链后来被许多系统采用并拓展了用途(不止做转账,还尝试做更通用的"可验证记录"),如以太坊(Ethereum) 。同时也出现了大量基于比特币技术理念衍生出来的其他币种与系统,如莱特币(Litecoin) 、门罗币(Monero)。
UTXO:比特币里的"钱"
在比特币里,"你有多少钱"不是写在某张账户余额表上,而是散落在账本历史里的一堆"小票"。这些小票的正式名字叫:
UTXO(Unspent Transaction Output,未花费交易输出):一笔交易产生的每个"输出(output)",只要还没有被后续交易花掉,就处于"未花费"状态,它就是一个 UTXO。
所以钱包里显示的"余额",本质上是:
你所控制的私钥,能够解锁的一组 UTXO 的总和。
这里有一个非常关键但容易忽略的点:UTXO 不是"记在你名下的余额",而是"带着使用条件的价值片段"。这份"使用条件"通常会指向某个公钥哈希(也就是我们日常看到的"地址"),意思是:未来想花这笔钱的人,必须拿出能满足条件的证明(通常就是签名)。

UTXO 里到底包含了什么
把 UTXO 当成"小票",这张小票上至少写了两样最重要的东西:
- 金额(value):比如 0.5 BTC
- 锁定条件(locking condition):例如"能提供某个公钥对应的有效签名的人才能花"(在这个场景下,可以简单类比普通支付系统,理解为"钱属于谁")。
UTXO 从哪里来:交易输出如何变成"可花的小票"
UTXO 的来源非常朴素:每一笔交易的每一个输出,都有可能变成未来的 UTXO。
举个最简单的"收款"场景:
-
小明拥有自己的公钥和私钥,他把自己的公钥(即收款地址)给小红
-
小红生成一笔交易,在交易里写一个输出:
- 金额:0.5 BTC
- 锁定条件:只能由"小明的公钥"对应的私钥花掉
-
这笔交易一旦被网络接受并最终写进区块链历史里,这个输出就成了一个 UTXO
-
小明的钱包之所以"看到余额增加",是因为它扫描网络历史记录时发现:"有一张新的小票锁给我,而且还没被花掉"。钱包并不是从"某个中心服务器"读取余额,而是在本地(或通过服务)根据历史记录推导"哪些 UTXO 属于我"。之后,小明也可以花掉这个 UTXO(也只有他可以花,因为只有他有收款公钥对应的私钥)。
UTXO 的花费和找零
你不能"从一个 UTXO 里只花一部分"。花它的方式只有一种:整张用掉。相比微信支付,这其实更类似现金支付:你用一张 100 去买 30 的东西,收银台不会"把纸币剪掉 30",而是收走 100,再找你 70。
比特币交易也是同样的逻辑:
- 输入(inputs):你这次准备"用掉"的若干张旧小票(旧 UTXO)
- 输出(outputs):这次交易"新生成"的若干张新小票(新的 UTXO)
一个典型的简单支付几乎总会出现两个输出:
- 给收款人:比如给小红 0.7 BTC(锁给小红的条件)
- 找零给自己:比如找回 0.399 BTC(锁给小明自己的另一个地址)
绝大多数时候,一笔支付总会有找零。你在区块浏览器里看到"一笔交易输出 2 个"时,十有八九就是"付款 + 找零"。

手续费
一笔支付合法的基本逻辑是:输入金额总和 >= 输出金额总和,即你不能多花,当然你可以少花(不过没人会主动把自己的钱丢了)。
更多的时候,输入输出的金额差被作为手续费。
手续费 = 输入金额总和 − 输出金额总和
它不是写在某个"手续费字段"里,而是由差额自然形成的。
-
小明手里有两张 UTXO:0.6 BTC 和 0.5 BTC(共 1.1 BTC)
-
小明要付给小红 0.7 BTC
-
小明创建交易:
- 输入:0.6 + 0.5
- 输出:0.7 给小红 + 0.399 给自己
-
输入总额 1.1,输出总额 1.099,差额 0.001 BTC
-
这 0.001 BTC 就是手续费。手续费本质上就是"你少找回来的那点零钱"。
为什么不全部找零给自己,而是要留一些手续费呢?这类似于现实消费的交税。留出一些钱作为交易费可以让矿工更愿意打包这次交易,有利于维护整个比特币网络的运行。
防"双花":节点维护 UTXO Set
没有银行,谁来防止同一笔钱被花两次?
每个全节点都在检查各个想被确认的交易的合法性,都在维护一份"当前(所有人)仍然未花费的小票清单"------UTXO Set。
当节点收到一笔新交易时,它做的核心检查之一就是:
- 这笔交易引用的每一个输入,对应的那张旧小票(旧 UTXO)真的存在吗?
- 它还在 UTXO Set 里吗?(如果不在,说明早就被花过了,或者压根不存在)
- 你是否提供了满足锁定条件的证明(签名等)?
- 金额是否正确?(不能多花)
一旦这笔交易被接受并最终进入区块,节点就会更新自己的 UTXO Set:
- 把被花掉的旧 UTXO 从集合里移除
- 把交易新产生的 outputs 加进集合里
这里没有任何"中心裁判"。每个节点都在做同一套确定性的检查,所以"双花"不是靠"相信某个机构"解决的,而是靠"所有人按规则验算"解决的。

一个 UTXO 只能花费一次,因此有了交易 2 后,交易 3 就是非法的,不能被确认了(除非你直接丢弃交易 2,切换到交易 3)。
UTXO vs 余额账本
通常理解的支付系统(包括银行、支付宝/微信)更像"账户模型":维护一张表,写着"张三余额 100"。转账时就是把一个账户减、另一个账户加。
比特币不这么做。它更像"票据模型":账本不写"你有多少钱",而是写"哪些票据还没用掉,以及每张票据的使用条件"。所谓"余额",是你把"自己能解锁的所有未花费票据(UTXO)"加总出来的结果。
这两种模型并没有绝对优劣,但对理解比特币来说很关键:
-
在账户模型里,"余额"是系统的显式字段;
-
在 UTXO 模型里,"余额"是从历史记录推导出来的(因此钱包需要扫描/同步/索引)。

影响一:UTXO 越碎,花钱越"重"
UTXO 模型有个很现实的副作用:如果你的 UTXO 很碎,付款时可能需要拼很多张"小票"。而每多用一个输入,就要在交易里多写一段"我引用的是哪张旧票据 + 我如何解锁它"的数据,交易体积通常会变大。体积变大,矿工打包的成本也更高,于是你往往需要付更高的手续费,交易才更容易被尽快确认。
所以同样是"转 0.7 BTC",有时你只需要 1 个输入(恰好有一张 0.7 的票据),有时却需要 10 个输入(十张 0.07 的碎票据)。
这就是为什么很多钱包会在合适的时候做"合并 UTXO"(把多张碎票据整合成更少的、面额更合适的票据),从体验上看就像"整理零钱"。
影响二:隐私线索
绝大多数交易都会存在找零。一笔"付款"常常会有两个输出------给对方 + 找零给自己。现实里这是常识,但在链上它会变成线索:旁观者可以尝试猜测哪个输出是找零,从而把多笔交易串成"同一个人/同一钱包"的行为轨迹。
早期钱包之所以倾向于把找零打到一个"新地址",部分原因就是为了减少"把所有行为都绑在同一个地址上"的明显痕迹------但注意,这并不等于真正匿名:交易本身是公开可查的,地址之间仍可能被启发式规则关联。因此,比特币的"匿名与安全"并不能让人高枕无忧。他更像"假名制"而不是"匿名制":你不写姓名,但你写了可被分析的行为轨迹。其中的攻防逻辑门道很深,这里不讲。
查看一个典型的 UTXO
有很多网站都可以查看比特币主链的信息。以 mempool.space 为例子:
我们随意选择一个已经确认的区块。向下滚动,就可以看到本区块确认的所有交易,每个交易引用一个或多个 UTXO,并生成新的 UTXO:

上图中我随手截取了两笔交易(上、下各一笔)。
先看第一笔交易(交易哈希以 fb2628a7... 开头)。它只有 1 个输入 :来自地址 bc1qvtdvv...zdd70msz,金额 0.03382740 BTC。这表示:此前账本里存在一张面额 0.03382740 BTC、锁给这个地址的"旧小票",现在被这笔交易整张用掉了。然后它生成了 2 个输出:一个输出转到地址 3NCU3KvX...W5tm3,金额 0.00089565 BTC;另一个输出又回到了 bc1qvtdvv...zdd70msz,金额 0.03229910 BTC。这就是典型的"付款 + 找零":前者是付给对方的金额,后者是找回给自己的零钱。页面右下角蓝色框显示这笔交易的 输出总额为 0.03319475 BTC(也就是两笔输出相加)。
这笔交易的手续费:输入是 0.03382740,输出是 0.03319475,相减得到 0.00063265 BTC,换算成 satoshi 就是 63,265 sats(BTC 是比特币,而 Satoshi 是比特币系统的最小单位,1 BTC 等于 1亿 Satoshi)。交易里手续费往往不是一个单独的字段,而是由"少找回来的零钱"自然形成的。
再看第二笔交易(交易哈希以 d9195032... 开头)。它有 2 个输入,而且两张旧小票都来自同一个地址 bc1qvtdvv...zdd70msz,金额分别是 0.00003777 BTC 和 0.00642833 BTC。两张加起来输入总额是 0.00646610 BTC。它同样产生了 2 个输出:一个输出到 bc1qzgqf...njp90rhl,金额 0.00004840 BTC(这是付款);另一个输出回 bc1qvtdvv...zdd70msz,金额 0.00578845 BTC(这显然是找零)。输出总额 0.00583685 BTC(页面右下蓝框),因此手续费就是 0.00646610 − 0.00583685 = 0.00062925 BTC = 62,925 sats。