【Golang】区块链练习(一)
实现一个最简单的区块链结构
1. 定义区块结构
每个区块包含:
- Index:区块的编号
- Timestamp:区块创建的时间
- Data:区块的数据(在这个示例中,我们将它简化为一个字符串)
- PreviousHash:前一个区块的哈希值
- Hash:当前区块的哈希值(通过计算所有区块信息来生成)
package main
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"time"
)
// Block 结构体表示一个区块
type Block struct {
Index int
Timestamp string
Data string
PreviousHash string
Hash string
}
// CreateBlock 创建一个新的区块
func CreateBlock(index int, timestamp, data, previousHash string) Block {
block := Block{
Index: index,
Timestamp: timestamp,
Data: data,
PreviousHash: previousHash,
}
// 计算当前区块的哈希值
block.Hash = calculateHash(block)
return block
}
// calculateHash 计算区块的哈希值
func calculateHash(block Block) string {
record := fmt.Sprintf("%d%s%s%s", block.Index, block.Timestamp, block.Data, block.PreviousHash)
hash := sha256.New()
hash.Write([]byte(record))
return hex.EncodeToString(hash.Sum(nil))
}
// CreateGenesisBlock 创建创世区块
func CreateGenesisBlock() Block {
return CreateBlock(0, time.Now().String(), "Genesis Block", "0")
}
// CreateBlockchain 创建区块链
func CreateBlockchain() []Block {
genesisBlock := CreateGenesisBlock()
return []Block{genesisBlock}
}
// AddBlock 添加新的区块到区块链
func AddBlock(blockchain []Block, data string) []Block {
previousBlock := blockchain[len(blockchain)-1]
newBlock := CreateBlock(previousBlock.Index+1, time.Now().String(), data, previousBlock.Hash)
return append(blockchain, newBlock)
}
func main() {
// 创建区块链并添加一些区块
blockchain := CreateBlockchain()
blockchain = AddBlock(blockchain, "First block after Genesis")
blockchain = AddBlock(blockchain, "Second block after Genesis")
// 打印区块链
for _, block := range blockchain {
fmt.Printf("Index: %d\n", block.Index)
fmt.Printf("Timestamp: %s\n", block.Timestamp)
fmt.Printf("Data: %s\n", block.Data)
fmt.Printf("Previous Hash: %s\n", block.PreviousHash)
fmt.Printf("Hash: %s\n\n", block.Hash)
}
}
解释:
-
Block结构体:每个区块包含一个
Index
、Timestamp
、Data
(数据)、PreviousHash
(前一个区块的哈希值)和Hash
(当前区块的哈希值)。 -
CreateBlock函数:该函数创建一个新的区块,并根据区块的内容计算其哈希值。
-
calculateHash函数:该函数计算区块内容的哈希值,通过拼接区块的各个字段,然后用
sha256
哈希算法生成哈希值。 -
CreateGenesisBlock函数:创建创世区块,创世区块是区块链的第一个区块,通常没有前一个区块。
-
CreateBlockchain函数:创建区块链并将创世区块添加到其中。
-
AddBlock函数:向区块链中添加新的区块。新块的
PreviousHash
是前一个区块的哈希。 -
Index: 0 Timestamp: 2024-11-07 10:00:00 +0000 UTC Data: Genesis Block Previous Hash: 0 Hash: f1a98be35dd3ad6b68d5c18f22079e6a86a3da38d9cb7c6310d4ffef6340c56b Index: 1 Timestamp: 2024-11-07 10:00:01 +0000 UTC Data: First block after Genesis Previous Hash: f1a98be35dd3ad6b68d5c18f22079e6a86a3da38d9cb7c6310d4ffef6340c56b Hash: a4160bcbb34376e4ef88db1a69f198df779d827f62c4b5a2f303fd18953cf029 Index: 2 Timestamp: 2024-11-07 10:00:02 +0000 UTC Data: Second block after Genesis Previous Hash: a4160bcbb34376e4ef88db1a69f198df779d827f62c4b5a2f303fd18953cf029 Hash: 3a1f16bb3a77f9ea015717e87a1d4607595ad1e8f908318c86e477f89e4d9826
总结:
- 这是一个非常基础的区块链应用,只包含创世区块和一些新创建的区块。
- 区块链的核心思想是每个区块包含前一个区块的哈希值,保证了区块链的不可篡改性。
扩展
- 验证区块链的有效性
- 使用共识算法(如工作量证明)来生成新区块
- 将区块链数据存储到数据库中
- 增加智能合约等高级功能