概述
挖矿的用途
1. 抢夺区块打包权
2. 验证交易事务
3. 奖励发行新币
4. 广播新区块
大家约定一个规则,共同按照这个规则竞争,竞争成功谁就有数据打包权,打包完成后广播给别人,别人验证无问题就存入自己的数据文件中。
规则------->工作量证明
难度值: 一个门槛
规定一个256位的证书,作为难度为1的目标值:
X00000000FFFFFFF.......
当时全网的算力,大约需要10分钟左右的运算能得到一个符合这个难度为1的值。
0号区块的难度信息
"nonce": 2083236893
"bits": "1d00ffff"
"difficulty": 1
noce:一个随机数,挖矿计算得到
bits: 存储难度的十六进制目标值,存储在区块头部
源码中,用4字节,32位存储256位长度的难度目标值(压缩过)
压缩方法:
1. 4个字节的高位字节用来存储难度值得有效字节数
有效字节数: 从第一个不全为0的字节开始的部分。
约定:如果难度值有效位的最高位为1,则需要在前面补上0x00
举例:难度为1的目标值,X00000000FFFFFFF.......(十六进制计数,没一位两个字节,所以前8个0为4字节),有四个字节长度为0,减掉这些0的长度共计32bit,剩余256-32=224,也就是28个字节,因为F转换为2进制为1111,第一位为1,所以补上0x00,因此有效位总计29个字节,29的十六进制为1D
2. 另外3个字节中存储的是目标值有效位的最高3个字节,此时目标 值有效位前面已经加上2个0,因此最高3个字节为0x00FFFF,合起来压缩后的值就是0x1D00FFFF
此4个字节前2位通常为幂或指数,后6位为系数:目标值 = 系数*2^(8*(指数-3))次方
难度值:差不多两周调整一下新的难度值,算力在增加。为了维持差不多10分钟出一个区块,难度要跟随算力变化而调整。
难度值会越来越大,目标值会越来越小,目标值越小越难挖矿。
新的难度值 = 当前难度值*(最近的2016个区块的实际出块时间/2016分钟)
挖矿计算
1.挖矿的计算公式:
SHA256(
SHA256(version + prev_hash + markle_root + ntime + nbits + nonce)
) < TARGET
TARGET: 难度目标值,如果计算出来的值小于这个值,就算挖矿成功
各名词解释:
version : 区块的版本号
prev_hash: 前一个区块的哈希值
merkle_root: 准备打包的交易事务哈希树,也就是梅克尔根
ntime: 区块时间戳
nbits: 当前难度
noce: 随机数
以上为去块头组成部分。
挖矿
- 概念
挖矿就是重复计算区块头的哈希值,不断修改该参数,直到与难度目标值匹配的一个过程,多个节点同时匹配,谁的链最长为准。 - cainbase交易
挖矿奖励作为一条交易事务包含在区块的交易事务中的,相当于系统给矿工转了一笔比特币。一般位于区块的第一条。 - 挖矿奖励规则
2019年1月创建出第一个区块,每21万区块产量减半(大约4年),到2140年,所有比特币(20999999.98)将全部发行完毕。 - 比特币钱包
比特币地址生成过程:
核心钱包,轻钱包
核心钱包: 完整交易验证,是否有足够余额,是否双花。
跟核心客户端在一起,可以创建钱包地址,收发比特币,加密钱包,备份钱包 - SPV钱包
大致过程:
1.下载完整区块头数据,区块头中包含区块的梅克尔根------->SPV方式靠它实现
2.算出待验证支付的交易事务哈希值taHash
3.找到taHash所在的区块,验证一下所有区块的区块头是否包含在账本数据中
4.获得所在区块中计算梅克尔根所需要的哈希值
5.计算出梅克尔根
6.若计算结果与所在区块的梅克尔根相等,则支付交易是存在的
7.根据该区块所处的高度位置,还可以确定该交易得到了多少个确认
注:仅能看到当前支付的支付交易是否被发起而已,并不能保证这笔交易事务最终进入到主链中,需要等待核心节点进行全面的交易验证,并且矿工打包到区块后进入主链。 - 管理多个私钥的钱包技术(分层确定性钱包(HD Wallets))
特点:- 用一个随机数来生根私钥,这与任何一个比特币钱包生成私钥没区别
- 用一个确定的,不可逆的算法,基于根私钥生成任意数量的子私钥
- 未花费事务输出,UTXO,(Unspent Transaction Output)
a.比特币的交易不是通过账户的增减来实现的,而是一笔笔关联的输入/输出交易事务
b.花费"输入",产生"输出",这个输出就是"未花费过的交易输出",也就是UTXO.每一笔交易事务都由一个唯一的编号,称交易事务ID,通过哈希计算而来,引用"输出",主要提供交易事务id和所处"输出"猎豹中的序号就可以了。
c.由于没有账户的概念,因此当"输入"部分的金额大于所需"输出",必须给自己找零,这个找零也是作为交易的一部分包含在"输出中"
证明哪一条UTXO是属于谁
1.输入脚本,2.输出脚本。也叫锁定脚本和解锁脚本。
1.用私钥签名解锁自己的某一条UTXO(也是之前的输出)
2.对方公钥锁定新的"输出",成功后,这笔新的"输出"就成了对方的UTXO通过输入,输出脚本实现转账。
原文地址:http://blog.51cto.com/xiaofengfeng/2093955
时间: 2024-10-10 18:09:11