golang实现简单区块链demo

栏目: Go · 发布时间: 6年前

内容简介:原理就不介绍了,具体可以去看我的另一篇区块链重要的 数据层、网络层、共识层、激励层下面的代码只是展示了数据层上面的东西,后续会把剩余的补充上,好好学习,天天向上。加油。
golang实现简单区块链demo

原理就不介绍了,具体可以去看我的另一篇 通过一个App Demo的演示深入理解区块链运行原理 代码只是最简单的,只是简单的实现了对一个区块的定义以及区块之间的联系。在这里p2p,激励,共识都没有。

区块链重要的 数据层、网络层、共识层、激励层

下面的代码只是展示了数据层上面的东西,后续会把剩余的补充上,好好学习,天天向上。加油。

golang实现简单区块链demo
package main

import (
    "bytes"
    "crypto/sha256"
    "encoding/binary"
    "fmt"
    "os"
    "time"
)

// 实现int转换成byte数组
func Int2Byte(num int64) []byte {
    var buffer bytes.Buffer
    err := binary.Write(&buffer, binary.BigEndian, num)
    CheckErr(err)
    return buffer.Bytes()
}

func CheckErr(err error) {
    if err != nil {
        fmt.Println("err:", err)
        os.Exit(1)
    }
}

//区块的结构
type Block struct {
    Version       int64
    PrevBlockHash []byte
    Hash          []byte
    TimeStamp     int64
    TargetBits    int64
    Nonce         int64
    MerkeRoot     []byte
    Data          []byte
}

func NewBlock(data string, prevBlockHash []byte) *Block {
    block := &Block{
        Version:       1,
        PrevBlockHash: prevBlockHash,
        TimeStamp:     time.Now().Unix(),
        TargetBits:    10,
        Nonce:         5,
        MerkeRoot:     []byte{},
        Data:          []byte(data)}
    block.SetHash()

    return block

}

// int -> byte

func (block *Block) SetHash() {
    tmp := [][]byte{
        //实现将int转成byte数组的函数
        Int2Byte(block.Version),
        block.PrevBlockHash,
        Int2Byte(block.TimeStamp),
        block.MerkeRoot,
        Int2Byte(block.Nonce),
        block.Data}
    //将区块个字段连接成一个切片,使用[]byte{}进行连接

    data := bytes.Join(tmp, []byte{})

    //算出hash的值
    hash := sha256.Sum256(data)
    block.Hash = hash[:]
}

func NewGenesisBlock() *Block {
    return NewBlock("Genesis Block!", []byte{})
}

type BlockChian struct {
    //使用切片保存区块,用于模拟区块链
    blocks []*Block
}

func NewBlockChain() *BlockChian {
    //创建一个区块链
    return &BlockChian{[]*Block{NewGenesisBlock()}}
}

func (bc *BlockChian) AddBlock(data string) {
    // 防止区块越界
    if len(bc.blocks) <= 0 {
        os.Exit(1)
    }
    lastBlock := bc.blocks[len(bc.blocks)-1]
    block := NewBlock(data, lastBlock.Hash)
    bc.blocks = append(bc.blocks, block)
}

func main() {
    // 实例化一个区块链
    bc := NewBlockChain()

    //添加block
    bc.AddBlock("测试第一个BTC")
    bc.AddBlock("测试第二个EOS")

    //打印出信息
    for i, block := range bc.blocks {
        fmt.Println("=========block num:", i)
        fmt.Println("data", string(block.Data))
        fmt.Println("Version:", block.Version)
        fmt.Printf("Hash:%x\n", block.Hash)
        fmt.Printf("TimeStamp:%d\n", block.TimeStamp)
        fmt.Printf("MerkeRoot:%x\n", block.MerkeRoot)
        fmt.Printf("None:%d\n", block.Nonce)
    }
}
golang实现简单区块链demo

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

鳥哥的Linux私房菜(第四版)

鳥哥的Linux私房菜(第四版)

鳥哥 / 碁峰資訊股份有限公司 / 2016-1-25 / TWD 980.00

本書前三版均蟬聯電腦專業書籍Linux暢銷排行榜Top1,為地表最暢銷的Linux中文書籍! 您是有意學習Linux的小菜鳥,卻不知如何下手?您是遨遊Linux的老鳥,想要一本資料豐富的工具書?本書絕對是最佳選擇! ※鳥哥傾囊相授,內容由淺入深 書中包含了鳥哥從完全不懂Linux到現在的所有歷程,鳥哥將這幾年來的所知所學傾囊相授,以最淺顯易懂的文字帶領您進入Linux的世界。 ......一起来看看 《鳥哥的Linux私房菜(第四版)》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具