当前位置: 首页 > news >正文

补充区块代码更新函数004

package main

import (
	"bytes"
	"crypto/sha256"
	"encoding/binary"
	"fmt"
	"log"
	"time"
)

//创建一个区块
type Block struct {
	//1 版本号
	 Version  uint64
	//2 区块前哈希
	PrevHash []byte
	 //3 梅克尔根(这是一个哈希值 v4版本介绍)
	 MerkleRoot []byte
	 //4 时间戳
	 TimeStamp uint64
	 //5 难度值(调整比特币挖矿的难度值)
	 Difficulty uint64
	 //6 随机数 这就是挖矿所寻找的数
	 Nonce  uint64
	//7 区块当前哈希
	Hash []byte   //当前区块哈希,正常比特币区块当中木有当前区块哈希 我们是为了方便作了简化
	//8 区块当前数据
    Data []byte
}
//1 补充区块代码
//2 更新计算哈希函数
//3 优化代码


//实现一个辅助函数  功能是将uint64转[]byte
func Uint64ToByte(num uint64) []byte  {
	//TODO
    var buffer bytes.Buffer

    err:= binary.Write(&buffer,binary.BigEndian,num)
    if err!=nil{
    	log.Panic(err)
	}

	return buffer.Bytes()
}



//创建区块
func NewBlock(data string,prevBlockHash []byte)  *Block {
	block:=Block{
		Version: 00,
		PrevHash: prevBlockHash,
		MerkleRoot: []byte{},
		TimeStamp: uint64(time.Now().Unix()),
		Difficulty: 0,
		Nonce: 0,
		Hash: []byte{},
		Data: []byte(data),
	}
	block.SetHash()
	return  &block
}

//当前区块哈希数据的拼接 (只有创建的区块才能调用)
func   (block *Block) SetHash()  {
	var blockByteInfo []byte //存储拼接好的数据 最后作为sha256函数的参数
	blockByteInfo=append(blockByteInfo,block.PrevHash...)
	blockByteInfo=append(blockByteInfo,block.Data...)
	blockByteInfo=append(blockByteInfo,block.MerkleRoot...)
	blockByteInfo=append(blockByteInfo,Uint64ToByte(block.Version)...)
	blockByteInfo=append(blockByteInfo,Uint64ToByte(block.TimeStamp)...)
	blockByteInfo=append(blockByteInfo,Uint64ToByte(block.Difficulty)...)
	blockByteInfo=append(blockByteInfo,Uint64ToByte(block.Nonce)...)
	hash:=sha256.Sum256(blockByteInfo)
	block.Hash=hash[:]
}

//构造区块链 结构体
type BlockChain struct {
	 blocks []*Block
}

//创建区块链
func NewBlockChain() *BlockChain {
	genesisBlock:=genesisBlock()
	return &BlockChain{
		blocks: []*Block{genesisBlock},
	}
}

//创建一个创世区块链
func genesisBlock()  *Block  {
	return NewBlock("我是创世区块链",[]byte{})
}

//5添加区块
func (bc *BlockChain) AddBlock(data string)  {
	   //最后一块哈希
	   lastHash:= bc.blocks[len(bc.blocks)-1]
	   block:=  NewBlock(data,lastHash.Hash)
       bc.blocks=append(bc.blocks,block)
}

//6. 重构代码

func main()  {
    bc:= NewBlockChain()
    bc.AddBlock("班长转账给你50枚比特币")
	bc.AddBlock("副班长转账给你50枚比特币")


	for i,v:= range bc.blocks{
		fmt.Printf("当前区块的高度是: %x\n",i)
		fmt.Printf("区块的前哈希是: %x\n",v.PrevHash)
		fmt.Printf("区块的当前哈希是:%x\n",v.Hash)
		fmt.Printf("区块的当前数据是:%s\n",v.Data)
	}


    //block:= NewBlock("创世区块",[]byte{})
    //fmt.Printf("区块的前哈希是: %x\n",block.PrevHash)
    //fmt.Printf("区块的当前哈希是:%x\n",block.Hash)
    //fmt.Printf("区块的当前数据是:%s\n",block.Data)
}

 

相关文章:

  • byte二位数组转换问题005
  • 写在周日的凌晨( 一次思维的对话)
  • 挖矿初出茅庐006
  • blot数据库007
  • Chapter1:Oracle 10g Oracle DAB [Oracle® Database 2 Day DBA
  • 修改构造区块链数据库008
  • golang序列化与反序列化009
  • chapter2: 安装 Oracle 软件并构建数据库
  • 001以太坊DAPP开发
  • chapter3:Oracle Enterprise Manager 入门
  • Your Flutter application is created using an older version of the Android
  • chapter5:管理 Oracle 例程
  • 踩坑go-micro安装
  • golang坑 ‘godoc‘ 不是内部或外部命令,...
  • chapter6:管理数据库存储结构
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【comparator, comparable】小总结
  • Android 架构优化~MVP 架构改造
  • django开发-定时任务的使用
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Promise面试题,控制异步流程
  • vue-router的history模式发布配置
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 聊聊hikari连接池的leakDetectionThreshold
  • 数据科学 第 3 章 11 字符串处理
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 自制字幕遮挡器
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​2020 年大前端技术趋势解读
  • ​ubuntu下安装kvm虚拟机
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #{} 和 ${}区别
  • #QT项目实战(天气预报)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • ( 10 )MySQL中的外键
  • (C语言)二分查找 超详细
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (HAL库版)freeRTOS移植STMF103
  • (八)c52学习之旅-中断实验
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (超详细)语音信号处理之特征提取
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转) 深度模型优化性能 调参
  • (转)3D模板阴影原理
  • .jks文件(JAVA KeyStore)
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?