区块链/等级 II · 运作机制/2.2 交易/课程 7
一笔交易的一生
从签名到最终性:一笔交易如何穿越网络
材料mempool.space 网站用于追踪确认深度的区块浏览器
好奇
- 为什么节点在还不知道一笔交易是否会被打包进区块之前,就需要先验证它?
- 当两个区块同时出现时,是什么让其中一个比另一个更“真实”?
- 为何六次确认会成为一种惯例?何时算过多,何时又算过少?
探索
- 整个过程始于钱包软件。用户选择特定的未花费交易输出(UTXO)来支付款项和手续费。钱包构建一个新的交易对象,其中定义的输入通过交易ID和索引引用之前的输出,输出则将价值分配给收款地址或找零地址。每个输入都用与其锁定脚本对应的私钥签名,生成数字签名,在不暴露私钥本身的情况下证明所有权。
- 完成全部签名的交易会被序列化为二进制格式,并通过点对点网络广播给相连的节点。每个节点收到后都会根据共识规则独立验证:检查输入是否足以覆盖输出,验证密码学签名,确保没有对现有UTXO进行双花,并验证脚本逻辑。如果按照策略也有效,节点会将该交易加入本地内存池,并通过“inv”(inventory)消息向其他节点通告;尚未拥有该交易的节点会通过“getdata”请求完整交易。
- 矿工持续在自己的内存池中寻找有利可图的交易。他们挑选一组高费率交易放入候选区块模板,模板中还包含发放当前区块补贴和所收手续费的coinbase交易。随后,矿工执行工作量证明(PoW),反复对区块头进行哈希运算,直到找到满足网络当前难度目标的哈希值。这项工作使得区块生产成本高昂而验证成本低廉;一旦找到,区块就会在全网广播。
- 收到新区块的节点会先验证其工作量证明和交易有效性,再将其追加到本地的链副本中。此时,该区块中的交易被视为已确认,确认深度为1。它们的输入在UTXO集合中被标记为已花费,它们的输出在所需的锁定时间或成熟期过后即可用于将来的花费。如果在同一高度出现竞争区块,节点会跟随累积工作量最多的分支;如果一次短暂的重组替换了某个区块,该区块中的交易会返回内存池,除非新分支已经包含了它们。
- 每当确认区块之上再添加一个区块,安全性就会随之提高。白皮书中的表格显示,拥有10%算力的攻击者从落后5个区块的位置追上来的概率低于0.1%。6次确认(约1小时)正是由此类分析而成为一种常见惯例,不过实际风险取决于攻击者所占的算力份额以及涉及的金额。虽然有些商家对小额付款接受零确认,但较大额的转账通常会等待多次确认,以降低通过链重组进行双花攻击的风险。
- coinbase交易通过挖矿奖励和手续费创造新的比特币,它们有一项特殊限制:其输出在获得100次确认之前不能被花费。之所以有这条规则,是因为如果所在区块在重组中被替换,coinbase输出就会消失;这一延迟可以防止此类币扩散到后续交易中,进而导致那些交易失效。普通的用户间转账则没有这种延迟;一旦确认,输出在技术上即可花费,不过是否等待更多确认是一项风险管理决策,取决于涉及的金额和信任假设。
关键事实
- 节点在将交易加入其内存池之前,会先根据共识规则对其进行验证。
- 一个区块的有效性取决于其工作量证明是否达到当前的难度目标。
- 六次确认(大约一小时)是一种常见惯例,并非协议规定。
- coinbase输出需要经过100个区块的成熟期后才能被花费。
- 在重组中,被替换区块中的普通交易会返回内存池,除非它们与新分支冲突;该区块的coinbase交易则会消失。
- 节点通过“inv”消息通告新交易,并在收到请求(“getdata”)时发送这些交易。
练习 九、六、三、一
9收集列出一笔交易从创建到最终确认的生命周期中9个不同的阶段或事件。
6归类将这9个阶段归为6个时期:构建、验证、传播、挖矿、确认以及确认后状态。
3提炼将这6个时期归纳为网络执行安全保障或共识规则的3个关键检查点。
1凝结用1句话解释:为什么跟随工作量最多的链能够解决相互竞争的区块之间的冲突。
事实核查
日期、数字及数据均依据下方列出的已发表资料进行核实。