如何徒手挖比特币 (新手如何挖比特币)
如何徒手挖比特币 (新手如何挖比特币)
想要徒手挖比特币,我们就需要一些工具。你看人家挖矿用的都是什么矿卡呀?什么gtx1060啊,都是高端配置。我徒手挖比特币也不能示弱,那我们要准备什么东西呢?我们要准备以下几样东西。
一支铅笔或者是自动铅笔,一块橡皮和多张格子纸。
高端配置,奢华享受
一下就露出了王者气质,那真是不知道比他们高到哪里去了。当然在这之前呢,我们需要准备一些数据。
第一个叫做时间戳,时间戳是指格林威治时间1970年1月1日0:00:00起至现在的总秒数。去网上(
第二个呢,需要找到前一个块的哈希,默克尔树根和nbit,这个你可以在网络(
还有你需要准备的一个叫做target的东西,这个呢,可以在网络上查到difficulty(
好了,那我们所有的数据就都准备完成了,那我们就可以正式的开始挖矿了。比特币呢是基于一种叫做sha-256的算法来实现挖矿的,虽然这样说并不准确,但是鉴于大家好理解,我就简单说了。sha呢,全称叫做安全散列算法,是NSA的发明。256呢,是指你不管输入多么长的文本,它最终呢都会输出一个256位的二进制数。你可能会想啊,那这样会不会很麻烦啊?经过高玩梁的实测,并不麻烦,你只要有小学四年级的数学水平就可以进行计算(说NSA只有小学四年级水平,举报了 #滑稽)。
首先呢,你需要准备几个他所规定的数值,8个哈希初值和64个哈希常量,大家注意了,这些数都是16进制的,但是别害怕,一点都不难。
十六进制(英文名称:Hexadecimal),是计算机中数据的一种表示方法。同我们日常生活中的表示法不一样。它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15;N进制的数可以用0~(N-1)的数表示,超过9的用字母A-F。
这8个哈希初值分别是:(0x表示后面的数是16进制的)
A= 0x6a09e667
B= 0xbb67ae85
C = 0x3c6ef372
D= 0xa54ff53a
E= 0x510e527f
F = 0x9b05688c
G= 0x1f83d9ab
H= 0x5be0cd19
这些初值是对自然数中前8个质数(2,3,5,7,11,13,17,19)的平方根的小数部分取前32bit而来(不必理解,记住即可)
64个哈希常量是
428a2f9871374491b5c0fbcfe9b5dba53956c25b59f111f1923f82a4ab1c5ed5d807aa9812835b01243185be550c7dc372be5d7480deb1fe9bdc06a7c19bf174e49b69c1efbe47860fc19dc6240ca1cc2de92c6f4a7484aa5cb0a9dc76f988da983e5152a831c66db00327c8bf597fc7c6e00bf3d5a7914706ca63511429296727b70a852e1b21384d2c6dfc53380d13650a7354766a0abb81c2c92e92722c85a2bfe8a1a81a664bc24b8b70c76c51a3d192e819d6990624f40e3585106aa07019a4c1161e376c082748774c34b0bcb5391c0cb34ed8aa4a5b9cca4f682e6ff3748f82ee78a5636f84c878148cc7020890befffaa4506cebbef9a3f7c67178f2
和8个哈希初值类似,这些常量是对自然数中前64个质数(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97…)的立方根的小数部分取前32bit而来。(不必理解,记住即可)
准备好这些之后,我们就开始梳理刚才的数据,按高玩梁现在撰稿的时间(2018-08-23 12:56:16),我们去btc.com挑选一个最新的区块538053(看高度)
区块538053相关数据
我们需要算出这个参数C= version + prev_hash + merkle_root + ntime + nbits,其中
version = 版本号
prev_hash = 前一区块ID的字节反转
merkle_root = 本区块中所有交易的SHA256的墨克哈希树根的字节反转
ntime = 时间戳
nbits = 网络难度
第一个需要的是版本:0x20000000
第二个是需要前一个块的数据反转:0e7168bdd5ebcf97485b74eb10de19a3e718bc42136e12000000000000000000
第三个我们需要Merkle Root的数据反转:66cda53c8201a0f003048fe50522124415944351c7a4b63429fdd64b0c50e4af
第四个我们需要当前的时间戳:1535000176,然后转换成16进制:0x5b7e3e70
十进制数转换成十六进制方法是:除以16取余数
十进制数除以16,所得余数就是转换后的16进制数的最低位,所得的商再除以16得到的余数就是转换后的16进制数的第二位,直到商是0为止,把所有余数分别转换成16进制数,再按顺序排列即可。例如:723转换成16进制过程:
723÷16=45...........3
45÷16=2...............13(D)
2÷16=0................2
注意:13=D
所以:723=0x2D3
第五个是nbit,也就是bits:0x172c0da7
还需要一个随机数X,这个你从0到2^32-1之间选一个数,然后转换成16进制,这里我选择24857190(0x017b4a66,转换成16进制不满8位在前面用0补齐)
然后把他们组合起来,也就是:200000000e7168bdd5ebcf97485b74eb10de19a3e718bc42136e1200000000000000000066cda53c8201a0f003048fe50522124415944351c7a4b63429fdd64b0c50e4af5b7e3e70172c0da7017b4a66
这也就是我们要运算的数据,好,我们正式开始进行sha-256运算,SHA256算法中的预处理就是在想要Hash的消息后面补充需要的信息,使整个消息满足指定的结构。信息的预处理分为两个步骤:附加填充比特和附加长度
二进制和十六进制的简单互转关系,一位十六进制等于4位二进制,因为有如此简单的转换关系,所以计算机通常用十六进制表示数据,而且可以压缩表示二进制串的长度
在报文末尾进行填充,使报文长度在对512取模以后的余数是448(在二进制情况下)
首先我们数数这些一共多少位,得到位数为160位,然后乘4,得到640(二进制位),除以512,得余数为128。然后用448减128,得320,除4,得80,所以我们要在刚才算出的数据后面加80个0。至于为什么这么做,大家可以看文末的参考文章1。
200000000e7168bdd5ebcf97485b74eb10de19a3e718bc42136e1200000000000000000066cda53c8201a0f003048fe50522124415944351c7a4b63429fdd64b0c50e4af5b7e3e70172c0da7017b4a6600000000000000000000000000000000000000000000000000000000000000000000000000000000
附加长度值
附加长度值就是将原始数据(第一步填充前的消息)的长度信息补到已经进行了填充操作的消息后面。我们需要附加上一个64bit(二进制)的数据,用来表示原始报文的长度信息。我们知道刚才的数据一共160位,转换成二进制就是160×4=640位,640转换成十六进制就是0x280,补成64÷4=16位,就是0x0000000000000280,补在刚才的数据后面:
200000000e7168bdd5ebcf97485b74eb10de19a3e718bc42136e1200000000000000000066cda53c8201a0f003048fe50522124415944351c7a4b63429fdd64b0c50e4af5b7e3e70172c0da7017b4a66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280
然后将其转换为8个一组
200000000e7168bdd5ebcf97485b74eb10de19a3e718bc42136e1200000000000000000066cda53c8201a0f003048fe50522124415944351c7a4b63429fdd64b0c50e4af5b7e3e70172c0da7017b4a66000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280
我们就可以正式开始计算了
首先,先准备好那八个哈希初值,ABC一组,D单独一组,EFG一组,H单独一组的顺序排放在上面,各组之间留出足够的空间。写数字的时候也是间隔三个写一个。便于我们将其转化成二进制。最终排放的方法如图所示。
为了方便计算
首先我们要了解下相关的计算:
图中,ABCDEFGH这8个字(word)在按照一定的规则进行更新,其中
深蓝色方块是事先定义好的非线性逻辑函数,上文已经做过铺垫
红色田字方块代表 mod2^32addition,即将两个数字加在一起,如果结果大于2^32,你必须除以2^32并找到余数。
ABCDEFGH一开始的初始值分别为Hi−1(0),Hi−1(1),...,Hi−1(7)Hi−1(0),Hi−1(1),...,Hi−1(7)
Kt是第t个密钥,对应我们上文提到的64个常量
Wt是本区块产生第t个word。原消息被切成固定长度512-bit的区块,对每一个区块,产生64个word,通过重复运行循环n次对ABCDEFGH这八个字循环加密。
最后一次循环所产生的八个字合起来即是第i个块对应到的散列字符串Hi
有人可能就要说啦啊,高玩梁啊,你是不是对四年级有什么误解呀,这个运算完全不太适合四年级的学生来运算啊,别说四年级了,我这大学生也算不了啊。别慌,其实一点都不难,看看下面我的操作你就知道有多简单了
先把ABC和EFG转化为二进制
按照表格一位一位的转化,熟练了就可以背过,比如我
把ABC和EFG转化为二进制
首先对ABC进行maj运算,因为他是按位运算,所以说大家一位一位的看,也就是竖着看。我先给大家算一遍,写出结果。最后结果转化为16进制
这个maj运算怎么算呢?非常简单,抛开复杂的数学计算你可以发现,你只要看见三个数中超过两个1,当然包括两个。那maj运算的结果就是1,反之就是0。
然后呢在对A进行Σ0运算。这个运算的就是分别把A的二进制分别向右移动两位,移动13位和移动22位。当然移走的那些位移到前面去。然后呢?在对其进行异或运算。我先给大家算一遍,大家看看结果。最后结果转换成16进制
移位我就不说了,我们来看看异或运算。抛开复杂的数学计算,我们又发现只要三个数中有奇数个1,结果就是1。偶数个1呢,就是0。
ABC这边的运算已经结束了。我们再看EFG,对EFG进行ch运算,ch运算是所有运算里面最难的。我在给大家算一遍,大家看看结果,
算完之后似乎没有规律可循。但是高玩梁也还是发现了一个不太规范的规律,只要三个数中只有最后一个是1,或者是由两个1挨在一起的,结果是1,反之就是0。
然后在对E进行Σ1运算。Σ1运算和Σ0运算大致相同。只不过它是向右移动6位,11位,和25位。我们仍然可以用上面找的规律对它进行运用。最后把算出来的二进制转化为十六进制。
接下来我们要计算一个值t1 = h + Σ1 + ch + k[i] + w[i],其中i表示轮数减一,现在我们是第一次运算,i=0,k[0]表示第一个哈希常数,也就是0x428a2f98,w[0]我们表示第一块参数,也就是0x20000000
还记得那个红色田字吗?红色田字方块代表 mod2^32addition,即将两个数字加在一起,如果结果大于2^32,你必须除以2^32并找到余数。其实意思就是超过8位的数统统删掉。
然后我们就可以计算新E=t1+D
然后我们计算新A=Σ0+maj+t1
剩下的就可以结束了,因为新h=g,新g=f,新f=d,新d=c,新c=b,新b=a
你认为这样就完成了吗?那是绝对不可能的,这只是进行了sha256的第一轮,其实sha256共有64轮。我们只需要把算出来的这些新的abcdefg投入新的运算当中,继续进行下一轮,只要64轮结束之后,将abcdefg组合起来,就能得到我们想要的sha256的值。
你可能会想啊,这么简单,这也不难啊,64轮我算算也不是不可能的事情啊。那我算出来是不是就能挖到比特币了呢?你要是能挖出来,那些买矿卡的老板不得亏死呀,他直接叫你去算不就好了。实际上比特币算法的公式是这样的:
对你没有看错,比特币的算法并不是一层sha256,而是两层sha256,也就是说你需要进行64+64=128轮的运算。
而且呢,最终难度要小于一个值叫target,这个target可以由下面的一个公式进行计算。首先大家需要找到刚才的那个nbit=0x172c0da7。我们需要通过一个算式来进行计算。
0x2c0da7 * 2**(8*(0x17 - 3))
这个nbit实际上是target的一个压缩版本,我们需要将其解压缩。最后解压出的值是这样的
target=0x2c0da70000000000000000000000000000000000000000
只要你算的sha256小于这个值,就可以说你算出了比特币。
但是果真如此吗?其实从第一步开始就错了。你所计算的都是人家算完了的,也就是说你玩的都是人家玩剩下的。你可能会问啊,这是怎么回事儿啊?实际上在计算的过程中,你发现有一个值叫做默克尔树根Merkle Root了吗?这个呢,是当前区块所有交易的哈希值反转。这个值只能通过比特币网络来获取,并不能在本地实现获取,所以说呢,你获取到的默克尔树根是人家已经算完了的,而不是你自己算的。就因为这一个东西你做不到。
所以说,用手挖比特币基本是不可能完成的,当然如果你能连接比特币网络,得到这个默克尔树根,你仍然可以通徒手来进行计算。
其实比特币真正难的地方不是在挖矿的sha256,而是在于后面有一些椭圆曲线,它涉及到一些32位的大整数的运算,这个高玩梁比较笨啊,那就不详细说了。
参考文献:
SHA256算法原理详解:
比特币挖矿一定要用计算机吗?用纸笔来计算可行吗?:
比特币开发者参考:
理解与计算比特币难度值Difficulty:
以上就是(如何徒手挖比特币 (新手如何挖比特币))全部内容,收藏起来下次访问不迷路!