區(qū)塊鏈初探

最近懶到不想寫字

package block

import (
    "strconv"
    "bytes"
    "crypto/sha256"
    "time"
)

// 區(qū)塊結構
type Block struct {
    Timestamp     int64  // 時間戳
    Data          []byte // 當前區(qū)塊 存放的信息
    PrevBlockHash []byte // 上一個區(qū)塊的 加密hash
    Hash          []byte // 當前區(qū)塊的Hash
}

// 計算hash值
func (self *Block) SetHash() {
    // 將本區(qū)塊的timestamp, data, preBlockHash -----> hash
    timestamp := []byte(strconv.FormatInt(self.Timestamp, 10))
    // 拼接
    headers := bytes.Join([][]byte{self.PrevBlockHash, self.Data, timestamp}, []byte{})
    // SHA256加密
    hash := sha256.Sum256(headers)
    self.Hash = hash[:]
}

// 新建區(qū)塊API
func NewBlock(data string, prevBlockHash []byte) *Block {
    // 生成一個區(qū)塊
    block := Block{}
    block.Timestamp = time.Now().Unix()
    block.Data = []byte(data)
    block.PrevBlockHash = prevBlockHash
    block.SetHash()
    return &block
}

// 創(chuàng)建區(qū)塊鏈結構體
type BlockChain struct {
    Blocks []*Block // 有序的區(qū)塊鏈
}

// 將區(qū)塊添加到區(qū)塊鏈中
func (self *BlockChain) AddBlock(data string) {
    // 獲得當前 前驅區(qū)塊
    prevBlock := self.Blocks[len(self.Blocks)-1]
    // 創(chuàng)建新區(qū)塊
    newBlock := NewBlock(data, prevBlock.Hash)
    // 添加到blocks
    self.Blocks = append(self.Blocks, newBlock)
}

// 區(qū)塊鏈=創(chuàng)世塊+區(qū)塊。。。。。+區(qū)塊

// 創(chuàng)建創(chuàng)世塊
func NewGenesisBlock() *Block {
    genesisBlock := Block{}
    genesisBlock.Data = []byte("GenesisBlock")
    genesisBlock.PrevBlockHash = []byte{}
    return &genesisBlock
}

// 新建區(qū)塊鏈
func NewBlockChain() *BlockChain {
    blockChain := BlockChain{}
    blockChain.Blocks = append(blockChain.Blocks, NewGenesisBlock())
    return &blockChain
}

package main

import (
    "block"
    "fmt"
    "os"
)

func main() {
    // 創(chuàng)建區(qū)塊鏈
    bc := block.NewBlockChain()
    var cmd string
    for {
        fmt.Println("1: 添加")
        fmt.Println("2: 遍歷")
        fmt.Println("3: 退出")
        fmt.Scanf("%s", &cmd)

        switch cmd {
        case "1":
            // 添加
            fmt.Println("輸入數據")
            input := make([]byte, 1024)
            os.Stdin.Read(input)

            bc.AddBlock(string(input))

        case "2":
            // 遍歷
            for i, value := range bc.Blocks {
                fmt.Println("+++++++++++++++++++")
                fmt.Println("第 ", i, "個 區(qū)塊信息:")
                fmt.Printf("prevBlockHash: %x\n", value.PrevBlockHash)
                fmt.Printf("Data: %s\n", value.Data)
                fmt.Printf("Hash %x\n", value.Hash)
                fmt.Println("+++++++++++++++++++")
            }

        default:
            // 退出
            return
        }
    }
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容