一、付款人创建并签名交易
![](https://www.fxtjz.com/wp-content/uploads/2024/02/image.png)
明文交易数据包括:
- 付款者的哪个比特币
- 在比特币系统中,交易不像传统银行系统中的账户余额那样直接表示为一个数字。相反,比特币的所有权是通过称为“交易输出”(transaction outputs)的数据结构来记录的。每个交易输出代表一定数量的比特币,并且可以被看作是比特币币值的一个“票据”。“交易输出”已经包含了一个锁定脚本(ScriptPubKey),通常该脚本会指定哪个公钥可以解锁并使用这些比特币。相当于“交易输出”包含了付款人的公钥。
- 收款人地址
- 转账数量
- 锁定时间
- 某些交易可能包含一个时间锁,指定了交易不能被加入区块链的最早时间或区块高度。
这里补充一些关于哈希算法和哈希值的背景知识:
二、付款人广播交易,节点验证后全网广播,其他节点验证后加入内存池
节点收到付款人广播的交易信息后,会通过下图机制验证:
![](https://www.fxtjz.com/wp-content/uploads/2024/02/image-3.png)
验证通过后,向全网其他节点广播,每个节点收到这个节点的广播后,也做相同的验证,通过后加入自己的内存池。这种每个节点独立验证的机制确保了比特币网络抵御欺诈和无效交易的能力,是比特币去中心化信任的基石。
付款人Alice在广播交易时,如何保证这笔账不会被矿工遗漏?假设此时网络拥堵无法及时记账,Alice需要反复重新广播吗?
当Alice广播一笔比特币交易时,这笔交易首先会被发送到网络中的节点,并添加到这些节点的内存池(mempool)中,等待矿工将其打包进一个新的区块。在网络拥堵的情况下,确实可能会出现交易延迟确认的情况。
1. 交易费:一般来说,矿工会优先选择交易费高的交易来打包进新的区块,因为这会增加他们的收益。如果Alice的交易费设置得足够高,即便网络拥堵,矿工也更可能选择她的交易进行确认。
2. 广播一次即可:正常情况下,Alice只需要将她的交易广播一次。一旦交易被网络节点接收,它就会被传播到整个比特币网络中的其他节点。
交易在内存池中等待:一旦交易进入内存池,它会一直留在那里,直到被矿工打包进区块。即使网络拥堵,只要交易费合理,Alice的交易最终还是会被矿工处理。
3. 交易有效期:比特币交易没有明确的过期时间。然而,如果交易在内存池中等待了很长时间(通常是数天),节点可能会将其从内存池中移除。此时,交易就需要重新广播。
4. 替代机制(Replace-by-Fee, RBF):一些比特币钱包支持RBF协议,允许用户用一个更高手续费的新交易来替换还未被确认的交易。如果Alice原本的交易手续费过低,导致确认时间过长,她可以使用RBF协议提高手续费来加快交易确认的速度。
5. 交易加速服务:有些交易平台或矿工团体提供了所谓的交易加速服务,用户可以支付额外的费用来提高特定交易的优先级。
总结来说,Alice通常不需要重复广播她的交易。只要交易已经被网络节点接收,且交易费设置得当,她的交易就会保留在内存池中,直到被矿工确认。如果交易长时间未确认,Alice可以选择使用RBF策略或寻求交易加速服务来提高交易的优先级。
三、矿工进行工作量证明(挖矿)争取记账权
每个区块包含一个区块头,其中含有多个重要信息,包括前一个区块的哈希值、Merkle树根哈希(代表了区块内所有交易的一个唯一哈希值)、时间戳、难度目标(difficulty target)以及一个随机数(nonce)。
矿工的任务是改变随机数(nonce)的值,然后对整个区块头进行哈希运算(比特币使用的是SHA-256哈希算法),以生成一个新的哈希值。这个新的哈希值必须小于或等于网络当前的难度目标值。
SHA-256哈希值是固定有256位的二进制数,可以表达2^256个数,最小的数是256个0(组成的数),最大的数是256个1(组成的数)。难度目标,是这2^256个数之间的某一个数,它定义了有效哈希值的上限,即有效哈希值必须小于或等于这个数值才能被网络接受。
![](https://www.fxtjz.com/wp-content/uploads/2024/02/image-2.png)
比特币网络每2016个区块(大约每两周)会自动调整一次“难度目标”。这个调整基于过去2016个区块生成所需时间与20160分钟(两周时间)的比较。如果生成时间小于20160分钟,难度会上升;如果大于20160分钟,难度会下降。这个调整机制会让生产速度近似于“每2周(20160分钟)生产2016个区块(即每10分钟生产1个区块)”。具体的调整方法:调整这个阈值的排位,阈值约小,意味着挖掘难度越大;阈值越大,挖掘难度越小。
四、挖矿成功,创建新区块,全网广播
当矿工找到一个满足条件的nonce值,使得区块头的哈希值小于或等于难度目标时,他们就可以宣布挖矿成功,并将这个区块广播到比特币网络。其他节点(矿工)将验证这个区块的有效性,一旦确认无误,这个区块就会被添加到区块链上,矿工也将获得一定数量的比特币作为奖励,这个奖励包括新创建的比特币(区块奖励)和区块内所有交易的手续费。
五、其他节点更新区块链,更新内存池
其他节点接收到这个区块后会验证其正确性。验证成功后,其他节点将这个区块添加到自己的区块链副本上,并更新它们的内存池,移除已被确认的交易。
为什么其他节点在收到这条广播的时候,会“心甘情愿”地认可和更新自己的区块链呢?
这是因为比特币协议的存在。比特币协议在比特币的创始白皮书中被描述,并在比特币软件实现中被编程实现。因此,它是由比特币的创始人中本聪设置的,并且被整个比特币社区所接受。因此,比特币协议是比特币网络所有节点最初达成的共识,不是由某一个个体或者实体决定的,而是通过去中心化网络中的每个节点执行相同的软件规则来维护的。
比特币协议,包含了网络中的节点遵循“最长链原则”(也可被称为“最长有效链原则”或“最重链原则”)的规则。在比特币网络中,如果出现了两个或者更多的不同的链条,网络中的节点将认可拥有最大累积工作量证明的链条,这通常也是最长的链条。
当矿工几乎在同一时间挖出新的区块,或者由于网络延迟原因,不同的区块可能同时被广播到网络中,导致区块链出现暂时性分叉(fork)。在这种情况下,不同的节点可能会看到不同的区块链版本。按照比特币协议的规则,矿工会继续在他们认为最长的链上挖矿,而当新的区块被挖出并加入到其中一个分支上时,这个链会变得更长,网络中的其他节点会接受这个更长的链为有效链,从而放弃在较短链上的挖矿工作。
“最长链原则”作为比特币网络中的共识,使得网络对于恶意攻击者进行的双重支付攻击或者历史重写攻击具有很高的抵抗力。