区块链V1版本实现之五
代码重构:
block.go文件:
package main import (
"crypto/sha256"
) //定义区块结构
type Block struct {
//前区块哈希
PrevBlockHash [] byte
//当前区块哈希
Hash [] byte
//数据,目前使用字节流,v4开始使用交易代替
Data [] byte
} const genesisInfo = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks" //创建区块,对Block的每一个字段填充数据
func NewBlock(data string, prevBlockHash []byte) *Block{
block := Block{
PrevBlockHash: prevBlockHash,
Hash: []byte{}, //先填充为空
Data: []byte(data),
} //V1之二版本添加实现hash输出
block.SetHash() return &block
} //为了生成区块哈希,实现一个简单的函数,来计算哈希值,没有随机值,没有难度值
func (block *Block) SetHash() {
var data []byte
data = append(data, block.PrevBlockHash...)
data = append(data, block.Data...) hash /* [32]byte */:= sha256.Sum256(data)
block.Hash = hash[:]
}
blockchain.go文件:
package main //创建区块链,使用Block数组模拟
type BlockChain struct {
Blocks []*Block
} //实现创建区块链的方法
func NewBlockChain() *BlockChain {
//在创建的时候添加一个区块:创世块
genesisBlock := NewBlock(genesisInfo, []byte{0x0000000000000000}) bc := BlockChain{Blocks: []*Block{genesisBlock}}
return &bc
} //添加区块
func (bc *BlockChain) AddBlock(data string) { //创建一个区块
//bc.Block的最后一个区块的Hash值就是当前新区块的PrevBlockHash
lastBlock := bc.Blocks[len(bc.Blocks) - 1]
prevHash := lastBlock.Hash block := NewBlock(data, prevHash) //添加到bc.Block数组中
bc.Blocks = append(bc.Blocks, block) }
main.go文件:
package main import (
"fmt"
) func main() {
fmt.Printf("HelloWorld!!!\n") ////区块实例化
//block := NewBlock(genesisInfo,[]byte{0x0000000000000000})
bc := NewBlockChain()
bc.AddBlock("哈哈哈哈哈") for i, block := range bc.Blocks{
//区块打印
fmt.Printf("++++++++++++++ %d ++++++++++++++++\n",i)
fmt.Printf("PrevBlockHash : %x\n", block.PrevBlockHash)
fmt.Printf("Hash : %x\n", block.Hash)
fmt.Printf("Data : %s\n", block.Data)
}
}
显示效果:


区块链V1版本实现之五的更多相关文章
- 区块链V1版本实现之一
1. 程序地址:https://gitee.com/Jame_sz/beijing_go_term2.git 2. 程序编写流程: //1. 定义结构(区块头的字段比正常的少) //>1. 前区 ...
- 区块链V1版本实现之三
部分程序代码(区块链的定义及遍历打印): 1 //创建区块链,使用Block数组模拟 2 type BlockChain struct { 3 Blocks []*Block 4 } 5 6 //实现 ...
- 区块链V1版本实现之二
部分程序代码(生成并调用hash代码): 1 //创建区块,对Block的每一个字段填充数据 2 func NewBlock(data string, prevBlockHash []byte) *B ...
- 区块链V1版本实现之四
部分程序代码(添加区块): //添加区块 func (bc *BlockChain) AddBlock(data string) { //创建一个区块 //bc.Block的最后一个区块的Hash值就 ...
- 基于Fisco-Bcos的区块链智能合约-简单案例实践
一.智能合约介绍 智能合约是指把合同/协议条款以代码的形式电子化地放到区块链网络上.FISCO BCOS平台支持两种智能合约类型:Solidity智能合约与预编译智能合约 Solidity与Java类 ...
- 三、主流区块链技术特点及Hyperledger Fabric V1.0版本特点
一.Hyperledger fabric V1.0 架构 1.逻辑架构: 2.区块链网络 3.运行时架构 二.架构总结 1.架构要点 分拆Peer的功能,将Blockchain的数据维护和共识服务进行 ...
- 003-主流区块链技术特点及Hyperledger Fabric V1.0版本特点
一.Hyperledger fabric V1.0 架构 1.逻辑架构: 2.区块链网络 3.运行时架构 二.架构总结 1.架构要点 分拆Peer的功能,将Blockchain的数据维护和共识服务进行 ...
- 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
摘要: 全球开源区块链领域影响最为广泛的Hyperledger Fabric日前宣布了1.1版本的正式发布,带来了一系列丰富的新功能以及在安全性.性能与扩展性等方面的显著提升.阿里云容器服务区块链解决 ...
- 二、主流区块链技术特点及Hyperledger Fabric V0.6版本特点
一.主流区块链技术特点 二.HyperLedger子项目 三.Hyperledger fabric架构 V0.6逻辑架构: V0.6区块链网络 对应的0.6版本的运行时架构: 0.6版本的架构特点是: ...
随机推荐
- 专题二:redis的数据类型之string
一.redis的数据存储格式 redis本身是一个Map,其中所有的数据都是采用 "key:value"的方式进行存储的. 我们说的数据类型是数据存储的类型,也就是对应下图的val ...
- 专题一:why redis ?
一.NoSQL 现在互联网应用其中有两个特点:(1)海量用户(2)不可避免地高并发.常常因为这样,我们网站或者服务器将面临崩溃的风险.而多用户.高并发只是现象,究其根源,罪魁祸首就是关系型数据库, ...
- flask-profiler的使用
使用 profiler测量在你的Flask 应用程序中定义的端点:并通过web界面提供细粒度的报告. 它给出了这些问题的答案: 应用程序中的瓶颈在哪里? 应用程序中最慢的终结点? 哪些是最常被调用的终 ...
- Hadoop基础------>MR框架-->WordCount
认识Mapreduce Mapreduce编程思想 Mapreduce执行流程 java版本WordCount实例 1. 简介: Mapreduce源于Google一遍论文,是谷歌Mapreduce的 ...
- JavaScript之构造函数
在学习构造函数之前我们需要知道我们学习构造函数需要学习什么: 1.什么是构造函数 2.构造函数用来做什么 3.构造函数的执行过程 4.构造函数的返回值 1.所以首先我们需要知道什么是构造函数: 在 ...
- Linux7(centOS7)安装jdk/tomcat/docker/mysql
jdk的rpm安装.tomcat的解压缩安装.docker的yum安装.mysql的docker安装 下载地址 1.1.jdk下载地址 https://www.oracle.com/java/tech ...
- 全文思维导图------redis设计与实现
- TCP回射客户服务器模型(02 设置套接字选项、处理多并发)
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); //设置套接字选项 ...
- python脚本打包成rpm软件包
前言 软件最终都会有交付的形式,有的是用tar包,有个是以目录,有的是封成一个文件包,从大多数使用场景来说,直接打包成软件包的方式是最简单,也是最不容易出错的,路径可以在包里面写死了 实践 关于打包的 ...
- 网络协议_7层_TCP/IP