投资有风险,本文基于技术层面介绍区块链的PoW挖矿,各位网友不要自行贸然尝试挖矿,炒币等行为。
比特币网络(the Bitcoin network)
新发布的区块在网络上是怎么传播的?——比特币的工作原理
首先,我们了解一下两种节点
节点
全节点
轻节点
-
块头与整个区块大小比大概是1:1000
-
验证挖矿难度就是说验证区块是否合法
-
轻节点假设矿工是有理智的,不会沿着不合法的链挖下去
网络
工作流程
交易
-
首先,你要在本地创建一个账户,并且联网。
-
网络中有一个种子节点(Seed Node),你和种子节点联系得到它现知的其他节点。
-
每一个节点维护一个它的邻居网络。信息传播采取flooding的传播方式,即节点A(你)第一次收到一个交易的时候,它将这个交易信息发给A的邻居(转发的前提是交易是合法的 双花和签名),当节点A再次收到这个消息时,就不再广播。
-
每个节点还要维护一个上链的集合。如果你收到A->B和A->C的双花交易,那么遵循以下原则。把先收到的交易写到你维护的集合里面,并且发送给你的邻居节点,后来的交易视为非法交易。
-
离开时,直接退出就可以。其他节点过一段时间就会把你删除(悲伤的故事)。
区块
-
区块的发布与传播(对于全节点):对于一个新发布的区块 它的传播和“交易”的传播是类似的。依旧是说,节点再得到一个区块后要验证几个信息(交易内容是否合法,区块头hash是否符合target,是否在最长合法链上)
-
传输时,越是大的的区块传播速度越慢。因此,区块的大小被限制在1M以内,原因是区块链网络传播的带宽限制。按照1M限制的话,一个区块传遍整个p2p网络大概需要几十秒。
网络设计与架构
-
网络层(network layer):p2p Overlay Network(每个节点都是对等的)
-
比特币网络的设计遵从:简单 鲁棒但是不高效
-
节点的邻居选择是随机的,不考虑实际的拓扑结构。即可能一个在中国,一个在毛里求斯(和ip地址无关)。这样的话,增强了鲁棒性,但是不利于效率(当然,延时时间很短)
-
节点之间使用tcp协议链接,方便穿透防火墙
原因:
-
TCP协议是面向连接的协议,建立连接时需要进行握手和确认,这样可以在双方建立连接时维持一条通道。由于建立连接时需要一定的通信过程,这些通信过程会使得防火墙对连接的跟踪变得更加容易。
-
防火墙通常会允许TCP协议的通信,因为TCP协议是一种可靠的协议,可以保证数据传输的可靠性和完整性。因此,可以更容易地通过防火墙转发TCP协议的数据包。
-
TCP协议的连接是基于端口的,每个服务都会监听一个特定的端口。因此,只要知道目标主机的IP地址和端口号,就可以建立连接和进行通信。这也使得攻击者更容易通过防火墙找到目标主机的开放端口。
-
去中心化网络的实际问题
-
传播的延时性
-
节点得到信息的先后有区别(比如上述的A->B和A->C双花)
-
有些节点没有按照要求将交易进行转发
-
一些节点转发错误的交易信息(非法)
每个节点能做的只有尽力而为(best effort)
有人会问,我在某宝上购买货物,不发货的话我会收到退款。但是区块链如何保证退款呢?
首先,支付的回滚并不是支付系统做到的,而是借助其他平台做到的。通常认为的“退款”不是覆盖这个已有的转账,而是商家把钱再转给你(再来一笔交易)
对于区块链的这个不足,高人设计了智能合约这个工具,之后会详细说。
挖矿难度
区块链每挖出2016个区块后调整一次挖矿难度,这个时间大概是2周
为什么要调整挖矿难度?
客观条件:
-
人们对比特币的关注度提高
-
挖矿人数的上升
-
挖矿设备的先进化
使得整个比特币网络中的整体算力进行提升
调整挖矿难度的必要性
-
如果不调整,那么挖出一个区块的时间就会缩短
-
假设最初的算力为1,现在的算力为600,那么挖出一个区块的时间会从10分钟来到1秒钟。
-
试想,在这种情况下,可能同时出现很多分叉,这里我们假设出现了100分叉。出现大量的分叉会导致区块链的“共识性”降低
-
共识性降低的坏处是什么?也就是说如果出现一个恶意节点产生的区块,那么善意节点会去挖另外的99个节点,而恶意的节点就只会在这一个区块后面挖。哪怕之后不会出现分叉,那么想实现分叉攻击的算力代价也只是1%,而不是51%。
-
因此,区块链想要避免这种情况,加强一致性,就需要调整挖矿难度,稳定出块时间。
怎么调整挖矿难度?
换算公式
difficulty=difficulty_1_target/target
-
difficulty_1_target 指的是在挖矿难度等于1时,target的值
难度调整公式
target=target*(actrual_time/expected_time)
-
actrual_time指的是挖出最近2016个区块所使用的时间
-
expected_time指的是10min*2016
-
在实际使用中,一般遵循 target_before/4<=target_now<=target_before*4
区块链中的实际应用
换算公式
区块链直接调整的是difficulty,然后计算出target(可以参考《简易区块链实现——工作量证明》),不过殊途同归。
不修改挖矿难度的后果
自讨苦吃
-
如果挖矿难度升高,而该节点按照简单的挖,那么他挖出的区块hash不满足target,无效劳动
-
如果挖矿难度降低,而该节点按照困难的挖,那么白白浪费算力
挖矿
节点
区块链网络中,大多数都是轻节点。
如果单纯的进行转账,那么一个轻节点就足够完成。
但是如果你想要挖矿,那么一般需要使用全节点。
全节点挖矿时要做什么
如果一个全节点A在挖矿时监听到一个新的区块
如果这个区块是合法的而且在最长合法链上那么A节点此刻需要停止挖矿,在本地组装一个新的区块并且以监听到的新区块的哈希值为prever_hash进行挖矿。
为什么要这么做
在下面的例子中,我们管节点A组装的区块叫做BLA(Block of Local A),管链上的最后一个区块叫做NBL(New Block of the Chain)
-
首先,作为一个善意的节点,在验证完合法性后,就要在最长链的最后开挖。
-
其次,如果不重新组装,只是将prever_hash改变,那么BLA的交易列表里面,很可能有NLB中的交易,会导致BLA成为一个非法节点(导致双花)。
-
再者,区块链挖矿的PoW机制有memoryless的特性,也就是先前努力无用(process free)。因此,重新挖理论上挖出区块的时间和
区块链安全性的保证
区块链安全性保证分为密码学的保证和共识机制
密码学上的保证
-
在之前我们提到过,产生私钥和签名的时候要有好的随机源(good random source)
-
这样做的目的是让产生的签名不会被别的节点伪造。
共识机制的保证
共识机制保证的是至少有51%的算力是善意的节点,承认的是合法的交易。类比来说,就是确保“银行的工作人员不会承认没有你合法签名的人发布的交易”
挖矿设备
挖矿设备的迭代演化
-
最早是时候,人们使用通用计算机的CPU进行挖矿,计算机和笔记本电脑都可以用来挖矿。由于上述的做法会导致内存,CPU里的大部分指令,硬盘等资源都是闲置的。因此,随着比特币挖矿难度是上升,使用通用计算机挖矿的行为很快变得无利可图。
-
之后,人们使用GPU进行挖矿。GPU相比于CPU,更适合与大规模的并行计算,可以进行大量的矩阵乘法。
-
GPU是图形处理单元(Graphics Processing Unit)的英文缩写,是一种专门用于处理图形和图像计算的处理器。下面是GPU的简介:
GPU(通俗理解为显卡)最初是为了加速计算机的图形处理而设计的,用于处理复杂的图像、视频和游戏等图形应用。随着科学计算领域的发展,人们开始意识到GPU在并行计算方面的潜力,逐渐开始将GPU应用于通用计算领域,尤其是在深度学习、人工智能和大规模数据处理等领域。GPU与传统的CPU(中央处理器)相比,主要区别在于其并行处理能力更强。GPU拥有数以千计的处理核心,能够同时处理大量数据并执行大量计算操作,适合于并行计算和大规模并行处理任务。因此,GPU在处理图形、视频、游戏和深度学习等应用中表现出色。总的来说,GPU是一种专门用于图形处理和通用计算的处理器,以其强大的并行处理能力和高性能计算能力在多个领域得到广泛应用。
然而,GPU内部的很多部件依旧处于闲置状态。比如,用于浮点数运算的部件,这些部件在深度学习中很有用,但是在挖矿中没有任何作用。然而,现在(2024)的挖矿难度已经是GPU无法满足的,GPU现在的用途通常是用于深度学习和游戏。
-
目前挖矿使用的是ASIC(Application Specific Integrate Circuit )芯片,是专门为挖矿设计的芯片,没有多余的其他部件,实现了性价比的最高化。
而且,为某种加密货币设计的ASIC芯片,只能用于本种货币(使用同种mining puzzle)的挖矿计算。(一种新产生的加密货币,为了吸引人们来挖矿,通常在最初期使用和此前热度大的加密货币一致的mining puzzle,这种行为被称为merge puzzle)
ASIC芯片的研发速度相对于其他芯片是很快的,但是还是需要很长的研发时间(比特币的ASIC芯片研发时间为一年)。
ASIC芯片的使用是有寿命周期的,可以理解为军备竞赛。市场研究发现,一块ASIC矿机获得的利润大多是在它上市的前两个月获得的,再之后就可能会被更强的新上市矿机淘汰掉。因此,购买ASIC矿机的购买时机很重要。
由于ASIC芯片的专一性,他们被淘汰后就没有办法去进行其他操作,造成了很大浪费。再者,一些不良商家会在研发出新的矿机后,先拿来挖两个月,再发给客户。新矿机投入挖矿的明显标志是区块链网络总体算力明显提升。
(图片来源:闲鱼)
反思与进步
ASIC的出现,使得大量的算力资源掌握在少数人的手中。这其实是有悖于去中心化的思想的。因此,一些加密货币在设计mining puzzle时,采用了ASIC Resistance的特性,使得不能用ASIC芯片进行挖矿。
矿池出现
矿工的困境
单个有ASIC芯片的矿工,虽然在平均收入上是有利可图的,但是由于memoryless的特性,收入是十分不稳定的,就像买彩票一样。
此外,挖矿的节点要承担全节点的作用,这种储存量是很大的,使得矿工往往无利可图。
矿池
矿池的架构是一个全节点(矿主—pool manager),驱动很多个矿机(矿工—miner)。矿工只负责计算哈希值,其他的责任都由全节点(矿主)来负责(监听交易,打包区块等)。
矿池的分布模式
-
类似于大厂的服务器,一个矿场有成百上千的矿机。
-
矿机来源于五湖四海,矿主分配需要计算的哈希任务给矿机,挖出区块后的收益按照算力贡献分配。我们在这里暂且称之为合作挖矿模式。
如何衡量合作挖矿模式各矿工的贡献?
首先,矿工向加入一个矿池,只需要按照矿池的协议去和矿主联系就可以,矿工很容易转换矿池。
我们假设挖矿的target有70个0
首先,我们规定挖出hash值前50位为0的区块叫做share。每个矿工在枚举一个nonce时,同时计算share和block,并且都提交给矿主。在矿池获得收益时,按照每个矿工提交的share比例来进行分红。
问题一:一个矿工挖出区块能不能自行发布上链,挖出的share发给矿主,来获得其他区块努力得来的分红?
答案是否定的!第一,矿工没法组装区块,区块里面的铸币交易地址写的是矿主的账户。就是上链,获得收益的也是矿主(懵逼的矿主:感谢上天馈赠的12.5币)。第二,如果改变了铸币交易的地址,那么挖出的share就不符合矿主的要求,就和矿工自己单干没有区别。
问题二:挖出的区块能不能直接扔掉?
答案是肯定的,但是这样的行为属于损人不利己(挖出区块的自己那部分分红也没了),但是如果你是其他矿池老板派来的间谍就另说了。
矿机算力分布市场行情
可以看出,在18年大多数算力源自中国
很明显,名为GHash的公司达到了51%的算力,可能进行51%算力攻击,造成其他节点的恐慌。
但是这个矿池在后来自动的消减了很多算力来稳定市场对于比特币的信心。
截至18年矿池的算力分布
51%攻击
随着矿池的出现,一家公司可能将算力资源非配给不同的矿主,或者矿主通过一些手段去吸引更多人来挖矿(这些人是不明所以的),从而实现算力的增加。也就是说,矿池的出现,可能会推进区块链的某个节点算力达到51%或以上。当这样的超级节点达成后,他可以进行那些攻击呢?
-
分叉攻击
当最长合法链达到某区块6节点之后,这个区块的交易被承认为合法交易,这时候在下方位置发动如下的分叉攻击,随着时间的推移,下方的分叉链就成为最长合法链,实现对上方一个或多个区块交易的回滚(注意,后面的区块可能会滚也可能不会滚,这取决于下方分叉链成为最长合法链时,这个区块后面是否有6个区块)
-
Boycott(封锁禁运)
即封锁涉及一个节点A的交易。矿主一旦发现有关A的交易进入区块链,立刻分叉(越快越好),是的这个区块不在最长合法链上。不同于上述的分叉攻击,这种攻击直接分叉产生新链即可,不需要等待6个区块。
这样的攻击有更深的影响,如果超51节点公开抵制关于节点A的交易。那么其他节点因为担心自己挖出的区块因为包含关于A的交易而被分叉,从而丧失挖出区块的奖励,就不会去包含关于A的交易。
-
盗币 依旧不可能