博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go公链实战0x00区块链基础结构
阅读量:6904 次
发布时间:2019-06-27

本文共 3123 字,大约阅读时间需要 10 分钟。

堕落了一段时间,终于又找回了学习的动力,满血归来。。。

我们知道在如火如荼的区块链应用红海,goLang越来越多地发挥着不可替代的作用。一方面取决于其语法的简单性,一方面其具备C++高效处理的特性。今天,我们就用go语言开始构建一个简单但是具备区块链完整功能的公链项目。

由于之前已经用,所以对区块基本结构的东西不再做详细赘述。

#废话少说上干货

##区块Block

####Block

type Block struct {	//1.区块高度	Height int64	//2.上一个区块HAsh	PrevBlockHash []byte	//3.交易数据	Data []byte	//4.时间戳	Timestamp int64	//5.Hash	Hash []byte}复制代码

####设置当前区块Hash

func (block *Block) SetHash() {	//1.将高度,时间戳转换为字节数组	//base:2  二进制形式	heightBytes := IntToHex(block.Height)	timeStampStr := strconv.FormatInt(block.Timestamp, 2)	timeStamp := []byte(timeStampStr)	//fmt.Println(heightBytes)	//fmt.Println(timeStampStr)	//fmt.Println(timeStamp)	//2.拼接所有属性	blockBytes := bytes.Join([][]byte{		heightBytes,		block.PrevBlockHash,		block.Data,		timeStamp,		block.Hash}, []byte{})	//fmt.Println(blockBytes)	//3.将拼接后的字节数组转换为Hash值	hash := sha256.Sum256(blockBytes)	fmt.Println(hash)	block.Hash = hash[:]	//fmt.Println(block.Hash)}复制代码

####创建新区快

func NewBlock(data string, height int64, prevBlockHash []byte) *Block {	//创建区块	block := &Block{		Height:        height,		PrevBlockHash: prevBlockHash,		Data:          []byte(data),		Timestamp:     time.Now().Unix(),		Hash:          nil}	//设置HAsh值	block.SetHash()	return block}复制代码

####创世区块创建

func CreateGenesisBlock(data string) *Block {	return NewBlock(data, 1, []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0})}复制代码

###区块链BlockChain

####区块链

type Blockchain struct {	//有序区块的数组	Blocks [] *Block}复制代码

####创建带有创世区块的区块链

func CreateBlockchainWithGensisBlock() *Blockchain  {	gensisBlock := CreateGenesisBlock("Gensis Block...")	return &Blockchain{[] *Block{gensisBlock}}}复制代码

####新增一个区块到区块链

func (blc *Blockchain) AddBlockToBlockchain(data string, height int64, prevHash []byte)  {	//新建区块	newBlock := NewBlock(data, height, prevHash)	//上链	blc.Blocks = append(blc.Blocks, newBlock)}复制代码

###utils辅助工具(int64转化为byte数组)

import (	"bytes"	"encoding/binary"	"log")//将int64转换为bytesfunc IntToHex(num int64) []byte  {	buff := new(bytes.Buffer)	err := binary.Write(buff, binary.BigEndian, num)	if err != nil {		log.Panic(err)	}	return buff.Bytes()}复制代码

###测试Demo

/**@author: chaors@file:   main.go@time:   2018/06/21 22:01@desc:   区块信息的示例*/package mainimport (	"chaors.com/LearnGo/publicChaorsChain/part1-Basic-Prototype/BLC"	"fmt")func main() {	//genesisBlock := BLC.CreateGenesisBlock("Genenis Block")	//创建带有创世区块的区块链	blockchain := BLC.CreateBlockchainWithGensisBlock()	//添加一个新区快	blockchain.AddBlockToBlockchain("first Block",		blockchain.Blocks[len(blockchain.Blocks)-1].Height,		blockchain.Blocks[len(blockchain.Blocks)-1].Hash)	blockchain.AddBlockToBlockchain("second Block",		blockchain.Blocks[len(blockchain.Blocks)-1].Height,		blockchain.Blocks[len(blockchain.Blocks)-1].Hash)	blockchain.AddBlockToBlockchain("third Block",		blockchain.Blocks[len(blockchain.Blocks)-1].Height,		blockchain.Blocks[len(blockchain.Blocks)-1].Hash)	fmt.Println(blockchain)}复制代码

###运行结果

我们看到运行的结果,打印的内容为包含创世区块在内的四个区块的区块链。

在这,喜欢的朋友记得给个小star,或者fork.也欢迎大家一起探讨区块链相关知识,一起进步!

更多原创区块链技术文章请访问

. . . .

###互联网颠覆世界,区块链颠覆互联网!

-------------------------------------------------20180622 20:35

转载地址:http://bzmdl.baihongyu.com/

你可能感兴趣的文章
c#通过创建Windows服务启动程序
查看>>
系统架构设计指南
查看>>
我的友情链接
查看>>
Jquery Ajax方法传值到action
查看>>
读写者问题------读写锁
查看>>
NFS server 搭建
查看>>
思科路由器配置nat实现内网中两台web服务器的负载平衡
查看>>
我的友情链接
查看>>
topic3:Qt入门之常用qt控件认知之QLabel
查看>>
nagios之监控
查看>>
linux中软链接与硬链接
查看>>
第一章 Microsoft Lync Server 2010产品简介
查看>>
掉卡问题的分析总结
查看>>
返回结果集有默认值但是提示java.lang.nullpointerexception
查看>>
Java---------Iterator的用法
查看>>
UtralEdit
查看>>
圈复杂度(Cyclomatic Complexity)计算工具
查看>>
决策树
查看>>
Android图片加载框架:ImageLoader,Volley,Picasso,Glide,Fresco
查看>>
linux下内存泄露检测工具Valgrind
查看>>