[blockchain-020]一个go语言的极简区块链

1.参考文献

https://studygolang.com/articles/11399?fr=sidebar

2.源码

跟参考文献相比略做修改。

package main

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

//一个区块
type Block struct {
	Timestamp     int64
	Data          []byte
	PrevBlockHash []byte
	Hash          []byte
}

//区块链
type BlockChain struct {
	blocks []*Block
}

//区块 设置 hash
func (b *Block) setHash() {
	timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))
	headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{})
	hash := sha256.Sum256(headers)
	b.Hash = hash[:]
}

//创建区块
func NewBlock(data string, preBlockHash []byte) *Block {
	block := &Block{time.Now().Unix(), []byte(data), preBlockHash, []byte{}}
	block.setHash()
	return block
}

//创建区块链:第一个创始块是固定的字符串内容
func NewBlockChain(genesis string) *BlockChain {
	return &BlockChain{[]*Block{NewBlock(genesis, []byte{})}}
}

func (bc *BlockChain) addBlock(data string) {
	preBlock := bc.blocks[len(bc.blocks)-1]
	newBlock := NewBlock(data, preBlock.Hash)
	bc.blocks = append(bc.blocks, newBlock)
}

func main() {
	bc := NewBlockChain("my first bc")
	bc.addBlock("block no.1")
	bc.addBlock("block no.2")
	for _, block := range bc.blocks {
		fmt.Println(block.PrevBlockHash)
		fmt.Println(string(block.Data))
		fmt.Println(block.Hash)
		fmt.Println()
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个易的区块链系统的Go语言实现示例: 首先,我们定义一个区块的结构体: ``` type Block struct { Index int Timestamp string Data string Hash string PrevHash string } ``` 其中,Index代表区块的索引,Timestamp代表区块产生的时间戳,Data是区块中存储的数据,Hash是该区块的哈希值,PrevHash是前一个区块的哈希值。 接下来,我们定义一个区块链的结构体: ``` type Blockchain struct { blocks []*Block } ``` 其中,blocks是一个Block类型的切片,用于存储整个区块链。接下来,我们实现一些区块链的基本操作: 1.创建创世区块: ``` func (bc *Blockchain) createGenesisBlock() { block := &Block{ Index: 0, Timestamp: time.Now().String(), Data: "Genesis Block", PrevHash: "", } block.Hash = calculateHash(block) bc.blocks = append(bc.blocks, block) } ``` 2.添加新的区块: ``` func (bc *Blockchain) addBlock(data string) { prevBlock := bc.blocks[len(bc.blocks)-1] newBlock := &Block{ Index: prevBlock.Index + 1, Timestamp: time.Now().String(), Data: data, PrevHash: prevBlock.Hash, } newBlock.Hash = calculateHash(newBlock) bc.blocks = append(bc.blocks, newBlock) } ``` 3.计算区块的哈希值: ``` func calculateHash(block *Block) string { record := strconv.Itoa(block.Index) + block.Timestamp + block.Data + block.PrevHash h := sha256.New() h.Write([]byte(record)) hash := h.Sum(nil) return hex.EncodeToString(hash) } ``` 最后,我们可以使用以下代码来测试我们的区块链系统: ``` func main() { bc := Blockchain{} bc.createGenesisBlock() bc.addBlock("Block 1") bc.addBlock("Block 2") for _, block := range bc.blocks { fmt.Printf("Index: %d\n", block.Index) fmt.Printf("Timestamp: %s\n", block.Timestamp) fmt.Printf("Data: %s\n", block.Data) fmt.Printf("Hash: %s\n", block.Hash) fmt.Printf("PrevHash: %s\n", block.PrevHash) fmt.Println() } } ``` 运行结果: ``` Index: 0 Timestamp: 2022-05-09 21:15:14.0970406 +0800 CST m=+0.004974101 Data: Genesis Block Hash: 5c8a5b5f29b7b0a9f4ab3d1c3f4c5b9e5a3d5f6d7cf1f51a7c9b4d5d0d2f44e4 PrevHash: Index: 1 Timestamp: 2022-05-09 21:15:14.0980389 +0800 CST m=+0.005972401 Data: Block 1 Hash: 4e59b5aae5b8d83f1c2f8ce7f6d8d9a6a2c5c34b4a37a9ea6a8178567e0e34d2 PrevHash: 5c8a5b5f29b7b0a9f4ab3d1c3f4c5b9e5a3d5f6d7cf1f51a7c9b4d5d0d2f44e4 Index: 2 Timestamp: 2022-05-09 21:15:14.0980389 +0800 CST m=+0.005972401 Data: Block 2 Hash: 73c4d5e8d166c7f4e1f1c5c50289597f7990a1cda3dd953f03d1d4400f8e71e2 PrevHash: 4e59b5aae5b8d83f1c2f8ce7f6d8d9a6a2c5c34b4a37a9ea6a8178567e0e34d2 ``` 这样,我们就实现了一个易的区块链系统。当然,这只是一个基础的示例,实际的区块链系统要比这个复杂得多,包括更多的功能和安全性考虑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值