【区块链笔记】BTC_挖矿(06)
这篇文章简单的整理了比特币挖矿
相关的内容。
1.挖矿难度
比特币的难度是每过2016块改变一次,平均10分钟出一块。
2016 * 10 / 60 * 24 = 14天。调整一次难度
挖矿难度是通过如下公式调整的。
Hash(bolck header) <= target (目标target是一个256位长的数值。)
计算公式:difficulty = difficulty_1_target / current_target
newdiff = diff * (2016 * 10 * 60 )/R
newdiff: 新的难度调整值
diff: 上次难度调整结果
(2016*10*60): 每10分钟产生一个区块,两周时间产生区块数=2016,
R: 本次难度调整的2016个出快实际用时
难度 = 创世块hash/当前难度hash
而创始区块的难度是写死的。hash:0x1d00ffff
genesis = CreateGenesisBlock(1296688602, 414098458, 0x1d00ffff, 1, 50 * COIN);
为了防止难度调整幅度异常,代码中做了调整不能大于或小于4倍的限制
。
难度调整是在各节点自己做计算。
那为什么调整挖矿难度?
因为系统逐渐的完善,参与的节点会越多,算力也会上涨。
如果不调整难度,出块速度会变得很快。
新出的块跟其他节点分享数据达到共识是需要几十秒时间的,
如果这期间又出新快,会出现很多临时分叉,这种临时分叉为常态的话,
很容易分散诚实节点的算力,这时恶意节点集中算力攻击,有可能只需10+%算力就可以达到最长链。
所以需要通过难度控制出块时间,因算力的提高减少出块时间会有极大的安全隐患。
2.挖矿过程
挖矿是通过密码学
和共识机制
保证安全。
比如加密信息是代表你的身份,那共识机制是整个系统之间的约定。
你的身份不能造假,整个系统保证不乱发钱,才能确保整个比特币系统的稳定和安全。
2.1 全节点
- 一直在线
- 在本地硬盘上维护完整的区块链信息
- 在内存里维护UTXO集合,以便快速检验交易的正确性
- 监听比特币网络上的交易信息,验证每个交易的合法性
- 决定哪些交易会被打包在区块里
- 监听别的矿工挖出来的区块,验证其合法性
- 挖矿并且可以决定挖矿的方向:最长链方向,如果出现等长的分叉时,选择最先监听到的那一条分叉
每出一个区块,全节点接受新的区块时都做如下3个验证:
- 每个交易的合法性,包括coinbase,
- 挖矿难度,目标预值等等…
- 是不是衍生了最长链。
2.2 轻节点
- 不是一直在线
- 不用保存全部整个区块链,只要保存每个区块的块头
- 不用保存全部交易,只保存与自己相关的交易
- 无法检验大多数交易的合法性,只能检验与自己相关的那些交易的合法性
- 无法检测网上发布的区块的正确性
- 可以验证挖矿的难度(即检测你发布的区块是否符合难度要求)
- 只能检测哪个是最长链,不知道哪个是最长合法链
2.3 挖矿方法
如果矿机接收到别的节点的出块信息,就应该停止当前区块的计算,重新组装块身,挖新矿。
比特币的mining puzzle是哈希算法,
刚开始的CPU、到中期的GPU、到现在的ASIC。
比特币的挖矿速度和硬件越来越往专业化方向。
这根起初每个人都参与挖矿的理念有所差异了。
通常的矿机都是ASIC,高度并行化的专用芯片。
但是ASIC制作成本高、研发周期长,设计一款挖矿通常需要一年时间,投入巨大。
而矿机的淘汰速度很快,过一段时间就有更好的矿机问世,老款矿机就会因电费的原因被淘汰。
2.4 矿池
挖矿越来越专业,慢慢的出现的大型矿池。
矿池维护一个全节点,管理很多矿机,矿主们只提供算力,
大家一起分配coinbase和区块打包奖励。
那矿工能不能挖到矿后,不提交私吞?
这是不可能的,因为任务是由矿主分配,当算去区块时区块的coinbase的收货人是矿主本人。
如果自己擅自串改,挖矿就跟自己一个人挖矿是没区别了。
有没有可能捣乱?
我挖矿也不提交,这是有可能的,因为矿池之间竞争也很激烈,
有可能相互派过去卧底捣乱。
如果一个矿池的算力打到一定的程度后,能做以下攻击,影响比特币系统的稳定性。
1.分叉攻击
当矿池的算力达到51%,就可以进行硬分叉,追赶最长链。
废除之前的交易。 这样的攻击一旦形成,比特币整个系统的信任度会崩溃。
2.Boycott
针对某个账号不打包交易。恶意的封杀某个账户。只要有这个账户的信息直接硬分叉。
会影响其他诚实矿工也是为了减少损失一起针对此账号,不打包的行为。
欢迎大家的意见和交流
email: li_mingxie@163.com