比特币与区块链学习笔记(三) 比特币的挖矿和安全
文章目录
比特币的挖矿
节点函数
一个比特币节点是一堆函数组成的集合,包括
- routing 路由
- 区块链数据库
- 挖矿
- 钱包
其中routing来运行比特币的P2P协议
区块链则是保持更新的区块链的拷贝
挖矿则是在通过解PoW(上一篇里面的工作量验证)来添加新的区块
钱包嘛,顾名思义提供钱包服务
全节点:
- 有整个区块链的复制
- 不需要外部参考就可以验证交易
轻节点
- 有限资源的设备,比如智能手机和平板
- 通过全节点连接到比特币网络上
- 下载block headers而不是整个区块链
- 使用simplified payment verification (SPV) 来验证交易
Simplified payment verification (SPV)
SPV,顾名思义比较简单,是为了让没有把整个区块链下载下来的设备完成交易验证的。
需要做的是1
- 保留一份最长工作量证明链的区块头数据副本
- 获取这条链的方式是通过不断查询网络节点直到确信拿到的是最长链,并获得Merkle树枝,将这笔交易与这笔交易加上时间戳后纳入的区块联系起来。
- 用户无法自己检查交易,而是通过将其连接到链上的一个位置来完成检查。他可以看到一个网络节点接受了这笔交易,并且其后的区块进一步确认了整个网络也接受了这笔交易。
挖矿
目的:
- 不重新创造比特币
- 实现去中心化安全的机制
加密货币的通货紧缩
- 每当一个block被mined,一个新的比特币就产生了
- 比特币的数量是几何式减小的。
- 最初的4年内,每个block产生50个新的bitcoin
- 比特币的总数是21,000,000
挖矿的过程
Full blockchain
- 下载并保持整个比特币区块链
- 独立的验证交易
- 将valid但是unconfirmed的交易放入memory pool
- 将交易加入到blocks里
- block的第一笔交易是特殊的,称之为 coinbase transaction,包含了挖矿的奖励
- coinbase transaction有一个input —— coinbase,和一个output ——payable to the miner’s address
- block包括了应该支付的费用
- 建立block header
- 算Merkle Tree
- 计算前面block header 的hash
- 根据PoW计算随机数
- 广播新的block
- 其他节点将独立验证新的block
分叉: 通常发生在两个或更多的blocks几乎在同时被mine,或者被attack。
矿池
就是好多个miner一起挖,矿工们提交shares给矿池的管理者,然后按照这个来分配reward
(按挖矿分红的感觉)
安全
欸说回上次提到的双花攻击啥的了
Double spending problem 双花攻击
-
Race 攻击:
- 向一个merchant发送一个交易并直接支付
- 发送一个相同花费冲突的交易给剩余的网络
-
Fineey 攻击:
- 在自己的block整一个给自己发钱的交易
- 将相同的货币发送给merchant来买点啥
- 当merchant接受支付的时候广播block
防御方法
用户等到收到足够的confirmation完了再交易
一般来讲6个confirmation就够了
假设案例
假设攻击者想要比honest chain更快的产生一个chain,假设
- z:在z个confirmation后交易被接受
- p:honest node发现下一个block的概率
- q:攻击者发现下一个block的概率
- mined blocks的数量服从泊松分布
- λ \lambda λ :honest nodes挖z个block时攻击者平均挖到的数量
有 p + q = 1 , λ = z q p p+q = 1,\lambda = z\frac{q}{p} p+q=1,λ=zpq
则攻击者能够从 m 个block后跟上honest node 的概率是
q m = { 1 , i f m < 0 o r p ≤ q ( q p ) m , i f m ≥ 0 a n d p > q q_m = \begin{cases}1,~&if~m<0 ~or~p\le q\\(\frac{q}{p})^m ,~&if~~m\ge 0~~and~~p>q\end{cases} qm={1, (pq)m, if m<0 or p≤qif m≥0 and p>q
一个攻击者能够改变chain的概率是
P
=
∑
k
=
0
∞
λ
k
e
−
λ
k
!
⋅
q
z
−
k
P = \mathop{\sum}\limits_{k=0}^\infty \frac{\lambda ^k e^{-\lambda}}{k!}\cdot q_{z-k}
P=k=0∑∞k!λke−λ⋅qz−k
总之概率挺小的
对mining pools的攻击
Pool Hopping 跳池攻击
通过在pool直接的切换来提高总的reward
比如说
Sabotage Attack 破坏攻击
恶意矿工不以盈利为目的,而单纯想要对比特币造成破坏的攻击行为。
只提交near valid的blocks,但是拒绝 valid blocks
Lie-in-wait Attack
假装在wait吗
这个矿工在几个mining pools里挖矿
当他发现一个block以后
- 拒绝这个block
- 把他所有的采矿能力都引向找到这个block的pool
- 在一段时间后提交block,然后重新进入等待
自私挖矿
当一个矿工发现一个新的block的时候,他自己留着,让其他honest的矿工们认为自己在最长链上。
但是他自己接着挖他自己的链。
如果有别的honest发现block了,他就把他的更多的secret blocks广播,这样他就是链子最长了。