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天,挖矿难度应该增加还是减少?新目标值计算结果是多少?