lemooljiang avatar

运行简易链条 / go实现简易区块链 #2

lemooljiang

Published: 16 Aug 2022 › Updated: 16 Aug 2022

运行简易链条 / go实现简易区块链 #2

把区块链接在一起,就可以实现一个区块链啰!

package main

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

//定义区块结构
type Block struct {
    Version       int64
    PrevBlockHash []byte
    Hash          []byte
    MerKelRoot    []byte
    TimeStamp     int64
    Bits          int64
    Nonce         int64
    Data          []byte
}

//定义区块链结构
type BlockChain struct {
    blocks []*Block
}

func NewBlock(data string, prevBlockHash []byte) *Block {
    var block Block
    block = Block{
        Version:       1,
        PrevBlockHash: prevBlockHash,
        MerKelRoot:    []byte{},
        TimeStamp:     time.Now().Unix(),
        Bits:          1,
        Nonce:         1,
        Data:          []byte(data)}
    block.SetHash()
    return &block
}

func (block *Block) SetHash() {
    tmp := [][]byte{
        IntToByte(block.Version),
        block.PrevBlockHash,
        block.MerKelRoot,
        IntToByte(block.TimeStamp),
        IntToByte(block.Bits),
        IntToByte(block.Nonce),
        block.Data}

    data := bytes.Join(tmp, []byte{})
    hash := sha256.Sum256(data)
    block.Hash = hash[:]
}

func NewGenesisBlock() *Block {
    return NewBlock("genesis block", []byte{})
}

func IntToByte(num int64) []byte {
    var buffer bytes.Buffer
    err := binary.Write(&buffer, binary.BigEndian, num)
    CheckErr("IntToByte", err)
    return buffer.Bytes()
}

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

func NewBlockChain() *BlockChain {
    block := NewGenesisBlock()
    return &BlockChain{blocks: []*Block{block}}
}

func (bc *BlockChain) AddBlock(data string) {
    prevBlockHash := bc.blocks[len(bc.blocks)-1].Hash
    block := NewBlock(data, prevBlockHash)
    bc.blocks = append(bc.blocks, block)
}

func main() {
    fmt.Println("hello world!8886")
    bc := NewBlockChain()
    bc.AddBlock("a send b 1 btc")
    bc.AddBlock("c send d 1 btc")
    for _, block := range bc.blocks {
        fmt.Printf("versin: %d\n", block.Version)
        fmt.Printf("timestamp: %d\n", block.TimeStamp)
        fmt.Printf("PrevBlockHash: %x\n", block.PrevBlockHash)
        fmt.Printf("data: %s\n", block.Data)
    }
}

如上所示,可以运行一条简易的区块链条。涉及的知识点倒不多,就是结构体和方法这些。里面的哈希函数拿来用即可,倒也不用太过注重细节。下一步会慢慢加上工作量证明这些。

Leave 运行简易链条 / go实现简易区块链 #2 to:

Written by

Designer , Poet , Technology enthusiasts

Read more #cn posts


Best Posts From lemooljiang

We have not curated any of lemooljiang's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From lemooljiang