go区块链公链实战0x00区块链基础结构

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

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

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

废话少说上干货

区块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转换为bytes
func 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 main

import (
    "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)
}

运行结果

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

image.png

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

.
.
.
.

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

-------------------------------------------------20180622 20:35
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 1 货币的演变——从贝壳到比特币 当社会分工产生之后,人类就产生了商品交换的需求。在货币被发明之前,人类是以以物换...
    longlee阅读 7,600评论 1 23
  • 最近,看到朋友谈起几首老情歌——《遇见》、《向左走,向右走》,谈起它的旋律,它的歌词。 最近,看到不同的人,脸上挂...
    紫柴子阅读 424评论 2 3
  • 现今,经常听到一句话“听过很多道理,却依然过不好这一生”。这句话也成为读书无用论的核心论据。 读书是学习的一个手段...
    水平生阅读 140评论 0 0