学习视频来源:https://www.bilibili.com/video/BV1Vt411X7JF/?p=6
本博客除了包含自己的在学习过程中记录的笔记外,还包含少部分自己扩展的内容,如有错误,敬请指正。
文章目录
- [1. 比特币网络](#1. 比特币网络)
-
- [1.1 节点加入和离开](#1.1 节点加入和离开)
- [1.2 工作流程](#1.2 工作流程)
- [2. 交易池](#2. 交易池)
-
- [2.1 交易池维护](#2.1 交易池维护)
- [2.2 防止double spending](#2.2 防止double spending)
- [3. 区块传播](#3. 区块传播)
- [4. 尽最大努力交付](#4. 尽最大努力交付)
1. 比特币网络
比特币系统上层应用层运行的是比特币协议,下层是网络层运行的是P2P协议。比特币网络是由成千上万自愿运行比特币节点的参与者共同维护,不依赖任何中央服务器、机构或中介,而且它不像其他有些P2P网络具有超级节点或主节点。在比特币网络中,每个节点都是平等的,可以自由加入和退出。
1.1 节点加入和离开
一个节点想要加入比特币网络,至少需要1个种子节点与之通信。比特币节点使用 TCP 协议并通过主动发起出站连接的方式与种子节点或其他对等节点通信。由于绝大多数防火墙和 NAT 设备默认允许内部主机向外发起TCP连接,因此节点无需特殊配置即可加入网络、同步数据。
离开的时候退出节点的应用程序就行,不用通知其他节点,其他节点一段时间没有收到这个节点的消息,就会把这个节点邻居集合中删掉。
1.2 工作流程
比特币的网络设计原则是简单、鲁棒、而不是高效。每个节点都会维护自己邻居节点的集合,消息在网络以"泛洪式"传播:节点第一次收到某消息时,把它传播给邻居节点,同时记录这个节点已经收到过了,下次再收到这个消息时,不再传播给邻居节点。
邻居节点选取是随机的,不考虑底层的实际拓扑结构。比如在美国加利福利亚的节点,它选取的邻居节点可能是阿根廷的,这样做是为了增强鲁棒性,但牺牲了效率。比如你向身边人转账和向美国转账,速度是差不多的。
2. 交易池
2.1 交易池维护
在比特币系统中,每个全节点都需要维护一个等待被写入区块链的交易集合------交易池(mempool),它通常在本地内存中。当节点第一次接收到一笔新的交易时,它首先会对该交易进行一系列合法性验证,包括但不限于:
- 签名验证:确保交易是由相关UTXO的所有者签名。
- UTXO检查:确认该交易引用的输入(即UTXO)确实存在且未被花费。
- 防止double spending:保证这笔交易不会与当前交易池中的其他交易发生冲突(即尝试花费同一个UTXO)。
- 手续费检查:确保交易包含足够的手续费以激励矿工将其打包进区块。
只有当所有验证都通过后,这笔交易才会被加入到交易池,并进一步转发给相邻节点 。一旦某笔交易已经被某个节点接收并验证过,后续再次接收到相同的交易时,该节点将不再转发此交易,以此避免不必要的网络流量和潜在的无限传播问题。因此,交易池仅包含那些当前合法但尚未上链的交易。
2.2 防止double spending
假设用户A使用同一笔UTXO构造了两笔不同的交易TxB和TxC,分别向B和C转账1个比特币。这两笔交易在网络中传播时,由于节点位置、网络延迟等因素的影响,不同节点可能会先后接收到这两笔交易。如果TxB先被矿工打包并写入区块链,那么:
- 对于已经接收到TxC的节点,在检测到TxB上链后,会立即将TxC从交易池中移除,因为它试图花费已被TxB使用的UTXO。
- 同样地,TxB本身也会从所有节点的交易池中删除,因为它已经成功上链,不再需要等待打包。
3. 区块传播
区块的传播方式与交易类似,但涉及更多的数据量和更复杂的验证过程。每当一个新的区块生成,它会被广播至整个比特币网络。每个节点在接收到新区块后,不仅要验证区块内部的内容(如交易的有效性),还需确认该区块是否属于最长合法链的一部分。
考虑到较大的区块在网络上传播所需的时间相对较长,所以比特币限制每个区块的最大大小为1MB,尽管如此,新发布的区块仍需要在几秒到几十秒内才能传播至大多数节点,这对于实时交易确认来说可能显得较慢。
4. 尽最大努力交付
比特币网络采用的是**尽最大努力交付(best effort delivery)**的方式。这意味着:
- 发起的交易并不一定能被所有节点接收到;
- 接收顺序可能不一致;
- 存在恶意节点故意不转发或转发无效交易的可能性。
这种机制虽然提高了系统的灵活性和容错能力,但也带来了潜在的风险,比如部分节点可能因为未能及时接收到最新的区块或交易而暂时处于不一致状态。不过,随着时间推移及更多区块的添加,这些差异通常能够自行解决,从而恢复全局一致性。