区块链学习Day02(Pow算法)

区块链学习Day02

Pow

  • Proof-of-Work 简称Pow,即为工作量证明
  • 通过计算一个数值,使得拼凑上交易数据后内容的值满足规定的上限,在节点成功找到满足的Hash值以后,会马上对全网进行广播打包区块,网络的节点收到广播打包区块,会立刻对其进行验证
  • 网络中只有最快解密的区块,才会添加到账本中,其他的节点进行复制,这样就保证了整个账本的唯一性
  • 假如节点有任何的作弊行为,都会导致网络的节点验证不通过,直接丢弃其打包的区块, 这个区块就无法记录到总账本中,作弊的节点耗费的成本就白费了,因此在巨大的挖矿成本下,也使得旷工自觉自愿的遵守比特币系统的共识协议,也就确保了整个系统的安全!

用代码实现以上说明

Pow挖矿案例1

在这里插入图片描述

package main

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"strconv"
	"time"
)

// 通过代码实现挖矿
// 1.声明区块的结构体
type Block struct {
    
    
	//上一个区块的哈希
	PreHash string
	//当前区块的哈希
	HashCode string
	//时间戳
	TimeStamp string
	//当前网络的难度系数
	//控制哈希值有几个前导0
	Diff int
	//存交易信息
	Data string
	//区块高度
	Index int
	//随机值
	Nonce int
}

// 创建区块链首先要有第一个节点,写一个方法生成第一个节点,当然第一个区块是中本聪做的,我们做一个本地即可
// 创建创世区块(链中的第一个区块)
// 需要交易信息参数,最终返回一个区块
func GenerateFirstBlock(data string) Block {
    
    

	//创建第一个区块
	var firstblock Block
	//第一个哈希值是前一个哈希,但是根据基本的数据结构来说,链表来说前一个指向Nil,没有值,用0代表
	firstblock.PreHash = "0"
	//区块的产生时间,用系统当前时间即可 ,我们定义的是string,要转换一下
	firstblock.TimeStamp = time.Now().String()
	//前导0的个数,暂时设置为4 比如 0000
	firstblock.Diff = 4
	firstblock.Data = data
	//因为是创世区块,所以高度是固定为1
	firstblock.Index = 1
	//随机值 暂时为0
	firstblock.Nonce = 0
	//当前块的哈希,
	//通过用sha256算一个真正的哈希
	firstblock.HashCode = GenerationHashValue(firstblock)
	return firstblock
}

// 生成区块的哈希值
// 计算的哈希值,把整个Block传进去
func GenerationHashValue(block Block) string {
    
    
	var hashdata = strconv.Itoa(block.Index) + strconv.Itoa(block.Nonce) + strconv.Itoa(block.Diff) + block.TimeStamp
	//对这个串求哈希算法
	var sha = sha256.New()
	//需要传入数组类型
	sha.Write([]byte(hashdata))
	hashed := sha.Sum(nil)
	//将字节转换为字符串
	return hex.EncodeToString(hashed)
}

// 测试一下
func main() {
    
    
	//创建创世区块
	firstBlock := GenerateFirstBlock("创世区块")
	fmt.Println(firstBlock)
	fmt.Println(firstBlock.Data)
}

结果:
{0 9f59e7313693a21e559b123602bfc68634c935e3303938eb420dc31fe1716ab3 2023-12-22 1
0:28:47.1197946 +0800 CST m=+0.001994501 4 创世区块 1 0}

从结果来看上一个区块的哈希为0,当前区块为9f59…
从这里,看前导0为4的结果是不正确的,所以后面会继续生成

猜你喜欢

转载自blog.csdn.net/weixin_44774466/article/details/135144843