挖矿

抛出三个问题:1.谁负责记账,2.有什么好处,3.对系统有什么好处(发行货币,安全,一致)

上面说了将数据写到数据库操作叫做记账,那么具体由哪个节点进行记账呢?
– 节点间竞争记账权利的过程就叫做挖矿,竞争成功者获得记账的权利,即挖到矿。
– 每个人都想挖金矿,每个人都想挖比特币。但是有门槛,挖真实的需要有权限,有设备;挖比特币不需要权限,只需要有设备,有电力,但是全世界的一起挖,竞争激烈。
– 记账的过程会得到系统给的奖励。
– 这个过程类似于从一座矿山里从无到有的采集矿石,所以叫做挖矿。
– 挖矿过程就是比特币货币发行过程。
– 挖矿保证了系统的安全,公平的,不确定的。
– 每一个全节点都可以进行进行挖矿,成为矿工,挖矿的能力叫做算力。
– 本质:对区块数据做哈希运算,寻找一个满足条件的随机数。

挖矿的本质:sha256(区块数据+随机数算出的哈希值) < ==小于==目标哈希(0x0000987654321难度值)

0x980x = sha256(基于你现在区块的数据,添加一个随机数num 1) : 0x0000987654321
0x087680x = sha256(基于你现在区块的数据,添加一个随机数num 2) : 0x0000987654321
0x000087654 = sha256(基于你现在区块的数据,添加一个随机数num 100) : 0x0000987654321 此时的n=100就那么足了挖矿条件

1. 难度值谁决定?
难度值由系统统计前2016区块产生区块的平均时间调节。可能变高可能变低,主要是为了保证10分钟出块。

2. 可以不可以自己设置难度值?
不可以。难度值全网一致。

3. 挖矿奖励给谁,算出来num有什么用?
A矿工算出来满足条件的num:100之后,会把自己的区块广播到网络中,由其他的节点检验。

sha256 (区块数据+100) < 0x987654321, 计算的num有效,A矿工挖矿成功,运行A将账本写到自己的本地区块链中,所有其他节点将这个区块添加到自己的本地账本中,下一个挖矿周期开始。

区块链演示

区块模拟

挖矿交易

这个软件的难度值是:0x0001000000000
sha256(111111111 + 38286) = 000094c < 0x0001000000000, 挖矿成功

Tx: Transaction :交易

比特币区块演示链接:https://andersbrownworth.com/blockchain/

矿池运作图示

比特币总量以及奖励计算

package main
import "fmt"

const blockInterval = 21 //万 区块衰减周期 21万区块

func main()  {
	total := 0.0 //总量
	reward := 50.0 //初始奖励
	times := 0 //减半次数
	start := 2009 //起始年份
	for reward > 0 {
		amount := reward*blockInterval //每一个衰减周期生产的数量
		total = total + amount
		reward *= 0.5 //周期减半
		times += 1
		start += 4 //加减半周期
		if reward > 0.00000001{
			fmt.Printf("%d年区块奖励=%.8f\n",start,reward)
		}
	}
	fmt.Println(total)
	fmt.Printf("减半次数%d\n",times) // 2137年后也依然在减半不过奖励将低于0.00000001
}
2013年区块奖励=25.00000000
2017年区块奖励=12.50000000
2021年区块奖励=6.25000000
2025年区块奖励=3.12500000
2029年区块奖励=1.56250000
2033年区块奖励=0.78125000
2037年区块奖励=0.39062500
2041年区块奖励=0.19531250
2045年区块奖励=0.09765625
2049年区块奖励=0.04882812
2053年区块奖励=0.02441406
.....
2100
减半次数1081

BTC转账流程

当前系统中有5000条交易

A:3000条
B:2800条

所有节点不一定交易都相同。
某一个时刻,C节点挖矿成功。C向全网广播,所有其他节点立即停止计算,校验C计算的结果。

数字签名
先执行gettransaction 获取交易 然后将其中的hex编码执行下列命令进行解码

P2P
特点
耐攻击、高容错、地位平等。

应用
BT下载、电驴下载。

挖矿介绍

比特币挖矿就是算一道题,那么怎么计算呢。其他它就是对当前打包好的交易进行哈希sha256运算,那哈希运算很简单,为什么说是难题呢?比特币的难题是要求矿工找一个特定的哈希值,我们都知道哈希运算的结果是毫无规律可循,找一个明确的哈希是不现实的,我们要有难度又要有可行性,所以挖矿要求找一个比目标值小的哈希值即可。

比特币系统中,难度值是系统动态调整的,目的是使整个系统平均10分钟出一个块。

难度值猜测 0x00000000 后面随着前面0的位数越多越难找,区块链上最新区块的哈希值可以看到最新的难度值

hash和nonce值是配套的,只有算出来nonce才能算出hash,满足条件的Nonce有很多个,我们只需要找到一个则代表挖矿成功。

使用代码演示

package main

import (
	"crypto/sha256"
	"fmt"
)

func main()  {
	data := "hello world"
	for i:=0;i<100000;i++{
		hash := sha256.Sum256([]byte(data+string(i)))
		fmt.Printf("hash:%x,nonce:%d\n",hash,i)
	}
}

得出一万条数据发现前有五个0的几乎没有,随着0的数越多计算难度越大。