比特币挖矿相关问题
1、比特币节点
- 运行区块链软件的计算机就是一一个节点
· 每个比特币钱包都是一一个节点 - 全节点
· 拥有完整区块链账本的节点叫做全节点,负责比特币转账交易的广播和验证
· 同步整个区块链并对交易做验证,同时中继区块的在网络上的传播 - 轻节点
· 不挖矿,只进行比特币交易的普通节点 - 挖矿节点
· 带挖矿功能的全节点
· 转账交易发生后由所有节点共同广播至全网,挖矿节点验证该交减后会记录至区块链账本
· 挖矿节点一般就是记账节点 - 因为不需要安装全节点也可以进行比特币转账,所以比特币全节点个数只占全部节点数的一-小部分。目前比特币网络中大约有500万节点,其中全节点有1万多。
2、 挖矿、矿工、矿机、矿场、矿池:
挖矿是在争取记账权,将一-段时间内比特币系统中发生的交易进行确认,并记录在区块链上的过程。
· 挖矿实际就是矿工之间比拼算力,拥有较大算力的矿工挖到比特币的概率更大
· 挖矿需要矿机、比特币地址、挖矿软件
· 比特币挖矿软件,分配好每台矿机的任务就可以挖矿了。每种代币的算法不同,所需的矿机各不相同。矿工:从事虚拟货币挖掘的人就是比特币矿工
· 矿工的主要工作是交易确认和数据打包。
· 实际挖矿不需要矿工实际动手,由电脑执行特定运算,只要保证电力供应和网络连接就可以了。矿机:矿机就是通过大量计算来争夺记账权的专业设备,通过争夺记账权获得比特币奖励。
· 矿机由挖矿芯片、散热片、风扇组成
· 只执行单一的计算程序,耗电量很大矿场:矿机集中起来形成矿场和矿池
· 矿场只负责计算。-
矿池:参与挖矿的人数越来越多,全网算力上涨,挖矿难度持续上涨,单个设备或少量算力都是很难再挖到比特币,这时矿池诞生了。很多矿工加入矿池一起挖矿。
· 矿池突破地理位置限制,将分散在全球的矿工及矿场的算力连接到一起挖矿。
· 矿池负责信息打包,接入到矿池的矿场负责计算,竞争记账权。
· 挖到比特币后,矿池根据矿场的算力占比分配收益,以此保证更稳定的投入产出
· 矿池算力越大,挖到比特币的概率就更高。
· 全球算力较大的矿池鱼池F2Pool
蚁池AntPool
国池btcc.com、
币网bw.com、
BitFury
3、 挖矿设备
- CPU挖矿
- GPU挖矿 :2010年9月18日,第一张显卡挖矿软件发布,一张显卡=几十张cpu
- 专业矿机挖矿:蚂蚁矿机=30000张GPU
- 矿场挖矿
- 矿池挖矿
4、 算力
- 计算能力。目前主流的矿机为14T左右的计算量级。即一台矿机就能每秒做至少1.4* 10的13次方次hash碰撞。一台14T的矿机就有14T的算力。
5、哈希算法
Hash算法是现代密码体系中的一一个重要组成部分,主要用于信息安全领域中加密算法。
Hash算法是一种只能加密不能解密的算法,可以将任意长度的信息转成杂乱的固定长度的字符串,叫做Hash值,又称"数字摘要”、 “消息摘要” (Message Digest)或“杂凑字符串”.也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。
由于非对称算法的运算速度较慢,所以在数字签名协议中,哈希函数扮演了一个重要的角色而被用于数字签名。
著名的hash算法有MD5和SHA-1 (Secure Hash Algorithm,安全Hash算法) ,是应用最广泛的Hash算法,而它们都是以MD4为基础设计的。由于MD5及SHA-1的安全受到质疑,比特币系统中使用SHA 256。
哈希算法具有以下两个特点:
1、输入值只要改变-一点,输出的hash值会天差地别。因此只有完全一样的输入值才 能达到完全一样的输出值;
2、输入值和输出值之间没有规律,所以不能通过输出值反推出输入值。
6、难度、难度目标、难度重定
-
难度Difficulty:
整个网络会通过调整“难度”这个变量来控制生成工作量证明所需要的计算力。
随着难度增加,矿工通常在循环便利4亿次随机数值后仍未找到区块,则会启用超额随机数。
-
难度目标Bits:
- 使整个网络的计算力大致每10分钟产生一个区 块所需要的难度数值即为难度目标。Bits是用来存储难度目标的16进制数值。
例如516532块:
1. Bits = "Ox17502ab7" 2. coefficient系数,coefficient = 0x502ab7 3. exponent指数,exponent = 0x17 4. target = coefficient * Math.pow(2, 8 * (exponent- 3)) 5.目标hash: 00000000000000000502ab700000000d6420b16625d309c4561290000000000 6.实际hash: 0000000000000000041ff1cfc5f15f929c1a45d262f88e4db83680d90658c0c 7. Bits值越小,难度越大,越难挖矿。
.难度重定:
· 全网中每新增2016个区块,全网难度将重新计算,该新难度值将依据前2016个区块的哈希算力而定。。按每10分钟产生一一个区块的速度计算,每产生2016个区块大约需要14天,也就是两周。
- 使整个网络的计算力大致每10分钟产生一个区 块所需要的难度数值即为难度目标。Bits是用来存储难度目标的16进制数值。
https://bitcoincash.blockexplorer.com
7、区块结构
区块包括 : 区块头、区块体
区块体记载了交易详情、交易计数器、区块大小
-
区块头 : 是每个区块的前80个字节(640bits) 。包含6部分信息
。Version版本号,占4字节
。前一个区块的hash,占32字节
。本区块所有交易的默克尔根,占32字节。
。时间戳,占4字节· 比特币是P2P网络,没有中心服务器,每个节点的时间戳有可能不一样。因此比特币系统规定:
--- · 1、新区块时间戳要大于前11个区块平均时间戳;
--- · 2、不超过当前网络时间2个小时。
· 所以后一个区块时间戳比前一一个区块的时间戳反而小也是有可能的。
。难度目标Bits,占4字节
。随机数Nonce,占4字节。
--- ·Nonce是全网矿工计算当前区块hash值的核心参数。
--- ·Nonce的取值范围是0-2的32次方(42亿)
- 进制小常识
计算机存储单位就是: bit (位)、B (Byte, 字节)、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB、CB、XB。
. 1字节= 8bits (2进制)
. 1字节= 2bits (16进制)
. 两位16进制数就是一一个字节
8、默克尔树及默克尔根
- Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树;
- 每条交易信息都具有hash值,将所有交易按照手续费高低排序,第一笔交易是挖矿所得的coinbase交易。挖矿系统将该区块能容纳下的所有交易信息打包,两两hash。如果出现奇数,则复制自身然后hash;
- Coinbase交易是每个区块中的第一一个交易,该交易是由矿工创建的,交易内容是系统奖励给矿工的比特币;生成一棵完整的Merkle树需 要递归地对哈希节点对进行哈希,并将新生成的哈希节点插入到Merkle树中,直到只剩一一个哈希节点,该节点就是Merkle树的根;
- 区块链的区块头必须包含区块中所有交易哈希计算得到的有效默克尔根。而该值也是挖矿非常重要的参数。
9、挖矿原理
- 挖矿的过程就是重复计算区块头的hash,不断的修改随机数Nonce,只到小于难度目标Bits计算出来的hash。
- 以125552区块为例,模拟-一一个验证挖矿的过程:
。 将区块头中六个参数以十六进制的小端结尾方式连接在一起
。 版本号: 0000001
version = "01000000"
。 上一块的hash: 0000000000008a3a41 b85b8b29ad444def299fee21793cd8b9e567eab02cd81
pre_ hash =
"81cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a30800000000000"
merkle根: 2b 12fcf1 b09288fcaff797d71e950e71ae42b91e8bdb2304758dfcffc2b620e3
merkle_ root =
"e320b6cfffc8d750423db8bleb942ae710e951ed797f7affc8892b0f1fc122b"。
时间戳: 1305998791 (May 22, 2011 1:26:31 AM,转成16进制为: 4dd7f5c7)
timeStamp = "c7f5d74d"。
难度目标Bits: 1a44b9f2
bits = "f2b9441a"
Nonce: 2504433986, 10进制转16进制为: 9546a142
nonce = "42a14695"
。 header_ hex = version + pre_ hash + merkle_ root + timeStamp + bits + nonce经过两次hash256算法以及转码,能得出以下结果:
1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e000000000000000
。 将十六进制的大小端颠倒顺序,得出以下结果:
0000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d
。 高度为125552的区块目标hash为:
00000000000044b9f1ffff42e33d248e71469a7653bb7d6800000000000
。比对大小: 实际计算的hash值<目标hash,所以验证成功。