比特币
挖矿
什么是比特币
都 2020 年了,比特币这个词儿大家肯定不陌生。经过各方面的宣传炒作,比特币这个概念本身已经被赋予了很多玄乎的职能。有关比特币具体的技术细节有很多,这次我们只探讨“挖矿”相关的部分。
要想解释清楚挖矿,你首先要知道,比特币是一个去中心化的分布式自治网络。或者可以这么理解,比特币是个大型账本,还是个分布式的账本,也就是说,比特币网络上有许许多多的节点,每个节点的任务就是记账。
为什么比特币要挖矿
因为比特币是个去中心化的分布式网络,而且大家都能加入这个网络中,所以就可能存在恶意节点,这些节点就是不按规矩来捣乱的。
必须有个办法来增加捣乱的成本,让恶意节点自己觉得不值得,这样才能使整个网络正常发展下去。
比特币网络中增加捣乱成本的方案就是“挖矿”。
怎么挖矿
这里不讨论比特币是怎么做节点发现的,假设这个分布式网络已经运行起来了,节点之间可以进行消息广播。当有人想要转账,那么就需要把转账信息在节点之间进行广播,节点收到之后就会把转账信息记下来。
挖矿马上就要开始了 --- 节点刚收到转账信息(下文称为交易)后,仅仅是放在内存池里,真正想让交易生效,需要经过一系列步骤
- 先从内存池中取出一些交易,计算这些交易的 hash 值
- 将交易 hash 值与一个随机数一起进行 hash,也就是
hash(hash(交易) + 随机数)
- 判断上一步 hash 的结果的开头几位是不是有很多 0,具体要有多少个 0 是动态调整的
- 如果 0 的数量不够,则换一个随机数,不断重复尝试,直到 0 的个数足够多
- 找到随机数之后,将这个随机数与交易的 hash 值,以及交易本身,一起打包成一个数据包,称之为一个区块,把区块广播出去
- 各个节点收到后,也来拿这个随机数 hash 验证一下是不是真的有那么多 0,如果验证成功,则记录下来
这个过程一般都叫它交易打包,或者说挖出了一个区块。可以看出来这个操作是比较累的,为了不让节点白干活,在交易列表中会有一笔特殊的转账,内容就是从天而降一笔比特币,转给打包的节点。
所以挖矿是个形象的比喻,随机数尝试的过程就好比在矿坑中乱挖,运气好就能敲到矿,所以你现在知道有人说挖矿赚了多少多少是什么意思了吧。
区块链
为了增加篡改难度,前一个区块的 hash 值也需要记录在区块中,相应的碰撞随机数的算法就会改进成 hash(hash(交易) + 前一个区块的 hash + 随机数)
,
这样新的区块指向前一个区块,所有的区块看起来就串成了一个链。
如果有人想篡改区块链中的某个区块中的交易,那么交易 hash 值就会发生变化,那么原来的随机数就不能满足要求,篡改者就要重新计算随机数,整个区块的 hash 自然也会跟着改变,
由于后一个区块头里记录着前一个区块正确的 hash,所以篡改者还要把后面所有的区块都篡改了,重新去计算所有的随机数,成本大大增加。
所以在挖矿过程中,如果有人抢先挖出一个区块,那么你就得停下计算,因为上一个区块的 hash 已经过时了,需要把新的区块作为上一个区块,然后能继续开始尝试。
矿挖完了怎么办
为了避免比特币无限制的增加,在经过一定时间后,比特币的出块奖励将会减半,最终不再有挖矿奖励。
不过虽然挖出区块的奖励没有了,但是区块是依然能够继续挖出来的,那矿工怎么赚钱呢,这个时候就只能靠手续费了。
每一笔交易都会设定一个手续费,成功打包的矿工将获取这次打包交易中的手续费,所以矿工打包的时候肯定是先挑内存池中手续费高的出来进行打包,
为了每次打包赚得更多,可以一次打包很多的交易,不过打包的交易多了,计算 hash 的速度就会慢,区块大了网络中传输的速度也会慢,可能在你计算的时候,别人抢先打出一个小区块你就白忙活了,
所以最终选择打包多少交易,就是个平衡的结果。
计算机性能提升对挖矿有啥影响
随着计算机硬件的发展,计算 hash 的时间肯定会越来越短,为了让每次碰撞成功的时间大致相同,0 的个数具体是多少个就需要根据最近一段时间内出块的速度进行动态调整。
当前全网计算机的算力越强,那么难度就会提升,也就是需要的 0 的个数就会越多,碰撞的难度就会越高。结果就是不管你算的多快,难度系数的上升会让出块时间维持在同一个水平。
结尾
上面说到的算法只是个大概说个原理,并不是比特币实际使用的算法。
本人也是刚接触这块知识,还处于学习过程中,文中难免出现错误,欢迎各位指正。
有机会可以再来探讨下这些问题,
如何判断你的比特币是不是属于你?智能合约是个啥?
比特币为啥要等待多个交易确认?分叉重组是啥?