链客,专为开发者而生,有问必答!
此文章来自区块链技术社区,未经允许拒绝转载。
本节内容你将学到以下几个概念:
挖矿(Mining)、矿工(Miner)与矿池(Pool)、双重支付(Double-Spend)
▍ 挖矿(Mining)
类比:挖掘黄金
对于刚刚接触比特币的用户来说,感觉最不可思议的术语就是“挖矿”了, 一个运行在网络上的数字大账本,还需要动用挖掘机吗?实际上“挖矿”只是一种类比,与黄金的挖掘方式相类比,黄金的开采费时费力,而且黄金资源有限。比特币的挖取也是费时(需要大量的计算)、费电(专业矿机需要充足的电力),而且BTC资源也有限,总量2100万个,每四年新币数量减半。
在第上一章介绍“交易”的概念时提到,BTC是通过交易链一层一层传递的,而最初的币是从哪里来的?就是通过“挖矿”来的,而且所有的币没有其它来源,全部都是通过“挖矿”得来,没有任何一家机构可以无缘无故增发货币。
▍矿工(Miner)与矿池(Pool)
挖矿任务的实施者叫“矿工(Miner)”,不像挖黄金里的矿工,这里的矿工是一台冰冷的计算机(通常配有专业的挖矿芯片,还有挖矿软件),它们靠电力支撑其复杂的计算,单个矿工的力量毕竟有限,它们则采用集团作战的方式,组成“矿池(Pool)”,每个矿工按贡献率分成。
挖矿的结果是产生一个新区块,也就是在共享大账本上增加一个账本,想获得这种记账权并不容易,需要完成复杂的计算(专业术语叫工作量证明PoW,下一节介绍),第一个完成计算的才有资格在区块链上增加一个新块,新区块中含有新币奖励(最早为50BTC,每四年减半,2017 年已经是 12.5 BTC);新区块中还包含了网络上广播的数笔交易,这些交易中的手续费也全由矿工拿走。在 2009 年比特币刚诞生的时候,用一台电脑就可以完成这些计算,当时的Bitcoin Core 中还内置了一个挖矿模块。
从这里我们可以知道挖矿有两个意义:一是验证交易的合法性,写入大账本;二是发行新币。由于这个行业的巨大经济诱惑,随着时间推移,大量的计算机投入到这种计算中,通常的CPU被高性能的GPU显卡取代,再后来,专用的挖矿芯片ASIC问世,运算效率是CPU计算的上万倍。如果你现在想用自己的台式机挖矿,就相当于你用一双手挖黄金,而别人用专业团队+全副武装的挖掘设备来挖,你忙活几百年也别想挖到 1 个币。
现在比特币挖矿的入门装备也得上百万的投入,需要购进专门的设备,在一个电费低廉的地方找块空地,配上技术人员,才可以玩得转。所以说,普通人就想通过挖矿来获得你人生的第一枚比特币几乎是不可能的。
登录到这个网站看看最新的区块都是哪些矿池挖出来的。
▍双重支付(Double-Spend)
区块链中解决了数字货币中的一项关键技术,称为“双重支付”,即double-spend。即一笔数字资产既支付给了A,又支付给了B。有些书或网络文章中也把double-spend直译为“双花”,让人费解,千万别理解为两朵花。
在去中心化交易技术之前,这类问题通过中心化的机构来解决,比如:银行。你给A支付了一笔钱,把余额变动一下,想多花也不可能。当然信用卡账户允许你余额还可以支付一定数量的资金,那都是银行说了算。
比特币的创始人中本聪设计了一套完整的体系解决了这个问题,共享大账本(区块链)、去中心化的网络(比特币协议)、交易验证系统(交易脚本)、货币发行(挖矿)等。
大家可能会想,又是挖矿、又是工作量证明,为什么把新区块的产生搞得那么复杂?一个主要原因就是解决在没有建立信任关系的网络中的双重支付的问题,当然这种挖矿机制还能够解决虚假交易、垃圾交易等问题。
这种技术也可以解决"拜占庭将军问题",即一支分散在多处的军队里混入少数叛徒,如何才能通过一致的行动来保证战争的胜利。关于这个问题,在进阶篇会作更详细解释。
假如你在两台安装有Bitcoin Core的电脑上分别发出了2笔交易(同一笔BTC输入,支付给A和B),这些交易都会向全网广播,矿工在收到这些交易时,不会将两个交易都打包。
万一不小心把A和B都打包了,还有许多其他节点要进行验证,仍会拒绝承认这个区块, 也就是说这笔交易的确认数会一直为。小额交易等待1次确认就行,大额交易等待6次以上的确认就足够的安全。
整个比特币系统中的每一个节点都可以查询每一笔交易的情况,且它们是有时间顺序的(时间戳机制),有一个公认的交易序列,只有当大部分节点都认同这笔交易时,这笔交易才是可信的。想破坏这种机制,需要拥有51%的算力。
在比特币世界里想透支,是不可能的。除了创世区块中的50个BTC是凭空出现的,以后的BTC都是挖矿获得的。你是否拥有1个BTC?通过比特币地址可以查个底朝天,一直追踪到这笔资金的诞生记录。这笔钱是不是你的?通过加密和签名算法来保证,无法伪造。
解决双重支付,必须对于每笔交易建立共识,就是大家都同意的机制,无法达成共识,就会分叉。
有疑问加站长微信联系(非本文作者)
![](https://static.golangjob.cn/static/img/footer.png?imageView2/2/w/280)