区块链安全—详谈共识攻击(一)
字数 1930 2025-08-22 18:37:15
区块链共识算法及其安全分析
前言
区块链作为一种去中心化的分布式公共数据库,通过分布式节点共同利用密码学协议维护系统,而不依赖中央管理机构。节点间通过底层共识协议保证账本一致性。区块链可分为公有链和许可链,不同应用场景使用不同的共识算法,其安全性也有所区别。
一、共识安全模型分析
区块链本质是分布式系统,不同共识模型在不同环境下能容忍的错误类型与数量不同。
1. 同步模型
- 要求发送方与接收方类似面对面应答
- 消息延迟时间Δt是确定的
- 算法执行时间也是确定的
- 现实中不存在,仅作为理论假设
- 如果在同步模型下无解,异步模型下更无解
2. 异步模型
- 消息延迟时间Δt不确定,可以是任意长时间
- 程序可能因等待消息而阻塞
- 无法区分消息延迟与节点宕机
- 保证安全性但牺牲系统灵活性
3. 半同步/半异步模型
- 结合同步和异步模型的优点
- 设计最长超时限制tmax
- 超过tmax未收到消息则判定节点宕机
二、PoW共识算法
工作量证明(Proof of Work)机制由Nakamoto提出,作为比特币系统的共识机制,通过计算能力寻找特定数字使区块满足要求。
PoW工作原理
- 每个节点需要完整本地账本
- 节点通过算力竞争记账权
- 比特币约每10分钟一轮算力竞赛
- 胜者获得记账权并同步新增账本
PoW示例
给定字符串"blockchain",连接nonce随机数(32位)后进行SHA256哈希运算,要求结果以若干0开头:
blockchain1 → 4bfb943cba9fb9926df93f33c17d64b378d56714e8a29c6ba8bdc9690cea8e27
blockchain2 → 01181212a283e760929f6b1628d903127c65e6fb5a9ad7fe94b790e699269221
...
blockchain515 → 0074448bea8027bebd6333d3aa12fd11641e051911c5bab661a9b849b83958a7
blockchain2688 → 0009b257eb8cf9eba179ab2be74d446fa1c59f0adfa8814260f52ae0016dd50f
blockchain48851 → 00000b3d96b4db1a976d3a69829aabef8bafa35ab5871e084211a16d3a4f385c
blockchain6200969 → 000000db7fa334aef754b51792cff6c880cd286c5f490d5cf73f658d9576d424
PoW算法流程
区块表示为三元组B=(h',tx,nonce),其中:
- h':前一个区块哈希
- tx:交易记录
- nonce:32位整数
系统设定难度值D,定义哈希值前导0数量:
系统输入: tx、nonce、D
PoW过程:
1: nonce = 1(初值)
2: while(H(nonce,tx,h') >= D):
3: nonce++
4: Broadcast(<nonce,tx,h'>) //广播计算的值
5: end
三、PoW攻击详解
1. 双花攻击(Double Spending)
同一货币被花费多次。
传统解决方案
- 银行作为第三方按顺序处理交易
- 第一笔处理后,第二笔自然失败
区块链解决方案
- 交易广播与验证:
- 交易信息哈希加密并用私钥签名
- 其他用户用公钥验证
- 记账权竞争机制使攻击代价巨大
- 交易确认时间长导致可能实现双花
区块链防御措施
- 检查比特币状态,已花费则拒绝交易
- 交易确认前发起矛盾交易会被矿工拒绝
2. 51%攻击
PoW允许存在多条分叉链,最长链被认为是主链。
攻击过程
- 攻击者向一半网络广播交易A,另一半广播交易B
- 两边矿工几乎同时取得记账权,导致分叉
- 攻击者在A分支确认后争取连续记账权使B分支变长
- A分支被舍弃,交易无效但已获得商品
攻击概率
- 掌握1%算力:连续两次记账概率10^-4
- 6次确认后交付商品可大幅降低风险
- 掌握51%算力:成功6区块攻击概率约0.018
3. 自私挖矿(Selfish Mining)
矿工维护公开和私密两条链:
- 挖到区块后不广播,添加到私密链
- 提前计算下一个区块
- 即使当前区块被他人发布,也可公布自己的区块
- 诚实矿工可能选择支持攻击者分叉
特点:
- 仅对PoW有效
- 利用网络传播时延
四、PoS与DPoS共识算法
1. PoS(股权证明)算法
用股权代替计算资源选举领导人,避免算力竞争。
Peercoin实现
- 币龄(coins * age)影响挖矿难度
- 计算公式:success = <coins * age * target>
- proofHash < success时挖矿成功
算法流程:
系统输入: tx、nonce、D
PoS过程:
1: nonce = 1(初值)
2: coins ← accountBalance
3: age ← currentTime - lastTransactionTime //币龄
4: while(H(nonce,tx,h') >= coins * age * D):
5: nonce++
6: Broadcast(<nonce,tx,h'>) //广播计算的值
7: end
问题
- 长期持有大量资产导致"贫富不均"
- 仍需哈希计算,浪费资源
2. DPoS(委托股权证明)算法
由Bitshares提出,用户分为:
- 见证人(witnesses):处理交易,维护区块链
- 代表(delegates):发起更新请求(无报酬)
- 工人(workers):提出项目想法(投票支持可获得收益)
见证人选举
- 只有永久节点可被选举
- 前N名见证人需获50%以上票数
- 定期重新选举
见证人出块
- 每生产一个块获得报酬
- 未生产区块则无收入,可能失去身份
- 每2秒生产一个区块,超时则转交权利
- 用户监控区块链,选择最长链追加
五、确定性共识算法攻击
1. 重放攻击(Replay Attacks)
一条链上的交易在另一条链上也合法。
原因
- 硬分叉后两条链地址、私钥算法和交易格式相同
- 导致交易可被重放确认
防御措施
- UTXO模型:检查交易Hash是否存在
- Balance模型:使用随机数NONCE防止重放
- 传统方法:
- 添加时间戳
- 挑战响应机制
2. 权利压迫攻击
攻击者利用记账权使系统随机数产生偏移,增加下次获得记账权的概率。
方式
- 通过参数组合增加被选概率
- 利用当前区块控制力影响下一区块
防御措施
- 要求验证者抵押资产
- 避免使用易操控信息产生随机数
六、参考资料
- 共识算法基础介绍
- PoW与PoS比较分析
- 区块链安全攻击类型
- 数字货币共识机制发展