区块链入门第二课:BTC的协议、实现、网络、挖矿难度

1.BTC协议

        比特币协议是一套技术规则,定义了比特币网络如何运作,包括交易的创建、验证和共识机制。它基于密码学和分布式系统,确保去中心化、安全性和不可篡改性。

1.1.双花攻击(double spending attack)

1.1.1.定义

        双花是指同一笔比特币被多次花费的行为,这是传统数字货币面临的核心问题之一。

1.1.2.比特币如何解决双花

        比特币采用UTXO(详见2 BTC实现)模型,每笔交易都会消耗之前的UTXO,并生成新的UTXO。因此,一旦某个UTXO被用于交易,它就不能再次被使用。比特币网络中的节点会验证交易是否引用了有效且未花费的UTXO,若UTXO已被花费,则交易无效,双花攻击无法成功。

        例如,A拥有一个包含5 BTC的UTXO,并将其全部发送给B,该UTXO被标记为已花费,新的UTXO由B持有。此时,如果A试图再用这5 BTC进行另一笔交易,例如转给C,节点会检查A是否仍有可用的UTXO。如果没有足够的UTXO,交易将被拒绝。

1.2.交易机制

1.2.1.交易结构

        输入(Inputs):引用之前的未花费交易输出(UTXO),证明你有权花费这些比特币。

        输出(Outputs):指定比特币的接收地址和金额。

        签名:使用私钥对交易签名,确保只有比特币的拥有者可以发起交易。

1.2.2.交易流程

        用户创建交易并用私钥签名 -> 交易被广播到比特币网络 -> 节点验证交易的合法性(签名有效、输入未被双花等)-> 矿工将交易打包进一个新区块,通过PoW添加到区块链 -> 交易确认后,接收方可以看到比特币到达。

1.3.轻节点(light node)和全节点(full node)

1.3.1.全节点(Full Node)

  • 存储整个区块链的完整副本(截至2025年3月,已超过500GB)。
  • 独立验证所有交易和区块的合法性,遵循协议规则。
  • 增强网络的安全性和去中心化,但需要较高的存储和带宽。

1.3.2.轻节点(Light Node)

  • 也称为SPV节点(简单支付验证,Simplified Payment Verification)。
  • 只下载区块头(约80字节/区块),不存储完整交易数据。
  • 依赖全节点提供相关交易信息来验证支付。
  • 优点是占用资源少,适合移动设备;缺点是安全性较低,依赖其他节点。

1.3.3.轻节点与全节点对比

  • 全节点对网络健康至关重要,轻节点则更注重便捷性。
  • 轻节点通过检查区块头中的Merkle根验证交易,确认其是否在链上。

1.4.比特币共识(Cousensus in BitCoin)

1.4.1.定义

比特币共识是网络中所有节点就区块链的状态(哪些交易有效)达成一致的机制。

1.4.2.核心机制

  • 工作量证明(PoW):矿工通过算力竞争,解决数学难题以生成新区块。
  • 最长合法链规则:节点始终接受工作量最大的合法链(见1.5)。
  • 共识规则:交易必须符合协议(如签名有效、无双花);区块必须满足难度目标,且包含有效的前区块哈希;每2016个区块调整一次难度,确保出块时间稳定在10分钟。
  • 去中心化特性:没有中央权威,共识由全球节点共同维护。
  • 分叉处理:如果网络出现临时分叉(如两个矿工同时挖到区块),节点会选择最长链,分叉的短链将被丢弃。

1.5.最长合法链(longest valid chain)

1.5.1.定义

        最长合法链是指累积工作量(Proof of Work)最多的区块链,且符合所有协议规则。

1.5.2.作用

  • 解决分叉问题:当网络出现竞争链时,节点选择最长链作为主链。
  • 防止篡改:攻击者若想修改历史交易,需重新计算从目标区块到当前高度的所有工作量,并超过现有链的增长速度。

1.5.3.工作原理

        每个区块的头部包含前一区块的哈希,形成链式结构。

1.5.4.实际案例

        如果一个矿工挖到一个区块,但另一个矿工随后挖出一条更长的链,网络会切换到更长链,短链的区块成为“孤块”(Orphan Block),这也是为什么建议等待6个确认,以确保交易所在链足够稳定。



2.BTC实现

 2.1.UTXO(Unspent Transaction Output,未花费交易输出)

        UTXO(Unspent Transaction Output,未花费交易输出)是比特币交易模型的核心概念。它代表的是某个地址收到但尚未被使用(花费)的比特币。

比特币交易的本质是:消耗(花费)已有的UTXO,生成新的UTXO。

假设A拥有一个5 BTC的UTXO,现在A要转账3 BTC给B,交易过程如下:

输入(Input):A使用这个5 BTC的UTXO进行交易(必须全部使用)

输出(Output):B收到3 BTC(一个新的UTXO,属于B),A自己找零2 BTC(另一个新的UTXO,属于A)

结果:原来的5 BTC UTXO被销毁,生成两个新的UTXO:B的3 BTC 和 A的2 BTC。

交易前:
A: [ 5 BTC ]  (未花费的 UTXO)

交易过程:
输入(Input): A 使用 5 BTC 的 UTXO
输出(Output): B 获得 3 BTC(新 UTXO)
                 A 获得 2 BTC(找零,生成新 UTXO)

交易后:
原有的UTXO被消耗(销毁)
B: [ 3 BTC ]  (新 UTXO)
A: [ 2 BTC ]  (找零的新 UTXO)



UTXO模型示意图:

  ┌──────────┐
  │  A: 5 BTC  │  (UTXO,未花费)
  └────┬─────┘
       │ 交易(转账 3 BTC)
       ▼
  ┌──────────┐      ┌──────────┐
  │  B: 3 BTC  │      │  A: 2 BTC  │
  └──────────┘      └──────────┘
     (新UTXO)          (找零UTXO)

2.2.基于交易的账本(transaction-based ledger )和基于账户的账本(account-based ledger)

        比特币采用基于交易的账本(UTXO模型),而传统加密货币(如以太坊)使用基于账户的账本。以下是两者的对比和补充:

2.2.1基于交易的账本(UTXO)

工作方式

  • 账本记录所有交易的历史,状态通过UTXO集计算。
  • 每次交易消耗旧UTXO,生成新UTXO,类似于现金交易。

特点

  • 状态分散:余额不是直接存储在账户中,而是通过UTXO集动态计算。
  • 隐私性:UTXO不直接关联身份,分析复杂但可能通过链上数据追踪。
  • 验证效率:并行验证不同UTXO,适合轻节点(SPV)通过Merkle证明检查。

2.2.2.基于账户的账本(Account-based Ledger)

工作方式

  • 账本记录每个账户的当前余额和状态,类似银行账户。
  • 每次交易直接更新账户余额,无需生成新“零钱”。

特点

  • 状态集中:账户余额直接存储,查询简单。
  • 灵活性:适合动态状态(如以太坊的智能合约),支持复杂的计算逻辑。
  • 验证效率:需要全局状态同步,验证依赖完整节点。

3.BTC网络

        简单、智能,但效率不高。

3.1.定义

        比特币网络(Bitcoin Network)是比特币协议运行的基础,基于去中心化的点对点(P2P)架构,确保比特币的交易验证、区块生成以及数据同步。

3.2.P2P网络

  • 去中心化:比特币网络没有中央服务器,而是由全球范围内的节点(Nodes)组成。这些节点通过互联网互联,共同维护区块链。
  • 点对点通信:节点之间直接交换数据,无需中介。每个节点都可以扮演多种角色(如运行完整节点、矿工节点或轻节点)。
  • 拓扑结构:网络采用“Gossip Protocol”(流言协议),节点通过随机连接传播信息,确保数据快速扩散。

3.3.网络工作流程

3.3.1.交易广播

  • 用户发起比特币交易,交易通过私钥签名并广播到网络。
  • 邻近节点接收交易后进行初步验证(签名有效、无双花),然后转发给其他节点。
  • 交易进入内存池(Mempool),等待矿工打包。

3.3.2. 区块生成

  • 矿工从内存池中选择交易,组成候选区块。
  • 通过PoW算法(SHA-256哈希计算)寻找一个符合难度目标的Nonce。
  • 成功后,矿工广播新区块,网络节点验证其合法性。

3.1.特性

        Flooding协议,Flooding是一种广播协议,其中一个节点接收到数据后,会将其转发给所有相邻节点(除了发送该数据的节点)。这个过程重复进行,直到数据到达网络中的所有节点或达到某种终止条件。

3.1.1.简单性 (Simple)
  • 解释:Flooding的实现非常直观,无需复杂的路由算法或拓扑维护。节点只需将数据发送给所有邻居,无需了解网络的全局结构。
  • 优点:易于实现,适合去中心化的比特币网络,因为每个节点只需遵循简单规则即可参与数据传播。
  • 例子:当一个用户广播一笔交易,初始节点将其发送给所有连接的节点,这些节点再继续转发。
3.1.2.健壮性 (Robust)
  • 解释:由于数据被广泛传播,即使某些节点宕机或网络出现局部故障,数据仍可能通过其他路径到达大部分节点。比特币网络的去中心化特性增强了这一优势。
  • 优点:高容错性,抵御单点故障或攻击(如DDoS)。只要网络中仍有足够节点在线,信息传播不会中断。
  • 例子:如果一个矿工节点掉线,其邻居节点仍会将新区块广播给其他节点,确保网络同步。
3.3.3.效率低下 (Not Efficient)
  • 解释:Flooding会导致大量冗余数据传输。每个节点都会重复发送数据,可能多次到达同一节点,浪费带宽和计算资源。
  • 缺点
    • 带宽浪费:同一数据可能通过不同路径多次到达一个节点。
    • 延迟问题:数据传播到整个网络需要时间,尤其在节点数量庞大时。
    • 资源消耗:对低带宽或资源有限的节点(如轻节点)造成负担。
  • 例子:一个交易可能被同一个节点接收多次,导致内存池(Mempool)中出现冗余条目。



4.挖矿难度

        比特币挖矿难度(Bitcoin Mining Difficulty)是比特币网络中衡量生成新区块所需计算难度的一个关键指标。它通过调整目标哈希值(Target Hash)的难度,确保区块链保持约10分钟一个区块的稳定出块率

4.1.定义

  • 挖矿难度表示矿工通过工作量证明(Proof of Work, PoW)算法找到一个有效哈希值所需计算量的多少。
  • 有效哈希值必须小于或等于当前网络设定的目标值(Target),目标值越小,难度越高。
  • 难度通过公式计算:
    难度 = 初始目标值 / 当前目标值
    初始目标值是比特币协议中定义的基准(难度为1时的值),当前目标值会根据网络算力动态调整

4.2.调整机制

  • 调整周期:每2016个区块(约每两周)进行一次难度调整,称为“难度纪元”(Difficulty Epoch)。
  • 调整原则:基于前2016个区块的实际出块时间与理想时间(20160分钟,即2016 × 10分钟)的比值:
    • 如果出块时间少于10分钟,难度增加(目标值变小)。
    • 如果出块时间多于10分钟,难度减少(目标值变大)。
    • 为避免剧烈波动,调整幅度限制在±4倍(最大增加300%,最大减少75%)。

4.3.目标阈值

        目标阈值(Target):一个256位的整数,表示哈希值必须小于或等于的阈值。

4.3.1. 目标阈值与挖矿的关系

        在比特币网络中,矿工通过计算区块头的SHA-256哈希值来生成新区块。挖矿的目标是找到一个哈希值,使得:Block Hash≤Target

 4.3.2. 挖矿难度计算公式       

4.3.3.目标阈值计算公式

4.3.4.计算示例

计算示例:

假设前2016个区块用了12天(比14天快,那么需要增加挖矿难度)

实际时间(Actual Time):       12×24×60×60 = 1036800秒

理想时间(Expected Time):  14×24×60×60 = 1209600秒

调整系数:1036800÷1209600 ≈ 0.857

新目标值(New Target): 旧目标值(Old Target)× 0.857   (目标值变小)

新挖矿难度(next_difficulty):旧挖矿难度(previous_difficulty) ÷ 0.857 (难度增大)


5.本课提问

5.1.如何防止双花(双重支出攻击)?

5.2.如果有一笔交易为 A 转给 B 5个BTC,是一个合法的交易,此时若有另外一个交易 B' 使使用本身的公钥说是 A 的公钥,然后用 B' 本身的私钥对交易进行签名,是否可以成功写入区块?

5.3.轻节点为什么不能验证交易是否合法?

5.4.为什么只保存块头(block header)而不需要验证块身(block body)就可以知道数据有没有被篡改?

5.5.比特币验证区块是否合法过程中,为什么不能是超过50%的节点投票认为区块合法就可以将区块写入区块链网络?(女巫攻击)

5.6.发布区块的节点为什么要打包其他人的交易信息,发布区块的节点有什么好处?

5.7.内存池中,如果同时收到A转给B 5个BTC和A转给C 5个BTC(币的来源相同),这两笔交易写进内存池的结果是怎么样的?

5.8.挖矿难度为什么需要调整?

5.9.假设前2016个区块用了15天,挖矿难度应该增加还是减少?新目标值计算结果是多少?