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

chaors · · 843 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

我们知道在如火如荼的区块链应用红海,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

.
.
.
.

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

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

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:chaors

查看原文:go公链实战0x00区块链基础结构

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

843 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传