比特币的挖矿

1 挖矿的特点

  • 无记忆性:每一次挖矿的时间都是独立的,就是说在挖矿的过程中突然监听到新的区块已经成功发布了。
  • 安全性:密码学的签名保证了安全,地址不是直接是公钥,是公钥的hash值。
  • 匿名性:账户其实就是公私钥对,只要不花钱基本上就没有途径猜出是谁。

2 挖矿的工具

  • 挖矿的工具演变过程:CPU→GPU→ASIC芯片
  • 挖矿工具的趋势:专业化,效益最大化,只能用于某一种货币,同时伴随着矿机的时效性短。

2019年11月19日更新:

在不断的学习后我思考一个问题,一直往避免算力中心化,例如以太坊是memory hard的目的是达到ASIC resistance的状态,那么就说想让普通电脑都有机会挖矿,就是说挖矿整体成本降低了,但是另一方来讲是不是发动攻击的成本也降低了呢?我直接可以用服务器挖矿,我也不用直接买矿机挖矿了,这样会不会变得更不安全?

3 矿池

3.1 矿池的定义

一个全结点驱动很多其他矿机,一个矿主(pool manager)监听网上交易,负责打包出区块,然后作为任务分配者,把计算nonce值的任务分配给矿工(miner)同时监听有没有新结点抢先发布区块。miner计算nonce,miner根据和矿主的通信协议进行通信,当挖出矿后共享区块奖励。矿主可以从中抽取管理费和交易费达到矿池的正常运营。

3.2 矿池的优点

因为单个矿工的算力不强,通过合作,解决收入不稳定的难题,有了收益一起分配。

3.3 收益分配的难题

因为每一个人都可以有挖矿的分配,既然做多做少都会有费用,在某种程度上会限制了矿工的积极性,矿工可以偷懒,不去挖矿只是收取区块奖励。所以就要有一个工作量的证明,矿主就会降低挖矿的难度,增大阈值target,每当一个矿工达到该阈值范围内就可以提交给矿主作为信用凭证,降低挖矿难度挖到一个结果称为share,最接近的值的区块作为工作量凭证,但是share没有真正的用途,仅仅是记录每个矿工有多少个share对最后的奖金进行按劳分配,share值也不可能发不到区块里面,因为它并不是合法的。

3.4 矿主和矿工的矛盾

3.4.1 矿工知道矿主的目的?

矿工并不知道矿主在干什么,矿工只是负责计算hash值,所以矿主是有可能集中算力对链进行51%attack,当某一个矿池有超过半数的算力时或者说接近半数算力的话,基本上就可以满足51%attack,基本上矿工都是吃瓜群众,他不知道自己在干什么。

矿池既然有如此大的算力,那么除了51%attack还可以进行fork attack强行创造分支并且让其他交易回滚,还有可能是boycott attack,和分支不一样,他并不会等待最长链,它是尽快生成一个新的区块和另外的合法区块进行竞争,争取尽早上链,那么其他的善意结点还是会帮这一笔交易上交到合法的链上,但是攻击者会每一次都阻止这一笔合法交易上链。

3.4.2  矿工可以私自发布区块?

假如我是一个矿工,我已经找到一个合适的阈值,然后我可以私自发布区块,不提交给矿主,挖到矿我自己收,平时还可以舔到别人的区块奖励这样合法吗?不可能,矿主组装区块,收款地址是矿主的,矿工不能拿到区块奖励,取不出来钱,假如要改coinbase域中的数据改变,就算是矿工自己组装区块,因为coinbase域发生了变化,矿主是不会认的。但是可以捣乱,挖到区块丢弃不给矿主,当然自己也会丢失区块奖励,所以矿工和矿主是利益共同体的关系。

3.4.3 矿池的缺点

  • 矿工和矿主之间的关系是透明的,矿工不知道矿主的目的。
  • 当矿池的算力接近半数的时候就有可能发动攻击,打击矿工的积极性。

4 挖矿难度

区块产出的时间都会稳定在10min左右,这相对与中心化的电商交易,简直是相差太大了。但是为了抵御fork attack,就只能在把挖矿时间边长。举一个例子,假如我是1s出一个区块,假如恶意矿工就可以在链上制造分叉并且可以延伸分叉链,使其成为最长的合法链,轻结点只能校验和自己相关的交易,并不能校验全部交易的合法性,《轻结点和全结点的区别》。会造成交易的不断回滚,善意结点会不断的分散算力。

挖矿的难度调整的公式:

next_ difficulty= previous_ difficulty*(2 weeks) / (time to mine last 2016 blocks )

每到2016个区块添加到链上大约每两周会进行一次调解挖矿的复杂度。假如此时挖出的区块时间很大

(2 weeks) / (time to mine last 2016 blocks )>0,挖矿的复杂度会降低,相对的假如(2 weeks) / (time to mine last 2016 blocks )>0那么复杂度会增大,所以挖矿的复杂度是动态变化的。挖矿难度和阈值target是成反比的,target越小难度越高,target的公式正好和difficulty的公式是相反的。

next_target=last_target * (actual_time/apected_time)
发布了46 篇原创文章 · 获赞 75 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38875300/article/details/103018556