前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >简单的Go语言实现的区块链应用案例

简单的Go语言实现的区块链应用案例

原创
作者头像
软件架构师Michael
发布2025-01-20 11:51:07
发布2025-01-20 11:51:07
690
举报
1. 区块链结构定义

我们定义一个区块链,每个区块包含一个时间戳、交易数据、前一个区块的哈希值和当前区块的哈希值。

代码语言:go
复制
package main

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

// Block 结构体
type Block struct {
	Index        int
	Timestamp    string
	Transactions []string
	PrevBlockHash string
	Hash          string
}

// Blockchain 结构体
type Blockchain struct {
	Blocks []Block
}

// NewBlockchain 创建一个新的区块链
func NewBlockchain() *Blockchain {
	return &Blockchain{}
}

// AddBlock 添加一个新的区块到区块链
func (bc *Blockchain) AddBlock(transactions []string) {
	prevBlock := bc.Blocks[len(bc.Blocks)-1]
	newBlock := Block{
		Index:        prevBlock.Index + 1,
		Timestamp:    time.Now().String(),
		Transactions: transactions,
		PrevBlockHash: prevBlock.Hash,
	}
	newBlock.Hash = newBlock.CalculateHash()
	bc.Blocks = append(bc.Blocks, newBlock)
}

// CalculateHash 计算区块的哈希值
func (b *Block) CalculateHash() string {
	record := fmt.Sprintf("%d%s%v%s", b.Index, b.Timestamp, b.Transactions, b.PrevBlockHash)
	h := sha256.New()
	h.Write([]byte(record))
	return hex.EncodeToString(h.Sum(nil))
}

// PrintBlockchain 打印区块链的内容
func (bc *Blockchain) PrintBlockchain() {
	for _, block := range bc.Blocks {
		fmt.Printf("Block %d\n", block.Index)
		fmt.Printf("Timestamp: %s\n", block.Timestamp)
		fmt.Printf("Transactions: %v\n", block.Transactions)
		fmt.Printf("PrevBlockHash: %s\n", block.PrevBlockHash)
		fmt.Printf("Hash: %s\n", block.Hash)
		fmt.Println("----------------------------")
	}
}

func main() {
	// 创建一个新的区块链
	blockchain := NewBlockchain()
	blockchain.Blocks = append(blockchain.Blocks, Block{
		Index:        0,
		Timestamp:    time.Now().String(),
		Transactions: []string{"Genesis Block"},
		PrevBlockHash: "",
		Hash:          "0",
	})

	// 添加一些区块
	blockchain.AddBlock([]string{"Alice -> Bob: 10 BTC"})
	blockchain.AddBlock([]string{"Bob -> Charlie: 5 BTC"})

	// 打印区块链
	blockchain.PrintBlockchain()
}

代码说明

  1. 区块链结构
    • Block 结构体包含区块的基本信息,如索引、时间戳、交易记录、前一个区块的哈希值和当前区块的哈希值。
    • Blockchain 结构体包含一个区块数组,用于存储整个区块链。
  2. 哈希计算
    • 使用 SHA-256 算法为每个区块生成哈希值,确保区块的不可篡改性。
  3. 添加区块
    • 每次添加新区块时,会自动计算当前区块的哈希值,并将前一个区块的哈希值作为链接。
  4. 打印区块链
    • 遍历区块链并打印每个区块的详细信息。

运行结果

运行程序后,你会看到类似以下的输出:

代码语言:txt
复制
Block 0
Timestamp: 2025-01-20 15:00:00 +0800 CST
Transactions: [Genesis Block]
PrevBlockHash: 
Hash: 0
----------------------------
Block 1
Timestamp: 2025-01-20 15:00:01 +0800 CST
Transactions: [Alice -> Bob: 10 BTC]
PrevBlockHash: <hash-of-block-0>
Hash: <hash-of-block-1>
----------------------------
Block 2
Timestamp: 2025-01-20 15:00:02 +0800 CST
Transactions: [Bob -> Charlie: 5 BTC]
PrevBlockHash: <hash-of-block-1>
Hash: <hash-of-block-2>
----------------------------

扩展

这个示例是一个非常基础的区块链实现,主要用于理解区块链的基本结构和工作原理。在实际应用中,区块链还需要实现共识机制(如 PoW、PoS)、网络通信、智能合约等功能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 区块链结构定义
  • 代码说明
  • 运行结果
  • 扩展
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档