比特币挖矿简介

本文主要介绍比特币挖矿的基本算法,想要了解什么是比特币的同学可以先看这里:什么是比特币
比特币是底层基于区块链的应用,比特币挖矿是将最近的比特币交易数据打包成一个新的区块,添加到区块链中。

挖矿的任务

  • 保证已有比特比交易的正常进行
  • 产生新的比特币

挖矿的收益来源

  • 区块中所包含的每笔交易的交易费
    每笔交易的交易费是不确定的,由交易者自己决定,交易费用高的交易被挖矿者打包成区块的速度更快,从而交易也能更快的确认

  • 生成一个新的区块奖励比特币
    目前生成一个新的区块的奖励12.5的比特币,随着比特币的数量增加,奖励会越来越少。按照现在的挖矿速度,截至2140年挖矿不会产生新的比特币奖励,所有比特币将会挖完(2100万)。这时挖矿收入只能来源比特币交易中的交易费。

比特币区块的结构

在介绍挖矿算法之前先看看比特币区块的结构, 一个完整的区块结构如下,其中主要的数据是区块头和区块中所包含的比特币交易信息

大小 字段 描述
4字节 区块大小 用字节表示的该字段之后的区块大小
80字节 区块头 组成区块头的几个字段
1-9 (可变整数) 交易计数器 交易的数量
可变的 交易 记录在区块里的交易信息

我们主要看区块头的具体结构

大小 字段 描述
4字节 版本 版本号,用于跟踪软件/协议的更新
32字节 父区块哈希值 引用区块链中父区块的哈希值
32字节 Merkle根 该区块中交易的merkle树根的哈希值
4字节 时间戳 该区块产生的近似时间(精确到秒的Unix时间戳)
4字节 难度目标 该区块工作量证明算法的难度目标(difficulty)
4字节 Nonce 用于工作量证明算法的计数器

区块头大小是80个字节,其中包含区块链中上一个区块的hash值,通过hash值可以在链上查找到上一个区块。所以区块链的结构类似单向链表的结构,通过任意一个区块都可以向上查找到比特币的第一个区块(创世区块)。

区块链结构示例(来自《区块链原理,设计与应用》)

在比特币区块链中,第517552号区块头部如下:

比特币挖矿简介_第1张图片
区块链数据(来自 blockchain.info)

生成新区块

挖矿是将80字节的区块头进行SHA256计算,运算结果是一个256位长度的值。然后再通过与当前难度值比较大小来判断当前区块是否合法,计算公式如下:
   HASH256(HASH256(区块头))< pdiff / Diffculty(bdiff)

如果不满足上面的条件,则改变区块头中的随机值(Nonce),然后再重复上面的计算。公式中pdiff 称为矿池难度,是一个256位长度的常量,表示如下:
    0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
前30位是0,后续所有位都是1。

区块头的hash计算所得的值必须介于 0 和 pdiff 之间,而且在这个区间随机取值。Difficult 的取值比 pdiff 小,而且 Difficult 越小,满足条件的Nonce值越难找到,挖矿所需要的时间越长。这里面的 Difficulty 是一个介于 0~ 2^32的值,这个值通常成为 bdiff。

  • 当Difficulty取最小值 1 时,挖矿难度最小,此时区块头的hash值小于pdiff 即可满足条件
  • 当Difficulty取最大值 2^32 时,挖矿难度最大,区块头的hash值必须要小于以下值:0x00000000FFFF0000000000000000000000000000000000000000000000000000

由于Hash算法的特性,上面的公式不能逆向推到。只能通过暴力搜索 Nonce值,使区块头的hash值符合上面的公式。根据当前矿机的算力,平均每十分钟可以算出一个有效的Noce值,生成一个区块。不过这个值不是确定的,可能是几秒钟一个,也有可能是一个小时一个。

参考:
比特币块链和挖矿原理: http://www.8btc.com/bitcoin_block_chain
比特币区块结构解析:https://blog.csdn.net/u013137970/article/details/69891985
区块链技术指南:https://yeasy.gitbooks.io/blockchain_guide/content/

你可能感兴趣的:(比特币挖矿简介)