BTC挖矿原理
挖矿
抛出三个问题: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的数越多计算难度越大。