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

添加区块到区块链当中003

package main

import (
	"crypto/sha256"
	"fmt"
)

//0 定义结构
// 创建前哈希值 创建当前哈希值 和数据
type Block struct {
	Prevhash []byte //前哈希
	Hash []byte   //当前哈希 TODO
	Data []byte   //数据
}

//创建一个区块
func NewBlock(data string,prevBlockHash []byte)  *Block {
	block:=Block{
		Prevhash: prevBlockHash,
		Hash: []byte{},  //当前的先默认为空的  后面再计算
		Data:[]byte(data), //传过来的肯定是字符串 转byte
	}
	block.SetHash()
	return &block
}

//3 将区块生成哈希 SetHash()方法来生成  传递的是结构的类
func (block *Block) SetHash()  {
	//拼接数据 前哈希加上当前区块的数据
	blcokInfo:=	append(block.Prevhash,block.Data...)
	//调用哈希方法生成
	hash:=sha256.Sum256(blcokInfo)
	block.Hash=hash[:]
}

// 4. 引入区块链  就是把block连接起来
// 4-1 定义区块链结构
type BlockChain struct {
	//定义一个区块链数组
	blocks []*Block
}

// 5. 定义(创建)一个区块链   注意 定义区块链要弄一个创世区块
func  NewBlockChain() *BlockChain{
	// 创建一个创世区块 并作为第一个添加到区块链当中
	genesisBlock:=genesisBlock()
	return &BlockChain{
		blocks:[]*Block{genesisBlock},

	}
}

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

// 5. 添加区块代码  需要区块前哈希
func (bc *BlockChain)  AddBlock(data string)  {
	lastBlock:= bc.blocks[len(bc.blocks)-1]
	//获取最后一个区块链的区块前的哈希
	prevHash:=lastBlock.Prevhash
	//创建新的区块
	block:= NewBlock(data,prevHash)
	//添加到区块数组里面
	bc.blocks=append(bc.blocks,block)
}


// 6. 重构代码

func main()  {

	//创建一个区块链
	bc:=NewBlockChain()  //创建完是一个数组 对数组循环遍历

	bc.AddBlock("班长向班花转了50枚比特币")
	bc.AddBlock("班长向班花又转了50枚比特币")


	for i,block:=range bc.blocks{
		fmt.Printf("当前区块高度: %x\n",i)
		fmt.Printf("前区块的哈希是: %x\n",block.Prevhash)
		fmt.Printf("当前区块的哈希是: %x\n",block.Hash)
		fmt.Printf("当前区块的数据是: %s\n",block.Data)
	}
	
	//block:=  NewBlock("老师让班长转一枚比特币给我",[]byte{})
	//fmt.Printf("前区块的哈希是: %x\n",block.Prevhash)
	//fmt.Printf("当前区块的哈希是: %x\n",block.Hash)
	//fmt.Printf("当前区块的数据是: %s\n",block.Data)

}

 

相关文章:

  • 很难见得到的一篇关于windows进程的说明书(转载)
  • 补充区块代码更新函数004
  • 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安装
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Git同步原始仓库到Fork仓库中
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • NSTimer学习笔记
  • SwizzleMethod 黑魔法
  • Web设计流程优化:网页效果图设计新思路
  • 产品三维模型在线预览
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于Flux,Vuex,Redux的思考
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 软件开发学习的5大技巧,你知道吗?
  • 使用common-codec进行md5加密
  • 我建了一个叫Hello World的项目
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​linux启动进程的方式
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • ${factoryList }后面有空格不影响
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (2020)Java后端开发----(面试题和笔试题)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二)springcloud实战之config配置中心
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转) Android中ViewStub组件使用
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)memcache、redis缓存
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 8.0 中有哪些新的变化?
  • .net MVC中使用angularJs刷新页面数据列表
  • .Net 高效开发之不可错过的实用工具