golang實(shí)現(xiàn)簡(jiǎn)單區(qū)塊鏈demo

原理就不介紹了,具體可以去看我的另一篇通過一個(gè)App Demo的演示深入理解區(qū)塊鏈運(yùn)行原理 代碼只是最簡(jiǎn)單的,只是簡(jiǎn)單的實(shí)現(xiàn)了對(duì)一個(gè)區(qū)塊的定義以及區(qū)塊之間的聯(lián)系。在這里p2p,激勵(lì),共識(shí)都沒有。

區(qū)塊鏈重要的 數(shù)據(jù)層、網(wǎng)絡(luò)層、共識(shí)層、激勵(lì)層

下面的代碼只是展示了數(shù)據(jù)層上面的東西,后續(xù)會(huì)把剩余的補(bǔ)充上,好好學(xué)習(xí),天天向上。加油。

package main

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

// 實(shí)現(xiàn)int轉(zhuǎn)換成byte數(shù)組
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)
    }
}

//區(qū)塊的結(jié)構(gòu)
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{
        //實(shí)現(xiàn)將int轉(zhuǎn)成byte數(shù)組的函數(shù)
        Int2Byte(block.Version),
        block.PrevBlockHash,
        Int2Byte(block.TimeStamp),
        block.MerkeRoot,
        Int2Byte(block.Nonce),
        block.Data}
    //將區(qū)塊個(gè)字段連接成一個(gè)切片,使用[]byte{}進(jìn)行連接

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

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

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

type BlockChian struct {
    //使用切片保存區(qū)塊,用于模擬區(qū)塊鏈
    blocks []*Block
}

func NewBlockChain() *BlockChian {
    //創(chuàng)建一個(gè)區(qū)塊鏈
    return &BlockChian{[]*Block{NewGenesisBlock()}}
}

func (bc *BlockChian) AddBlock(data string) {
    // 防止區(qū)塊越界
    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() {
    // 實(shí)例化一個(gè)區(qū)塊鏈
    bc := NewBlockChain()

    //添加block
    bc.AddBlock("測(cè)試第一個(gè)BTC")
    bc.AddBlock("測(cè)試第二個(gè)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)
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容