比特币挖矿
如何优雅地获得第一枚比特币?这是一个值得思考的问题。在第二节课上,我们简要介绍了挖矿业对比特币价格和趋势的影响,以及围绕挖矿业的各个行业。今天,我们将详细讨论挖矿原理。
“挖矿”成功是指节点成功获取当前块的核算权,即其他节点**挖矿成功的节点的当前块。拥有记账权的节点将获得一定数量的比特币奖励,这将鼓励比特币网络中的所有参与者积极参与记账。奖励包括系统奖励和交易费用两部分。系统奖励被用作比特币发行的一种手段。
首先,每个“交易记录块”可以获得50比特币的系统奖励。为了控制比特币的发行数量,每四年奖励将减半,并将在2140年基本发放。**,整个系统中比特币的**数量只能达到2100万。如果按比特币目前的价格计算,比特币的总价值约为2000亿美元。
注:价格取2020年5月30日13:35
比特币系统每10分钟记录一个数据块,其中包含10分钟内要在整个网络中确认的部分或全部交易。所谓“挖矿”,就是争取把这些交易打包成“交易记录块”的权利。比特币系统将随机生成一个数学问题,稍后将对此进行详细描述。所有参与挖矿的节点都将参与这个数学问题的计算。首先计算结果的节点奖,以获得记账权。
每个节点将收集、检查并确认过去一段时间内发生的网络未识别的交易信息。**,它将打包并签名为一个不可篡改的“交易记录块”,并在获得记账权后对该块进行广播,使该块被所有节点识别,该块中的交易在比特币网络上被识别,已完成的交易记录将被**保存。
挖矿最重要的工作就是计算上述数学问题。第一个矿工可以获得区块的会计权。在介绍这个数学难题之前,让我们简单介绍一下哈希算法。哈希算法的基本功能是通过计算任意长度的输入值来生成一个固定长度的字符串,输出字符串就是输入的哈希值。比特币系统采用SHA-256算法。算法输出的哈希值长度为256bit。
1.5.1条
挖矿原理
说到挖矿原理,我们首先要了解一种“植物”——梅克尔树
什么是比特币科普的梅克尔树?
Merkle树,俗称Merkle hash树,是数据结构中的一种树,通常用于有效地总结和验证大数据集的完整性
① Merkel树的常见结构是二叉树,但也可以是多棵树,具有树结构的所有特征。
② Merkel树的基本数据不是固定的,因为它只需要hash运算得到的数据的hash值。
③ Merkel树是自下而上计算的,即每个中间节点按相邻两个叶节点的组合计算,根节点按两个中间节点的组合计算,因此以叶节点为基础。
比特币中的每个区块生成时,需要将前一个区块的哈希值、该区块交易信息的默克尔树根和一个未知随机数(nonce)相结合,计算出一个新的哈希值。为了在10分钟内生成一个块,这项工作一定很困难,也就是说,哈希值必须从几个零开始。在散列算法中,输入信息的任何微小变化都会引起散列值的巨大变化,而且这种变化是不规则的。由于哈希值中的位数是有限的,通过不断尝试随机数nonce,我们总能计算出一个满足要求的哈希值,而无法通过寻找规则来计算随机数。这意味着随机数只能通过暴力枚举获得。挖矿中的数学问题是寻找随机数的过程。
哈希值由十六进制数表示,即每个位有16种可能。根据hash算法的特点,任何一个数出现的概率都是相等的,即每一个比特为“0”的概率为1/16。如果要求一个位为“0”,则需要进行16次哈希运算,如果要求前n位为“0”,则哈希计算的平均次数为16次方。为了计算随机数,矿工需要花费一定的时间做大量的散列运算。矿工成功计算出随机数后,它将打包块并广播整个网络。
在接收到广播后,其他节点只需按照相同的方法对包含随机数的块进行一次哈希。如果以“0”开头的散列值个数满足要求并通过其他有效性检查,则接受该块,停止对当前块随机数的局部搜索,并开始计算下一个块的随机数。
随着技术的发展,哈希计算的速度越来越快。同时,随着矿工的逐渐增多,从一定数量的“0”开始计算满足哈希值的随机数的时间越来越短。为了保证比特币始终以平均每10分钟一块的速度分块,有必要调整随机哈希计算的平均数,即从“0”开始调整哈希值的个数,从而调整难度。在比特币中,每生成一个2016区块,难度就会调整一次,即调整周期约为两周(2016x10min=14天)。也就是说,将生成2016年新区块的实际时间与预计生成2016年区块的时间每10分钟进行一次对比,如果实际时间大于预期时间,难度就会降低;如果实际时间少于预期时间,难度就会增加。
同时,为了防止难度波动过大,每个周期的调整范围必须小于一个因子(目前为4次)。如果振幅大于4倍,则按4倍调整。由于按此范围进行调整,输出转速仍达不到预期,因此在下一个周期将继续调整。
1.5.2款
矿井水池原理
随着区块链的日益普及,越来越多的人参与挖矿。按照比特币最初的设计模式,只有成功打包一个区块的人才能获得奖励。如果每个矿工都独立挖矿,在如此巨大的基础下,成功挖矿的概率几乎为零。只有一个幸运儿才能获得大量财富,其他矿工将白白失去他们的算力和权力资源。一个矿工可能要挖几年甚至更长的时间才能到达一个街区。
为了减少这种不确定性,矿池应运而生。如果10万名矿工参与挖矿工作,并且这10万名矿工的算力占网络的10%,那么10万名矿工中有一人成功挖矿下一个区块的概率是1/10。也就是说,每个矿工成功挖矿到下一个区块的平均概率是1/1000000,也就是说,每个矿工平均需要19年的时间才能成功挖矿出一个区块,然后获得相应的比特币奖励。这种挖矿模式风险太大,几乎没有人能承受。不过,假设这10万名矿工共同参与挖矿,平均每100分钟就可以成功挖矿一个区块,然后根据每个矿工提供的算力分配收入。这10万矿工的收入也将趋于稳定。
协调矿工计算的想法也非常简单。矿池核实后将打包块所需交易等信息发送给矿工,进而降低矿工的挖矿难度。例如,在一段时间内,比特币系统在“0”开头需要超过50个散列。矿池可以将难度降低到40“0”开头。在找到一个以“0”开头的40个散列值的方案后,矿工可以将其提交给矿池。当矿石池接收到满足初始哈希值“0”大于50的方案时,可以将其提交到比特币网络。
当然,你可能会想:如果矿工计算出了一个数字“0”开头大于50的哈希值,他们会直接提交给比特币网络,享受区块的利益;如果“0”的数字从40到50之间开始,则会提交给矿池,享受整个矿池分配的收入。当然,这种方案是不可行的,因为区块内容是由矿池发送给矿工的,也就是说,受益人地址已经包含在区块中。即使直接提交,矿池最终也会受益。如果地址被修改,即块内容被改变,那么先前计算的哈希值无效。**,根据矿工提交的方案数计算贡献的计算权,**根据计算权分配收益。
目前,主流的挖矿协议是分层的。有几个协议,如GBT(getblocktemplate)和Getwork,它们已经过时。免费的cpuminer软件可以用来调整协议。
软件地址是:
https://sourceforge.net/projects/cpuminer/files
让我们来看看挖矿过程~
客户端首先向服务器发送订阅指令
{quot;idquot;:1,quot;方法6035:quot;挖矿.subscribequot;,quot;参数A66035:[quot;Puminer/2.5.0quot;]}
参数为miner软件的名称和版本号。
服务器端返回信息
比特币挖矿实际上是寻找随机数nonce。有时所有的随机数都试过了,仍然不能达到目标,需要额外的时间。
客户端发送身份验证信息
用户名是钱包的地址。我在这里使用的是比特币测试网络的地址,它不是以1开头的。
服务器返回true,表示用户身份验证已通过
{quot;idquot;:2,quot;resultquot;:true,quot;errorquot;:null}
服务器发回难度设置信息
{quot;idquot;:空,quot;方法6035:quot;mining.set困难quot;,quot;参数A66035:[8]}
服务器发送通知消息
矿工可能使用多个线程,所以他们需要作业ID来区分不同的线程,然后是一堆用于生成块的信息。
客户机找到一个nonce并将其提交给服务器
服务器返回结果
返回true以指示服务器识别客户端的工作。
文章标题:如何优雅地挖掘?
文章链接:https://www.btchangqing.cn/132301.html
更新时间:2020年10月29日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。