解决问题:请使用golang编写代码实现一个简易的区块链,包含如何创建区块、如何加密哈希、如何链接区块等功能?

​package main

import (
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"time"
)

type Block struct {
	Timestamp     int64
	Data          []byte
	PrevBlockHash []byte
	Hash          []byte
}

type Blockchain struct {
	blocks []*Block
}

func (b *Block) SetHash() {
	timestamp := []byte(fmt.Sprint(b.Timestamp))
	headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{})
	hash := sha256.Sum256(headers)
	b.Hash = hash[:]
}

func NewBlock(data string, prevBlockHash []byte) *Block {
	block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}}
	block.SetHash()
	return block
}

func (bc *Blockchain) AddBlock(data string) {
	prevBlock := bc.blocks[len(bc.blocks)-1]
	newBlock := NewBlock(data, prevBlock.Hash)
	bc.blocks = append(bc.blocks, newBlock)
}

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

func NewBlockchain() *Blockchain {
	return &Blockchain{[]*Block{NewGenesisBlock()}}
}

func main() {
	bc := NewBlockchain()

	bc.AddBlock("Block 1 Data")
	bc.AddBlock("Block 2 Data")

	for _, block := range bc.blocks {
		fmt.Printf("Prev. hash: %x\n", block.PrevBlockHash)
		fmt.Printf("Data: %s\n", block.Data)
		fmt.Printf("Hash: %x\n", block.Hash)
		fmt.Println()
	}
}

        上述代码实现了一个区块链,包含了创建区块、加密哈希以及链接区块的功能。其中,Block结构体用于表示一个区块,包含时间戳、数据、前一个区块的哈希值以及本区块的哈希值。我们利用sha256算法对区块头进行哈希加密,然后将加密后的哈希值赋给区块的Hash字段。NewBlock函数用于创建新的区块,通过调用SetHash函数设置区块的哈希值。AddBlock函数用于向区块链中添加新的区块,它先找到前一个区块,然后利用NewBlock创建新的区块,并将其添加到区块链中。NewGenesisBlock用于创建创世区块,包含了一些默认值。NewBlockchain用于创建一个新的区块链,包含一个创世区块。最后,在main函数中,我们创建一个新的区块链,向其中添加了两个区块,并打印出每个区块的前一个区块的哈希值、区块数据和哈希值。

猜你喜欢

转载自blog.csdn.net/SYC20110120/article/details/132782580