区块链学习Day03(Pow算法)

这篇具有很好参考价值的文章主要介绍了区块链学习Day03(Pow算法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

生成新区块

声明:笔记用作自己学习,本人也不太讲的清,请见谅。
区块链学习Day03(Pow算法),区块链,学习,算法
生成新的区块,再返回新的块,也会包含上面的属性,前一个哈希也会变得,就是preHash:前一个节点得哈希。
代码继续跟着上一章文章,不懂得看下面
链接:区块链学习Day02(Pow算法)

package main

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"strconv"
	"strings"
	"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)

	//产生第二个区块,要传上一个区块
	GenerateNextBlock("第二个区块", firstBlock)
}

// 产生新的区块
func GenerateNextBlock(data string, oldBlock Block) Block {
	//产生一个新的区块
	var newBlock Block
	newBlock.TimeStamp = time.Now().String()
	//可以自己修改难度系数,越大越慢
	newBlock.Diff = 4
	//区块高度 认为第二个区块 ,一般认为高度应该是上一个区块的Index+1,但是我们认为是第二个区块,先挖出来,先写死 2
	newBlock.Index = 2
	newBlock.Data = data
	//上一个哈希就是传进来的oldBlock
	newBlock.PreHash = oldBlock.HashCode
	//先设置为0,这个Noce是由矿工进行调整的
	newBlock.Nonce = 0
	//利用pow进行挖矿
	//当前节点的哈希,这是第二个区块了,要有要求,不是谁都可以根据Diff规矩去取,比如Diff=0,那么哈希前导0就必须满足0000开头
	//用到Pow的思想去做
	newBlock.HashCode = pow(newBlock.Diff, &newBlock)
	return newBlock
}

// Pow工作量证明算法进行哈希碰撞
// 要传指针的Block,因为要修改原来的值Nonce,要不断去修改
// 传指针保证操作的是同一对象
func pow(diff int, block *Block) string {
	//不停的去挖矿
	for {
		hash := GenerationHashValue(*block)
		//每挖一次,打印一次哈希值
		//并不是每次打印的哈希值都是正确的,要符合前导0,Diff个数
		fmt.Println(hash)
		//判断哈希值前缀是否为4个0
		if strings.HasPrefix(hash, strings.Repeat("0", diff)) {
			fmt.Println("挖矿成功")
			return hash
		} else {
			//没有挖到正确的
			//再重新去计算,修改原来的值,让随机值去自增,
			block.Nonce++

		}
	}
}

结果:
省略…
4b5ffc524ced8f17059a8d2df1c997842facc81c1aba5fdba9631ea8e974fc9e
aebf6bd16cc615cd89c5b7642a9ba659a8a8eb3175a94a0f7b0ab89f2210f76b
d95a5302617aee8d675e7fc727ccd2c2618d44086dde0048893ba58b3eeebf78
0000ac3053583197868461c6dbaebd96521015635349bbc55a015889b460850f
挖矿成功
满足了挖矿条件的Diff就可以,4个前导0,diff越大计算越慢。文章来源地址https://www.toymoban.com/news/detail-760784.html

到了这里,关于区块链学习Day03(Pow算法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Day29- 贪心算法part03

    题目一:1005. K 次取反后最大化的数组和 1005. K 次取反后最大化的数组和 给你一个整数数组  nums  和一个整数  k  ,按以下方法修改该数组: 选择某个下标  i  并将  nums[i]  替换为  -nums[i]  。 重复这个过程恰好  k  次。可以多次选择同一个下标  i  。 以这种方式修改

    2024年01月20日
    浏览(45)
  • 【两个月算法速成】day03-链表

    目录 203. 移除链表元素 题目链接 思路 代码 206. 反转链表 题目链接 思路 代码  总结 力扣 如下图所示就是移除链表的过程 但是值得注意的是,移除头节点和其他位置的节点是不一样的,以为头结点前面没有节点。 所以如何移除头结点,可以设置一个虚拟节点指向头结点,

    2023年04月25日
    浏览(25)
  • 【随想录】Day34—第八章 贪心算法 part03

    题目链接:1005. K 次取反后最大化的数组和 贪心思路 : 先对数组中的元素进行排序 遍历数组,如果 当前遍历的位置值 0 k0 直接变号,之后对 k 进行 -- 如果不小于 0 ,此时需要先排序,判断 k 是否为奇数,如果是奇数直接对最小位进行取反 最终遍历数组求和 ⭐ K 次取反后最

    2024年04月27日
    浏览(42)
  • k8s学习day03

    本章节将详细介绍Pod资源的各种配置(yaml)和原理。 Pod结构 每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的容器,数量可多可少 Pause容器,这是每个Pod都会有的一个 根容器 ,它的作用有两个: 可以以它为依据,评估整个Pod的健康状态 可

    2024年02月14日
    浏览(28)
  • 区块链共识机制 (Consensus)(PoW,PoS,PAXOS,RAFT,PBFT)

    所谓“共识机制”,是通过特殊节点的投票,在很短的时间内完成对交易的验证和确认;对一笔交易,如果利益不相干的若干个节点能够达成共识,我们就可以认为全网对此也能够达成共识。再通俗一点来讲,如果中国一名微博大V、美国一名虚拟币玩家、一名非洲留学生和一

    2024年02月03日
    浏览(32)
  • JavaSE学习进阶day03_02 内部类

    2.1.1 什么是内部类 将一个类A定义在另一个类B里面,里面的那个类A就称为 内部类 ,B则称为 外部类 。可以把内部类理解成寄生,外部类理解成宿主。 2.1.2 什么时候使用内部类 一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用 人里面有一颗心脏。

    2023年04月15日
    浏览(33)
  • 前端TypeScript学习day03-TS高级类型

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)            目录 TypeScript 高级类型 class 类 class继承  extends implements  类成员可见性  public  protected  private   readonly 兼容性 类型兼容性 接口兼容性  函数兼容性  TypeScri

    2024年02月08日
    浏览(36)
  • 【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字

       611. 有效三角形的个数 https://leetcode.cn/problems/valid-triangle-number/ 给定一个包含非负整数的数组  nums  ,返回其中可以组成三角形三条边的三元组个数。 本题是一个关于三角形是否能成立的题目,首先我们假设三角形的三边(a,b,c),我们要保证两边之和大于第三边    题

    2024年02月12日
    浏览(46)
  • 区块链必知基础知识、POS、POW、DPOS、公有链、私有链、联盟链

    从不同的技术⻆度来剖析,我们可以这样来看待区块链,它是: 分布式数据库(本质) 每个⽤户都可以通过合法⼿段进⾏读写,不存储于某⼀辆个特定的服务器或安全节点上,⽽是分布式地存放于⽹络上所 有的完整节点上,每个节点保留⼀个备份。 ⽹络底层协议(抽象)

    2024年02月02日
    浏览(45)
  • JavaSE学习进阶day06_03 Collections类和Map集合

    java.utils.Collections 是集合工具类,用来对集合进行操作。 常用方法如下: public static void shuffle(List? list) :打乱集合顺序。 public static T void sort(ListT list) :将集合中元素按照默认规则排序。 public static T void sort(ListT list,Comparator? super T ) :将集合中元素按照指定规则排序。 代码演示

    2023年04月26日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包