当前位置:首页 » 挖矿知识 » 挖矿哈希函数

挖矿哈希函数

发布时间: 2023-05-22 22:38:44

Ⅰ 天天说挖矿比特币挖矿流程概述。

通俗易懂的大概流程

如果你之前对挖矿根本没有了解,这段介绍就适合你阅读,进入状态后再进行更深层次的学习。

其实通俗来讲原理很简单,比特币作为一种点对点的电子货币体系,挖矿的过程就是一个纪录数据的过程,因为整个系统是开放的,人人可参与的,所以人人都可以进行挖矿,虽然理论上人人都可以参与,但无利不起早没有人会平白无故的参与到网络的建设中,中本聪就利用Hash函数设计了一种激励和竞争方式。

大家都进行数据的处理工作,谁处理的又快又准确,谁就获得记账权,同时获得该区块的奖励。既有奖励又有竞争才使得比特币网络得以正常运转。

想要竞争成功就要经历几个基本的流程。

一、首先你要将没有被记录的交易信息检查并归集到一个数据块中。

二、数据块打包好后,进行哈希运算,算出哈希值,哈希值这个概念在昨天文章中已经详细的介绍过。

三、算出哈希值后进行全网广播,其他矿工接收到后进行验证,验证没有问题就会将这一个数据块连接到整个区块链上,就可以获得这个区块的奖励了。

大致过程了解后就可以开始详细的了解整个过程了。

开始挖矿前的准备工作

这里所说的准备,可不是让你准备买矿机或者给矿机通电,说的是在进行POW工作量证明之前记账节点所作的准备工作。也就是前面流程的第一步的具体解释。

想要收集齐全交易信息,第一步就是收集广播中还没有被记录账本的原始交易信息。收集完成后就要自己先进行验证,主要验证两个方面,1.每个交易信息中的付款地址有没有足够付款的余额。2.验证交易是否有正确的签名。这两项必不可少,通俗一点就是你给别人打钱银行需要确认的就是两点,你账号里到底有没有那么多钱,是不是你本人或本人同意的行为。

这两项验证完后就可以将验证好的数据进行打包,打包完成后当然没有完,因为还有对于矿工来说最最重要的 一 步,添加一个奖励交易,写一个给自己地址增加6.25枚比特币的交易。

如果你竞争成功,那么你的账户地址内就会增加6.25枚比特币,在这里也顺便提一下减半,最开始一个区块的记账奖励是50个比特币,比特币大概每4年奖励就进行减半,前一段时间的减半过后比特币一个区块的奖励已经变成了6.25枚。

值得一提的是前两次减半后都伴随着牛市的来临,现在第三次减半已过,在之后会有什么样的变化呢?

准备工作完成后就要正式的争夺了

因为10分钟左右就一个记账的名额,在这个阶段全世界的矿工,都进行着一场没有硝烟的战争。

那这场仗怎么打呢?其实就是计算Hash函数,矿工算力的比拼,所以说在比特币网络哪里都离不开Hash函数。为了保证在10分钟只有一个人能够成功,这个哈希函数的难度必须适当。直接哈希难度过低,所以规定Hash出的结果必须以若干个0构成。

可能直接这么说开头若干个0还没有什么难度概念,那就简单分析一下,进行这样的计算有多难 , 也就顺便可以解释为什么单打独斗的矿工已经不吃香了。

Hash值跟平常我们设置的密码要求相似,是由数字、字母组成,其中字母区分大小写。也就是说每一位都有62种可能,哈希运算本质就是试错,相当于给你一个不限出错次数的手机让你开锁一样 。 而比特币的哈希值是以18个0开头的,理论上需要进行62的18次方,这个数字在普通计算器上都是以科学计数法显示的,结果为1.832527122*10的32次方。

指数爆炸式的运算次数增长保证了其挖矿的难度。同时也因为难度大带来了一些争议,有人就会说耗费那么大却不产生价值,之前挖矿还在一份意见征集稿中放到了落后产能里。可以说对于挖矿行业的争议是一直存在的。

最后一步验证

找到哈希值后,进行广播打包区块,网络节点就会进行验证。

情况无非就是两种,一种是验证通过,那么表明这个区块成功挖出,其他矿工就不再竞争,选择接受这个区块,将这个区块进行记录,挖出这个区块的矿工就获得了该区块的奖励,并且进入下一个区块的竞争。

另外一种就是不通过,那么前面的那些工作都白费了,投入的成本就没有办法收回,所以矿工们都自觉的遵守着打包和验证的规则,因为作恶成本较高,也就维护了比特币网络的安全。

相信你读完文章已经大致了解了比特币挖矿的整个流程,不过挖矿实际操作起来又是另一个概念了,其中什么时候适合进场挖矿、入手什么样的矿机进行挖矿、通过什么样的方式参与挖矿都是有一定学问的。

挖矿有风险投资需谨慎呀,搞懂再行动,没搞懂之前就要多学习。

Ⅱ 区块链技术中的哈希算法是什么

1.1. 简介

计算机行业从业者对哈希这个词应该非常熟悉,哈希能够实现数据从一个维度向另一个维度的映射,通常使用哈希函数实现这种映射。通常业界使用y = hash(x)的方式进行表示,该哈希函数实现对x进行运算计算出一个哈希值y。
区块链中哈希函数特性:

  • 函数参数为string类型;

  • 固定大小输出;

  • 计算高效;

  • collision-free 即冲突概率小:x != y => hash(x) != hash(y)

    隐藏原始信息:例如区块链中各个节点之间对交易的验证只需要验证交易的信息熵,而不需要对原始信息进行比对,节点间不需要传输交易的原始数据只传输交易的哈希即可,常见算法有SHA系列和MD5等算法

  • 1.2. 哈希的用法

    哈希在区块链中用处广泛,其一我们称之为哈希指针(Hash Pointer)
    哈希指针是指该变量的值是通过实际数据计算出来的且指向实际的数据所在位置,即其既可以表示实际数据内容又可以表示实际数据的存储位置。下图为Hash Pointer的示意图


Ⅲ 什么是哈希

散列是指从可变大小的输入生成固定大小的输出的过程。这是通过使用称为散列函数(作为散列算法实现)的数学公式来完成的。

尽管并非所有哈希函数都涉及密码学的使用 ,但所谓的密码哈希函数是加密货币的核心。多亏了它们,区块链和其他分布式系统能够实现显着水平的 数据完整性和安全性。

传统和加密散列函数都是确定性的。确定性意味着只要输入不变,散列算法将始终产生相同的输出(也称为摘要或散列)。

通常,加密货币的散列算法被设计为单向函数,这意味着如果没有大量的计算时间和资源,它们就无法轻易恢复。换句话说,从输入创建输出非常容易,但在相反的方向(仅从输出生成输入)相对困难。一般来说,越难找到输入,哈希算法被认为越安全。

不同的散列函数将产生不同大小的输出,但每种散列算法可能的输出大小始终是恒定的。例如,SHA-256 算法只能生成 256 位的输出,而 SHA-1 将始终生成 160 位的摘要。

为了说明这一点,让我们通过 SHA-256 哈希算法(比特币中使用的算法)运行“Bitcoin”和“bitcoin”这两个词。

请注意,微小的更改(第一个字母的大小写)会导致完全不同的哈希值。但由于我们使用 SHA-256,输出将始终具有 256 位(或 64 个字符)的固定大小 - 无论输入大小如何。此外,无论我们通过算法运行这两个单词多少次,两个输出都将保持不变。

相反,如果我们通过 SHA-1 哈希算法运行相同的输入,我们将得到以下结果:

值得注意的是,首字母缩略词 SHA 代表安全哈希算法。它指的是一组加密哈希函数,包括 SHA-0 和 SHA-1 算法以及 SHA-2 和 SHA-3 组。SHA-256 是 SHA-2 组的一部分,还有 SHA-512 和其他变体。目前,只有 SHA-2 和 SHA-3 组被认为是安全的。

传统的哈希函数具有广泛的用例,包括数据库查找、大文件分析和数据管理。另一方面,加密散列函数广泛用于信息安全应用,例如消息认证和数字指纹。就比特币而言,加密哈希函数是挖矿过程的重要组成部分, 也在新地址和密钥的生成中发挥作用。

散列的真正威力在于处理大量信息时。例如,可以通过哈希函数运行一个大文件或数据集,然后使用其输出来快速验证数据的准确性和完整性。由于散列函数的确定性,这是可能的:输入将始终产生简化的、压缩的输出(散列)。这种技术消除了存储和“记住”大量数据的需要。

散列在区块链技术的背景下特别有用。比特币区块链有几个涉及散列的操作,其中大部分在挖掘过程中。事实上,几乎所有的加密货币协议都依赖散列来将交易组链接和压缩成块,并在每个块之间产生加密链接,从而有效地创建区块链。

同样,部署密码技术的散列函数可以定义为密码散列函数。一般来说,破解密码哈希函数需要无数次的蛮力尝试。对于“还原”加密哈希函数的人来说,他们需要通过反复试验来猜测输入是什么,直到产生相应的输出。然而,也有可能不同的输入产生完全相同的输出,在这种情况下会发生“冲突”。

从技术上讲,加密哈希函数需要遵循三个属性才能被视为有效安全。我们可以将这些描述为抗碰撞性、抗原像性和抗二次原像性。

在讨论每个属性之前,让我们用三个简短的句子总结它们的逻辑。

如前所述,当不同的输入产生完全相同的散列时,就会发生冲突。因此,哈希函数被认为是抗冲突的,直到有人发现冲突为止。请注意,任何散列函数都将始终存在冲突,因为可能的输入是无限的,而可能的输出是有限的。

换句话说,当发现碰撞的可能性非常低以至于需要数百万年的计算时,哈希函数是抗碰撞的。因此,尽管没有无冲突的哈希函数,但其 中一些函数足够强大,可以被视为具有抵抗力(例如,SHA-256)。

在各种 SHA 算法中,SHA-0 和 SHA-1 组不再安全,因为已经发现冲突。目前,SHA-2 和 SHA-3组被认为是抗冲突的。

原像电阻的特性与单向函数的概念有关。当有人找到生成特定输出的输入的可能性非常低时,哈希函数被认为是抗原像的。

请注意,此属性与前一个属性不同,因为攻击者会试图通过查看给定的输出来猜测输入是什么。另一方面,当有人发现产生相同输出的两个不同输入时,就会发生冲突,但使用哪个输入并不重要。

原像抗性的特性对于保护数据很有价值,因为消息的简单散列可以证明其真实性,而无需披露信息。在实践中,许多服务提供商和 Web 应用程序存储和使用从密码生成的哈希值,而不是明文密码。

为简化起见,我们可以说第二原像电阻介于其他两个属性之间。当有人能够找到一个特定的输入,该输入生成与他们已经知道的另一个输入相同的输出时,就会发生二次原像攻击。

换句话说,第二原像攻击涉及寻找碰撞,但不是搜索生成相同散列的两个随机输入,而是搜索生成由另一个特定输入生成的相同散列的输入。

因此,任何抗碰撞的哈希函数也能抗第二原像攻击,因为后者总是意味着碰撞。然而,人们仍然可以对抗碰撞函数执行原像攻击,因为它意味着从单个输出中找到单个输入。

比特币挖矿有很多步骤 涉及哈希函数,例如检查余额、链接交易输入和输出,以及对区块内的交易进行哈希处理以形成 默克尔树。但比特币区块链安全的主要原因之一 是矿工需要执行无数的散列操作,以便最终为下一个区块找到有效的解决方案。

具体来说,矿工在为其候选块创建哈希值时必须尝试几种不同的输入。本质上,如果他们生成以一定数量的零开头的输出哈希,他们将只能验证他们的块。零的数量决定了挖矿难度,它根据网络的哈希率而变化。

在这种情况下,哈希率表示在比特币挖矿中投入了多少计算机能力。如果网络的哈希率增加,比特币协议会自动调整挖矿难度,使挖出一个区块所需的平均时间保持在接近 10 分钟。相反,如果几个矿工决定停止挖矿,导致算力大幅下降,则会调整挖矿难度,使其更容易挖矿(直到平均出块时间回到10分钟)。

请注意,矿工不必发现冲突,因为他们可以生成多个散列作为有效输出(从一定数量的零开始)。所以对于某个区块有几种可能的解决方案,矿工只需要找到其中一种——根据挖矿难度确定的阈值。

由于比特币挖矿是一项成本密集型任务,矿工没有理由欺骗系统,因为这会导致重大的经济损失。加入区块链的矿工越多,它就变得越大越强大。(国内禁止参与挖矿)

毫无疑问,哈希函数是计算机科学中必不可少的工具,尤其是在处理大量数据时。当与密码学结合时,散列算法可以非常通用,以多种不同的方式提供安全性和身份验证。因此,加密哈希函数对几乎所有加密货币网络都至关重要,因此了解它们的属性和工作机制对于任何对区块链技术感兴趣的人肯定会有所帮助。

Ⅳ 区块链中的哈希算法是什么

哈希算法是什么?如何保证挖矿的公平性?
哈希算法是一种只能加密,不能解密的密码学算法,可以将任意长度的信息转换成一段固定长度的字符串。
这段字符串有两个特点:
1、 就算输入值只改变一点,输出的哈希值也会天差地别。
2、只有完全一样的输入值才能得到完全一样的输出值。
3、输入值与输出值之间没有规律,所以不能通过输出值算出输入值。要想找到指定的输出值,只能采用枚举法:不断更换输入值,寻找满足条件的输出值。
哈希算法保证了比特币挖矿不能逆向推导出结果。所以,矿工持续不断地进行运算,本质上是在暴力破解正确的输入值,谁最先找到谁就能获得比特币奖励。

Ⅳ 哈希函数的本质及生成方式

哈希表与哈希函数

说到哈希表,其实本质上是一个数组。通过前面的学习我们知道了,如果要访问一个数组中某个特定的元素,那么需要知道这个元素的索引。例如,我们可以用数组来记录自己好友的电话号码,索引 0 指向的元素记录着 A 的电话号码,索引 1 指向的元素记录着 B 的电话号码,以此类推。

而当这个数组非常大的时候,全凭记忆去记住哪个索引记录着哪个好友的号码是非常困难的。这时候如果有一个函数,可以将我们好友的姓名作为一个输入,然后输出这个好友的号码在数组中对应的索引,是不是就方便了很多呢?这样的一种函数,其实就是哈希函数。哈希函数的定义是将任意长度的一个对象映射到一个固定长度的值上,而这个值我们可以称作是哈希值(Hash Value)。

哈希函数一般会有以下三个特性:

任何对象作为哈希函数的输入都可以得到一个相应的哈希值;

两个相同的对象作为哈希函数的输入,它们总会得到一样的哈希值;

两个不同的对象作为哈希函数的输入,它们不一定会得到不同的哈希值。

对于哈希函数的前两个特性,比较好理解,但是对于第三种特性,我们应该如何解读呢?那下面就通过一个例子来说明。

我们按照 Java String 类里的哈希函数公式(即下面的公式)来计算出不同字符串的哈希值。String 类里的哈希函数是通过 hashCode 函数来实现的,这里假设哈希函数的字符串输入为 s,所有的字符串都会通过以下公式来生成一个哈希值:



这里为什么是“31”?下面会讲到哦~

注意:下面所有字符的数值都是按照 ASCII 表获得的,具体的数值可以在这里查阅。

如果我们输入“ABC”这个字符串,那根据上面的哈希函数公式,它的哈希值则为:



在什么样的情况下会体现出哈希函数的第三种特性呢?我们再来看看下面这个例子。现在我们想要计算字符串 "Aa" 和 "BB" 的哈希值,还是继续套用上面的的公式。

"Aa" 的哈希值为:

"Aa" = 'A' * 31 + 'a' = 65 * 31 + 97 = 2112

"BB" 的哈希值为:

"BB" = 'B' * 31 + 'B' = 66 * 31 + 66 = 2112

可以看到,不同的两个字符串其实是会输出相同的哈希值出来的,这时候就会造成哈希碰撞,具体的解决方法将会在第 07 讲中详细讨论。

需要注意的是,虽然 hashCode 的算法里都是加法,但是算出来的哈希值有可能会是一个负数。

我们都知道,在计算机里,一个 32 位 int 类型的整数里最高位如果是 0 则表示这个数是非负数,如果是 1 则表示是负数。

如果当字符串通过计算算出的哈希值大于 232-1 时,也就是大于 32 位整数所能表达的最大正整数了,则会造成溢出,此时哈希值就变为负数了。感兴趣的小伙伴可以按照上面的公式,自行计算一下“19999999999999999”这个字符串的哈希值会是多少。

hashCode 函数中的“魔数”(Magic Number)

细心的你一定发现了,上面所讲到的 Java String 类里的 hashCode 函数,一直在使用一个 31 这样的正整数来进行计算,这是为什么呢?下面一起来研究一下 Java Openjdk-jdk11 中 String.java 的源码(源码链接),看看这么做有什么好处。

public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
hash = h = isLatin1() ? StringLatin1.hashCode(value)
: StringUTF16.hashCode(value);
}
return

可以看到,String 类的 hashCode 函数依赖于 StringLatin1 和 StringUTF16 类的具体实现。而 StringLatin1 类中的 hashCode 函数(源码链接)和 StringUTF16 类中的 hashCode 函数(源码链接)所表达的算法其实是一致的。

StringLatin1 类中的 hashCode 函数如下面所示:

public static int hashCode(byte[] value) {
int h = 0;
for (byte v : value) {
h = 31 * h + (v & 0xff);
}
return h

StringUTF16 类中的 hashCode 函数如下面所示:

public static int hashCode(byte[] value) {
int h = 0;
int length = value.length >> 1;
for (int i = 0; i < length; i++) {
h = 31 * h + getChar(value, i);
}
return h

一个好的哈希函数算法都希望尽可能地减少生成出来的哈希值会造成哈希碰撞的情况。

Goodrich 和 Tamassia 这两位计算机科学家曾经做过一个实验,他们对超过 50000 个英文单词进行了哈希值运算,并使用常数 31、33、37、39 和 41 作为乘数因子,每个常数所算出的哈希值碰撞的次数都小于 7 个。但是最终选择 31 还是有着另外几个原因。

从数学的角度来说,选择一个质数(Prime Number)作为乘数因子可以让哈希碰撞减少。其次,我们可以看到在上面的两个 hashCode 源码中,都有着一条 31 * h 的语句,这条语句在 JVM 中其实都可以被自动优化成“(h << 5) - h”这样一条位运算加上一个减法指令,而不必执行乘法指令了,这样可以大大提高运算哈希函数的效率。

所以最终 31 这个乘数因子就被一直保留下来了。

区块链挖矿的本质

通过上面的学习,相信你已经对哈希函数有了一个比较好的了解了。可能也发现了,哈希函数从输入到输出,我们可以按照函数的公式算法,很快地计算出哈希值。但是如果告诉你一个哈希值,即便给出了哈希函数的公式也很难算得出原来的输入到底是什么。例如,还是按照上面 String 类的 hashCode 函数的计算公式:



如果告诉了你哈希值是 123456789 这个值,那输入的字符串是什么呢?我们想要知道答案的话,只能采用暴力破解法,也就是一个一个的字符串去尝试,直到尝试出这个哈希值为止。

对于区块链挖矿来说,这个“矿”其实就是一个字符串。“矿工”,也就是进行运算的计算机,必须在规定的时间内找到一个字符串,使得在进行了哈希函数运算之后得到一个满足要求的值。

我们以比特币为例,它采用了 SHA256 的哈希函数来进行运算,无论输入的是什么,SHA256 哈希函数的哈希值永远都会是一个 256 位的值。而比特币的奖励机制简单来说是通过每 10 分钟放出一个哈希值,让“矿工们”利用 SHA256(SHA256(x)) 这样两次的哈希运算,来找出满足一定规则的字符串出来。

比方说,比特币会要求找出通过上面 SHA256(SHA256(x)) 计算之后的哈希值,这个 256 位的哈希值中的前 50 位都必须为 0 ,谁先找到满足这个要求的输入值 x,就等于“挖矿”成功,给予奖励一个比特币。我们知道,即便知道了哈希值,也很难算出这个 x 是什么,所以只能一个一个地去尝试。而市面上所说的挖矿机,其原理是希望能提高运算的速度,让“矿工”尽快地找到这个 x 出来。

Ⅵ 如何计算挖矿每天所获得的收益

虽然每个人拥有的矿机数量不同,想算出自己的每日收益,其实很简单,优质的比特币站点都有相关的软件帮你计算出最终收益,但是你想知道收益的产出原理吗?

那么各位要先明白挖矿的基本信息:

区块·奖励(BlockReward): 每挖出一个新的区块,系统会给矿工的奖励比特币,目前区块的奖励是6.25比特币。

算力(Hashrate): 算力(也就是哈希值碰撞)是比特币网络处理能力的度量单位。即为矿机计算哈希函数输出的速度。比特币网络必须为了安全目的而进行密集的数学和加密相关操作。

例如,当网络达到10Th/s的哈希率时,意味着它可以每秒进行10万亿次计算。

难度(Difficulty): 比特币系统的难度是动态调整的,每挖2016个块便会做出一次调整,调整的依据是前面2016个块的出块时间,如果前一个周期平均出块时间小于10分钟,便会加大难度,大于10分钟,则减小难度,目的是为了保证系统稳定的每过10分钟产出一个块,所以难度调整的时间大概是2周(2016* 10 分钟)

比特币网络初始难度定义为1,即Difficulty=1,它所表示的意思是,比特币网络刚开始运行的时候,每进行2^48/(2^16-1)≈2^32次Hash计算,理论上能挖出一个区块。

随着挖矿算力的提升,比特币挖矿难度在不断提升,当挖矿难度为D时,理论上挖出一个新区块需要进行D*2^32次哈希运算。

矿工的算力为H(单位为hash/s),他每天(24小时)的币产出为P,挖矿难度为D,系统奖励为R,那么:

难度X6.25奖励(R)X时间=比特币产出

P=H×x6.25×(24×60×60)D×232

数学不好的小伙伴不要慌,可以直接通过相关网站查询到当天全网算力难度,编写此文章时当天难度为【16.95T】

假设矿工算力为1TH/s(即10^12H/s),

当前的难度=16.947.802.333.946(16.95T)

加上系统当前的区块奖励=6.25比特币,

计算可以得出1T每天(24小时)

可以获得收益=0.00000742BTC

当然,这只是一个最基础的PPS收益算法,除了区块奖励外,还有打包交易的旷工费,这部分的计算和矿池的结算方式有所相关。

矿池还有多种结算方式。以上介绍的是最为基础的结算方式PPS(PayPer Share)。根据矿工提交的有效工作量来结算收益。

目前比特币矿池主要的结算还有FPPS和PPS+等等,可以让你在基础上获得而外的奖励。

目前基本上收益方式多为选择PPS+结算的矿工,他们与矿池的关系相当于打工者与公司的关系,矿工的收益不受矿池幸运值波动的影响。不管矿池幸运值如何,PPS结算方式下,只要矿工算力、挖矿难度、系统奖励确定了,矿工的收益就是确定的,拿稳定的“工资”。

数学不太好的,实在看不懂的小伙伴。记得关注今日矿工,一起研究挖矿小乐趣。

Ⅶ 显卡怎么计算挖矿算力

可以参考下面,根据一些网吧市场常用的显卡,整理的一份相关显卡的价格和算力以及预计回本期,大概可以做个参考:

Radeon RX 580显卡
整机功耗:243W
计算力:22.4M
显卡售价:1999元
每24小时挖ETH数量:0.015
每24小时产生收益:24.48元
预计回本时间:81.66天

Radeon RX 470显卡
整机功耗:159W
计算力:24.3M
显卡售价:1599元
每24小时挖ETH数量:0.017
每24小时产生收益:27.9元
预计回本时间:57.31天

Radeon RX 480显卡
整机功耗:171W
计算力:24.4M
显卡售价:1999元
每24小时挖ETH数量:0.017
每24小时产生收益:27.87元
预计回本时间:71.73天

(7)挖矿哈希函数扩展阅读:

显卡(Video card,Graphics card)全称显示接口卡,又称显示适配器,是计算机最基本配置、最重要的配件之一。显卡作为电脑主机里的一个重要组成部分,是电脑进行数模信号转换的设备,承担输出显示图形的任务。

显卡接在电脑主板上,它将电脑的数字信号转换成模拟信号让显示器显示出来,同时显卡还是有图像处理能力,可协助CPU工作,提高整体的运行速度。对于从事专业图形设计的人来说显卡非常重要。 民用和军用显卡图形芯片供应商主要包括AMD(超微半导体)和Nvidia(英伟达)2家。现在的top500计算机,都包含显卡计算核心。在科学计算中,显卡被称为显示加速卡。

Ⅷ 详解比特币挖矿原理

可以将区块链看作一本记录所有交易的公开总帐簿(列表),比特币网络中的每个参与者都把它看作一本所有权的权威记录。

比特币没有中心机构,几乎所有的完整节点都有一份公共总帐的备份,这份总帐可以被视为认证过的记录。

至今为止,在主干区块链上,没有发生一起成功的攻击,一次都没有。

通过创造出新区块,比特币以一个确定的但不断减慢的速率被铸造出来。大约每十分钟产生一个新区块,每一个新区块都伴随着一定数量从无到有的全新比特币。每开采210,000个块,大约耗时4年,货币发行速率降低50%。

在2016年的某个时刻,在第420,000个区块被“挖掘”出来之后降低到12.5比特币/区块。在第13,230,000个区块(大概在2137年被挖出)之前,新币的发行速度会以指数形式进行64次“二等分”。到那时每区块发行比特币数量变为比特币的最小货币单位——1聪。最终,在经过1,344万个区块之后,所有的共20,999,999.9769亿聪比特币将全部发行完毕。换句话说, 到2140年左右,会存在接近2,100万比特币。在那之后,新的区块不再包含比特币奖励,矿工的收益全部来自交易费。

在收到交易后,每一个节点都会在全网广播前对这些交易进行校验,并以接收时的相应顺序,为有效的新交易建立一个池(交易池)。

每一个节点在校验每一笔交易时,都需要对照一个长长的标准列表:

交易的语法和数据结构必须正确。

输入与输出列表都不能为空。

交易的字节大小是小于MAX_BLOCK_SIZE的。

每一个输出值,以及总量,必须在规定值的范围内 (小于2,100万个币,大于0)。

没有哈希等于0,N等于-1的输入(coinbase交易不应当被中继)。

nLockTime是小于或等于INT_MAX的。

交易的字节大小是大于或等于100的。

交易中的签名数量应小于签名操作数量上限。

解锁脚本(Sig)只能够将数字压入栈中,并且锁定脚本(Pubkey)必须要符合isStandard的格式 (该格式将会拒绝非标准交易)。

池中或位于主分支区块中的一个匹配交易必须是存在的。

对于每一个输入,如果引用的输出存在于池中任何的交易,该交易将被拒绝。

对于每一个输入,在主分支和交易池中寻找引用的输出交易。如果输出交易缺少任何一个输入,该交易将成为一个孤立的交易。如果与其匹配的交易还没有出现在池中,那么将被加入到孤立交易池中。

对于每一个输入,如果引用的输出交易是一个coinbase输出,该输入必须至少获得COINBASE_MATURITY (100)个确认。

对于每一个输入,引用的输出是必须存在的,并且没有被花费。

使用引用的输出交易获得输入值,并检查每一个输入值和总值是否在规定值的范围内 (小于2100万个币,大于0)。

如果输入值的总和小于输出值的总和,交易将被中止。

如果交易费用太低以至于无法进入一个空的区块,交易将被拒绝。

每一个输入的解锁脚本必须依据相应输出的锁定脚本来验证。

以下挖矿节点取名为 A挖矿节点

挖矿节点时刻监听着传播到比特币网络的新区块。而这些新加入的区块对挖矿节点有着特殊的意义。矿工间的竞争以新区块的传播而结束,如同宣布谁是最后的赢家。对于矿工们来说,获得一个新区块意味着某个参与者赢了,而他们则输了这场竞争。然而,一轮竞争的结束也代表着下一轮竞争的开始。

验证交易后,比特币节点会将这些交易添加到自己的内存池中。内存池也称作交易池,用来暂存尚未被加入到区块的交易记录。

A节点需要为内存池中的每笔交易分配一个优先级,并选择较高优先级的交易记录来构建候选区块。

一个交易想要成为“较高优先级”,需满足的条件:优先值大于57,600,000,这个值的生成依赖于3个参数:一个比特币(即1亿聪),年龄为一天(144个区块),交易的大小为250个字节:

High Priority > 100,000,000 satoshis * 144 blocks / 250 bytes = 57,600,000

区块中用来存储交易的前50K字节是保留给较高优先级交易的。 节点在填充这50K字节的时候,会优先考虑这些最高优先级的交易,不管它们是否包含了矿工费。这种机制使得高优先级交易即便是零矿工费,也可以优先被处理。

然后,A挖矿节点会选出那些包含最小矿工费的交易,并按照“每千字节矿工费”进行排序,优先选择矿工费高的交易来填充剩下的区块。

如区块中仍有剩余空间,A挖矿节点可以选择那些不含矿工费的交易。有些矿工会竭尽全力将那些不含矿工费的交易整合到区块中,而其他矿工也许会选择忽略这些交易。

在区块被填满后,内存池中的剩余交易会成为下一个区块的候选交易。因为这些交易还留在内存池中,所以随着新的区块被加到链上,这些交易输入时所引用UTXO的深度(即交易“块龄”)也会随着变大。由于交易的优先值取决于它交易输入的“块龄”,所以这个交易的优先值也就随之增长了。最后,一个零矿工费交易的优先值就有可能会满足高优先级的门槛,被免费地打包进区块。

UTXO(Unspent Transaction Output) : 每笔交易都有若干交易输入,也就是资金来源,也都有若干笔交易输出,也就是资金去向。一般来说,每一笔交易都要花费(spend)一笔输入,产生一笔输出,而其所产生的输出,就是“未花费过的交易输出”,也就是 UTXO。

块龄:UTXO的“块龄”是自该UTXO被记录到区块链为止所经历过的区块数,即这个UTXO在区块链中的深度。

区块中的第一笔交易是笔特殊交易,称为创币交易或者coinbase交易。这个交易是由挖矿节点构造并用来奖励矿工们所做的贡献的。假设此时一个区块的奖励是25比特币,A挖矿的节点会创建“向A的地址支付25.1个比特币(包含矿工费0.1个比特币)”这样一个交易,把生成交易的奖励发送到自己的钱包。A挖出区块获得的奖励金额是coinbase奖励(25个全新的比特币)和区块中全部交易矿工费的总和。

A节点已经构建了一个候选区块,那么就轮到A的矿机对这个新区块进行“挖掘”,求解工作量证明算法以使这个区块有效。比特币挖矿过程使用的是SHA256哈希函数。

用最简单的术语来说, 挖矿节点不断重复进行尝试,直到它找到的随机调整数使得产生的哈希值低于某个特定的目标。 哈希函数的结果无法提前得知,也没有能得到一个特定哈希值的模式。举个例子,你一个人在屋里打台球,白球从A点到达B点,但是一个人推门进来看到白球在B点,却无论如何是不知道如何从A到B的。哈希函数的这个特性意味着:得到哈希值的唯一方法是不断的尝试,每次随机修改输入,直到出现适当的哈希值。

需要以下参数

• block的版本 version

• 上一个block的hash值: prev_hash

• 需要写入的交易记录的hash树的值: merkle_root

• 更新时间: ntime

• 当前难度: nbits

挖矿的过程就是找到x使得

SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET

上式的x的范围是0~2^32, TARGET可以根据当前难度求出的。

简单打个比方,想象人们不断扔一对色子以得到小于一个特定点数的游戏。第一局,目标是12。只要你不扔出两个6,你就会赢。然后下一局目标为11。玩家只能扔10或更小的点数才能赢,不过也很简单。假如几局之后目标降低为了5。现在有一半机率以上扔出来的色子加起来点数会超过5,因此无效。随着目标越来越小,要想赢的话,扔色子的次数会指数级的上升。最终当目标为2时(最小可能点数),只有一个人平均扔36次或2%扔的次数中,他才能赢。

如前所述,目标决定了难度,进而影响求解工作量证明算法所需要的时间。那么问题来了:为什么这个难度值是可调整的?由谁来调整?如何调整?

比特币的区块平均每10分钟生成一个。这就是比特币的心跳,是货币发行速率和交易达成速度的基础。不仅是在短期内,而是在几十年内它都必须要保持恒定。在此期间,计算机性能将飞速提升。此外,参与挖矿的人和计算机也会不断变化。为了能让新区块的保持10分钟一个的产生速率,挖矿的难度必须根据这些变化进行调整。事实上,难度是一个动态的参数,会定期调整以达到每10分钟一个新区块的目标。简单地说,难度被设定在,无论挖矿能力如何,新区块产生速率都保持在10分钟一个。

那么,在一个完全去中心化的网络中,这样的调整是如何做到的呢?难度的调整是在每个完整节点中独立自动发生的。每2,016个区块(2周产生的区块)中的所有节点都会调整难度。难度的调整公式是由最新2,016个区块的花费时长与20,160分钟(两周,即这些区块以10分钟一个速率所期望花费的时长)比较得出的。难度是根据实际时长与期望时长的比值进行相应调整的(或变难或变易)。简单来说,如果网络发现区块产生速率比10分钟要快时会增加难度。如果发现比10分钟慢时则降低难度。

为了防止难度的变化过快,每个周期的调整幅度必须小于一个因子(值为4)。如果要调整的幅度大于4倍,则按4倍调整。由于在下一个2,016区块的周期不平衡的情况会继续存在,所以进一步的难度调整会在下一周期进行。因此平衡哈希计算能力和难度的巨大差异有可能需要花费几个2,016区块周期才会完成。

举个例子,当前A节点在挖277,316个区块,A挖矿节点一旦完成计算,立刻将这个区块发给它的所有相邻节点。这些节点在接收并验证这个新区块后,也会继续传播此区块。当这个新区块在网络中扩散时,每个节点都会将它作为第277,316个区块(父区块为277,315)加到自身节点的区块链副本中。当挖矿节点收到并验证了这个新区块后,它们会放弃之前对构建这个相同高度区块的计算,并立即开始计算区块链中下一个区块的工作。

比特币共识机制的第三步是通过网络中的每个节点独立校验每个新区块。当新区块在网络中传播时,每一个节点在将它转发到其节点之前,会进行一系列的测试去验证它。这确保了只有有效的区块会在网络中传播。

每一个节点对每一个新区块的独立校验,确保了矿工无法欺诈。在前面的章节中,我们看到了矿工们如何去记录一笔交易,以获得在此区块中创造的新比特币和交易费。为什么矿工不为他们自己记录一笔交易去获得数以千计的比特币?这是因为每一个节点根据相同的规则对区块进行校验。一个无效的coinbase交易将使整个区块无效,这将导致该区块被拒绝,因此,该交易就不会成为总账的一部分。

比特币去中心化的共识机制的最后一步是将区块集合至有最大工作量证明的链中。一旦一个节点验证了一个新的区块,它将尝试将新的区块连接到到现存的区块链,将它们组装起来。

节点维护三种区块:

· 第一种是连接到主链上的,

· 第二种是从主链上产生分支的(备用链),

· 第三种是在已知链中没有找到已知父区块的。

有时候,新区块所延长的区块链并不是主链,这一点我们将在下面“ 区块链分叉”中看到。

如果节点收到了一个有效的区块,而在现有的区块链中却未找到它的父区块,那么这个区块被认为是“孤块”。孤块会被保存在孤块池中,直到它们的父区块被节点收到。一旦收到了父区块并且将其连接到现有区块链上,节点就会将孤块从孤块池中取出,并且连接到它的父区块,让它作为区块链的一部分。当两个区块在很短的时间间隔内被挖出来,节点有可能会以相反的顺序接收到它们,这个时候孤块现象就会出现。

选择了最大难度的区块链后,所有的节点最终在全网范围内达成共识。随着更多的工作量证明被添加到链中,链的暂时性差异最终会得到解决。挖矿节点通过“投票”来选择它们想要延长的区块链,当它们挖出一个新块并且延长了一个链,新块本身就代表它们的投票。

因为区块链是去中心化的数据结构,所以不同副本之间不能总是保持一致。区块有可能在不同时间到达不同节点,导致节点有不同的区块链视角。解决的办法是, 每一个节点总是选择并尝试延长代表累计了最大工作量证明的区块链,也就是最长的或最大累计难度的链。

当有两个候选区块同时想要延长最长区块链时,分叉事件就会发生。正常情况下,分叉发生在两名矿工在较短的时间内,各自都算得了工作量证明解的时候。两个矿工在各自的候选区块一发现解,便立即传播自己的“获胜”区块到网络中,先是传播给邻近的节点而后传播到整个网络。每个收到有效区块的节点都会将其并入并延长区块链。如果该节点在随后又收到了另一个候选区块,而这个区块又拥有同样父区块,那么节点会将这个区块连接到候选链上。其结果是,一些节点收到了一个候选区块,而另一些节点收到了另一个候选区块,这时两个不同版本的区块链就出现了。

分叉之前

分叉开始

我们看到两个矿工几乎同时挖到了两个不同的区块。为了便于跟踪这个分叉事件,我们设定有一个被标记为红色的、来自加拿大的区块,还有一个被标记为绿色的、来自澳大利亚的区块。

假设有这样一种情况,一个在加拿大的矿工发现了“红色”区块的工作量证明解,在“蓝色”的父区块上延长了块链。几乎同一时刻,一个澳大利亚的矿工找到了“绿色”区块的解,也延长了“蓝色”区块。那么现在我们就有了两个区块:一个是源于加拿大的“红色”区块;另一个是源于澳大利亚的“绿色”。这两个区块都是有效的,均包含有效的工作量证明解并延长同一个父区块。这个两个区块可能包含了几乎相同的交易,只是在交易的排序上有些许不同。

比特币网络中邻近(网络拓扑上的邻近,而非地理上的)加拿大的节点会首先收到“红色”区块,并建立一个最大累计难度的区块,“红色”区块为这个链的最后一个区块(蓝色-红色),同时忽略晚一些到达的“绿色”区块。相比之下,离澳大利亚更近的节点会判定“绿色”区块胜出,并以它为最后一个区块来延长区块链(蓝色-绿色),忽略晚几秒到达的“红色”区块。那些首先收到“红色”区块的节点,会即刻以这个区块为父区块来产生新的候选区块,并尝试寻找这个候选区块的工作量证明解。同样地,接受“绿色”区块的节点会以这个区块为链的顶点开始生成新块,延长这个链。

分叉问题几乎总是在一个区块内就被解决了。网络中的一部分算力专注于“红色”区块为父区块,在其之上建立新的区块;另一部分算力则专注在“绿色”区块上。即便算力在这两个阵营中平均分配,也总有一个阵营抢在另一个阵营前发现工作量证明解并将其传播出去。在这个例子中我们可以打个比方,假如工作在“绿色”区块上的矿工找到了一个“粉色”区块延长了区块链(蓝色-绿色-粉色),他们会立刻传播这个新区块,整个网络会都会认为这个区块是有效的,如上图所示。

所有在上一轮选择“绿色”区块为胜出者的节点会直接将这条链延长一个区块。然而,那些选择“红色”区块为胜出者的节点现在会看到两个链: “蓝色-绿色-粉色”和“蓝色-红色”。 如上图所示,这些节点会根据结果将 “蓝色-绿色-粉色” 这条链设置为主链,将 “蓝色-红色” 这条链设置为备用链。 这些节点接纳了新的更长的链,被迫改变了原有对区块链的观点,这就叫做链的重新共识 。因为“红”区块做为父区块已经不在最长链上,导致了他们的候选区块已经成为了“孤块”,所以现在任何原本想要在“蓝色-红色”链上延长区块链的矿工都会停下来。全网将 “蓝色-绿色-粉色” 这条链识别为主链,“粉色”区块为这条链的最后一个区块。全部矿工立刻将他们产生的候选区块的父区块切换为“粉色”,来延长“蓝色-绿色-粉色”这条链。

从理论上来说,两个区块的分叉是有可能的,这种情况发生在因先前分叉而相互对立起来的矿工,又几乎同时发现了两个不同区块的解。然而,这种情况发生的几率是很低的。单区块分叉每周都会发生,而双块分叉则非常罕见。

比特币将区块间隔设计为10分钟,是在更快速的交易确认和更低的分叉概率间作出的妥协。更短的区块产生间隔会让交易清算更快地完成,也会导致更加频繁地区块链分叉。与之相对地,更长的间隔会减少分叉数量,却会导致更长的清算时间。

Ⅸ 挖矿到底在计算什么

比特币挖矿到底在计算什么?如何看待比特币挖矿,比特币的挖矿对于不同的矿工而言是一种竞争记账权的合作记账行为,在合作的大框架下有序地竞争。也就是利用电脑硬件计算出比特币的位置并获取的过程称之为挖矿。挖矿既能生产比特币,又能保障交易信息,下面来具体解释挖矿。

比特币在2017年底暴涨至将近20万人民币一枚,不仅火了数字货币行业,更是火爆了区块链行业,正因为如此,很多人想方设法去挖矿,获取比特币来实现自己的财富自己,首先,”比特币“挖矿是怎挖的,比特币是一中虚拟货币,基于区块链技术。如果我们简单地把区块链的区块比作一个个的账本,那么”挖矿“就是“打包”过去十分钟整个区块链网络的交易,把这些交易写入新的区块,那么就“打包”完成,那就是完成了“挖矿”旅搭誉。完成了挖矿之后就获得了系统分发给你的比特币。这就是比特币“挖矿”比较简化的说法,当中的原理和运行还是相当复杂的。

如何分配“打包权”

比特币的价格超过2w元一个,每一次获得“打包权”,完成工作就会获得12.5个比特币(会随时间递减),获利可谓相当丰厚。

天下熙熙皆为利来天下攘攘皆为利往,只要有利润的地方就有人。网络上矿工众多,那么如何确定应该分配给哪个矿工去做这事呢?

比特币的创始人中本聪采用这种方法:采用一种叫“工作证明(Proof Of Work,简称POW)机制,即工作量的证明。

这种方法通常来说只能从结果证明,因为监测工作过程通常是繁琐与低效的。这是用来确认你做过一定量的工作,但是监测工作的整个过程极为低效,而通过对工作的结果进行认证来证明完成了相应的工作量,则是一种非常高效的方式。

我们可以比喻成,要证明您会开车技术好,企业不可能给您几天时间,跟着您在市区上走。但是,你可以提供驾驶证和之前在公交车公司当公交车司机的工作证明, 来说明您得能力。你要获得这个能力需要付出大量的时间和精力,但是企业验证却非常简单。

比特币这种加密系统所使用工作量证明机制的证明是哈希现金,需要算出对应的哈希函数。哈希现金是一种工作量证明机制,它是亚当·贝克在1997年发明的,主要用于抵抗邮件的拒绝服务攻击及垃圾邮件网关滥用。在比特币之前,哈希现金被用于垃圾邮件的过滤,也被微软用于hotmail等产品中。

对于比特币这种加密系统所使用的哈希函数,它需要具备以下的性质:

1. 免碰撞,即不会出现输入x≠y,但是H(x)=H(y)

2. 隐匿性,也就是说,对于一个给定的输出结果H(x),想要逆推出输入x,在计算上是不可能的。

3. 不存在比穷举更好的方法,可以使哈希结果H(x)落在特定的范围。

比特币在区块链的生枝锋成过程中使用了POW机制,一个符合要求的区块哈希函数由N个前导零构成,零的个数取决于网络的拆段难度值。

要得到合理的区块哈希码需要经过大量尝试计算。当某个节点提供出一个合理的区块哈希值,那就是说明该节点确实经过了大量的尝试计算,那么系统就把”打包权“分配给该节点(矿工)

当然这不能得出计算次数的绝对值,因为寻找合理hash是一个概率事件,所以当节点(矿工)拥有占全网n%的算力时,该节点基本上就是有n/100的概率找到区块哈希。那就是意思上说比拼算力。

当能不能记住前面几个0,然后可以使用呢?不能的,因为难度值不一样, 0的数量就不一样。而且要证明的数是一个哈希码,而且需要验证的工作量证明非常庞大,基本上无法造假。只存在一个方法:穷举!

那么意味着,你不仅要算出你的哈希值,还需要对比对不对,如果不对的话继续算。

所以需要大量的显卡进行大量的并行运算,获取哈希值。让我们来看看,矿场是一个怎么样的存在:

这些矿场都是用很贵的显卡来算,他们的算里是人工的N倍。如果单靠人力,算十年都没有它们工作一小时的工作量大。

比特币和传统货币不同,美元和英镑这种法币由央行和金融机构管理,进行转账交易时这些机构也同时参与,而比特币只在分布式账本中进行交易,每一项交易就储存在比特币的全球网络节点中,不可复制,不可篡改。所以每个储存数据的节点都会有相应的奖励,目前已经开采的节点有1700万个,比特币总量只有2100万个,意味着还有400万个比特币待开采。

热点内容
区块链的超强技术特点有 发布:2025-06-30 20:02:47 浏览:369
本能区块链ibt市场价 发布:2025-06-30 19:37:27 浏览:910
区块链以什么形式出现 发布:2025-06-30 19:25:25 浏览:496
币市链圈怎么看 发布:2025-06-30 19:22:35 浏览:197
区块链晦涩段子 发布:2025-06-30 19:22:25 浏览:68
abuntu安装区块链 发布:2025-06-30 19:13:37 浏览:111
trx4兼容的电机齿 发布:2025-06-30 19:09:12 浏览:194
合约125倍买涨一直涨怎么算 发布:2025-06-30 19:08:31 浏览:601
数字货币二三四五 发布:2025-06-30 18:39:20 浏览:480
交换机con与eth 发布:2025-06-30 18:35:27 浏览:153