一笔比特币交易,核心包含输入和输出两类数据:输入说明钱从哪里来,输出说明钱到哪里去。除这两部分外,还有付款人的数字签名、版本号和可选的锁定时间。
一笔比特币交易包含哪些信息
区块上保存的不是给某个账户增加或扣减余额,而是一条条交易记录。把这条记录拆开,真正起作用的字段很有限。
| 部分 | 作用 |
|---|---|
| 版本号 | 告诉全网节点按哪一代规则校验这笔交易 |
| 输入 | 引用以前某笔交易生成的“未花费输出”,并附上私钥签名,证明付款人有权花掉这笔钱 |
| 输出 | 写明收款方和金额;输出可以有多个,剩余资金也会作为一个输出留在链上 |
| 矿工费 | 交易数据里没有单独一栏,它等于输入总额减去输出总额 |
| 锁定时间 | 可选字段,规定交易最早可以被打包的时间或区块高度 |
每个输入都必须指向一个尚未被花掉的输出,这个输出就是 UTXO。比特币网络不记余额,只记一份“还没花掉的输出”清单;你的钱包余额,其实是该钱包能支配的 UTXO 价值汇总。总之一笔比特币交易包含的输入和输出,必须一一对应才能通过校验。
输入、输出和手续费是怎么拼在一起的
组装一笔交易可以看成三步。
- 凑钱。钱包在 UTXO 集合里选出足够多的未花费输出,让总和覆盖“付款金额+手续费”。这个挑选过程可以同时使用多个输入。
- 写输出。给收款方写一个输出,包含地址和金额;如果输入总额超过应付金额,就额外写一个输出,把多出来的钱送回自己钱包,这就是找零。
- 签名并广播。用对应私钥对整个交易签名,签名覆盖交易的关键内容,尤其是输出和金额。只要有人改动任意一个数字,签名就会失效。交易随后广播到全网,进入待打包状态。
和银行转账相比,差在哪
很多人把比特币交易理解成“用钱包给别人转钱”,但底层的记账方式很不一样。
| 银行转账 | 比特币交易 |
|---|---|
| 账户有一个中心化的余额,转账时余额被直接加或减 | 账本没有余额,只有一堆未花费输出(UTXO) |
| 收付款双方的身份由账号识别 | 输出由地址或脚本锁定,谁能提供对应私钥谁就能花 |
| 交易由银行校验和结算 | 交易由全网节点独立校验,矿工负责打包 |
| 一笔转账记录通常只有两个当事人 | 一笔交易可包含多输入、多输出,找零地址看起来也像收款地址 |
由于没有余额,“资产”并不是放在钱包里的东西;钱包只是替你保存私钥,并用私钥控制链上 UTXO。
签名只需要付款人
这里有一点值得记住:收款时不需要收款人签名。你看不到收款人的签名,不代表数据缺失,而是因为这笔交易要证明的是“花输入的人有权花”,所以只要付款人的私钥签名就够了。等到收款人将来花这笔钱时,他提供的是另一段签名。
常见问题
为什么在区块浏览器里看不到“余额”
区块链上有交易记录,没有“账户余额”字段。所谓余额是钱包扫描自己控制的未花费输出后加总的结果;换个钱包,只要私钥相同,看到的余额仍然一致。
交易里的找零是谁发起的
找零是付款时输入总额大于输出总额形成的剩余输出,它会写回到付款人控制的地址,在链上与正常收款没有外观区别。
一笔交易能同时付给多人吗
能。一个交易可以包含很多输出,每个输出对应一个地址和一笔金额;多人分摊、批量付款都可以放到同一笔交易里完成。
交易广播以后,收款人能改金额吗
不能。交易已经用付款人的私钥签名,任何改地址、改金额的操作都会破坏签名;没有有效签名的新交易无法通过节点校验。
打开区块浏览器检查任意一笔交易,先看输入和输出两个列表。输入会指向较早的交易编号,输出会列出收款地址与金额;把输入总额减去输出总额,剩下的差额就是矿工费。其余字段只是协助节点校验,看懂这两个列表,就理解了比特币交易的骨架。

