用Golang实现一个简易的区块链的代码示例
package main
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"time"
)
// 区块结构
type Block struct {
Index int
Timestamp string
Data string
Hash string
PrevHash string
}
// 创建区块
func createBlock(index int, data, prevHash string) *Block {
block := &Block{
Index: index,
Timestamp: time.Now().String(),
Data: data,
PrevHash: prevHash,
}
block.Hash = calculateHash(block)
return block
}
// 计算区块哈希
func calculateHash(block *Block) string {
record := string(block.Index) + block.Timestamp + block.Data + block.PrevHash
hash := sha256.Sum256([]byte(record))
return hex.EncodeToString(hash[:])
}
// 创建创世区块
func createGenesisBlock() *Block {
return createBlock(0, "Genesis Block", "")
}
// 将区块链接起来形成区块链
type Blockchain struct {
Blocks []*Block
}
func (bc *Blockchain) initialize() {
genesisBlock := createGenesisBlock()
bc.Blocks = []*Block{genesisBlock}
}
func (bc *Blockchain) addBlock(data string) {
prevBlock := bc.Blocks[len(bc.Blocks)-1]
newBlock := createBlock(prevBlock.Index+1, data, prevBlock.Hash)
bc.Blocks = append(bc.Blocks, newBlock)
}
func main() {
blockchain := Blockchain{}
blockchain.initialize()
blockchain.addBlock("Data for Block 1")
blockchain.addBlock("Data for Block 2")
for _, block := range blockchain.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("--------------------------")
}
}
这个简易的区块链包含了创建区块、加密哈希以及链接区块的功能。它定义了一个Block
结构表示区块,其中包含了索引、时间戳、数据、哈希和前一个区块哈希。calculateHash
函数用于计算区块的哈希值。createBlock
函数用于创建一个新的区块,并根据前一个区块的哈希计算自己的哈希。createGenesisBlock
函数用于创建创世区块。Blockchain
结构用于管理区块链,它包含一个Blocks
字段来存储所有的区块。initialize
函数用于初始化区块链并创建创世区块。addBlock
函数用于向区块链中添加新的区块。
在main
函数中,我们首先初始化一个区块链,并添加两个新的区块。然后遍历区块链,打印每个区块的信息。
请注意,这只是一个简单的示例,仅仅展示了区块链的基本概念和实现方式。实际的区块链系统可能更加复杂,并包含许多其他的功能和特性。