解决问题:请使用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函数中,我们创建一个新的区块链,向其中添加了两个区块,并打印出每个区块的前一个区块的哈希值、区块数据和哈希值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Galaxy银河

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值