qidao123.com ToB IT社区-企服评测·应用市场

 找回密码
 立即注册

Go语言通关指南:零底子玩转高并发编程(第Ⅴ部分)(第15章)-今世Go编程-项目实战开发(案例9:区块链浅易实现)

[复制链接]
发表于 2025-10-10 05:49:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Go语言通关指南:零底子玩转高并发编程(第Ⅴ部分)(第15章)-今世Go编程-项目实战开发(案例9:区块链浅易实现)





案例9:区块链浅易实现

1. 功能点与技能点简介

1.1. 功能


  • 区块天生:实现区块数据布局与链式存储
  • 共识机制:简单的工作量证实(PoW)算法
  • 生意业务验证:验证生意业务署名与余额
  • P2P网络:节点间通讯与数据同步
  • API接口:提供区块链查询与生意业务提交代口
1.2. 技能点


  • 利用Go实现区块链焦点逻辑
  • 利用椭圆曲线加密(ECDSA)实现生意业务署名
  • 利用WebSocket实现P2P网络通讯
  • 利用LevelDB存储区块链数据
  • 利用Gin框架提供HTTP API

2. 完备代码实现

2.1. 工程布局

  1. blockchain/  
  2. ├── main.go                  # 程序入口  
  3. ├── config/                  # 配置模块  
  4. │   ├── network.go          # 网络配置  
  5. │   └── blockchain.go       # 区块链配置  
  6. ├── handlers/               # HTTP处理器  
  7. │   ├── blockchain.go       # 区块链查询接口  
  8. │   ├── transaction.go      # 交易提交接口  
  9. │   └── node.go             # 节点管理接口  
  10. ├── services/               # 核心服务  
  11. │   ├── blockchain.go       # 区块链服务  
  12. │   ├── transaction.go      # 交易服务  
  13. │   └── p2p.go              # P2P网络服务  
  14. ├── models/                 # 数据模型  
  15. │   ├── block.go            # 区块模型  
  16. │   ├── transaction.go      # 交易模型  
  17. │   └── wallet.go           # 钱包模型  
  18. ├── middleware/             # 中间件  
  19. │   ├── auth.go             # 鉴权中间件  
  20. │   └── rate_limiter.go     # 限流中间件  
  21. ├── utils/                  # 工具类  
  22. │   ├── crypto.go           # 加密工具  
  23. │   ├── db.go               # 数据库工具  
  24. │   └── network.go          # 网络工具  
  25. ├── docker-compose.yml      # 容器化部署配置  
  26. └── README.md               # 项目说明  
复制代码

2.2. 源码文件阐明与完备代码


2.2.1. main.go



  • 作用:步伐入口,启动HTTP服务和P2P网络
  1. package main
  2. import (
  3.         "log"
  4.         "blockchain/config"
  5.         "blockchain/handlers"
  6.         "blockchain/services"
  7.         "github.com/gin-gonic/gin"
  8. )
  9. func main() {
  10.         // 初始化配置
  11.         config.InitBlockchain()
  12.         config.InitNetwork()
  13.         // 启动P2P网络
  14.         go services.StartP2PNetwork()
  15.         // 创建Gin引擎
  16.         r := gin.Default()
  17.         // 注册路由
  18.         r.GET("/blockchain", handlers.GetBlockchain)
  19.         r.POST("/transaction", handlers.SubmitTransaction)
  20.         r.GET("/nodes", handlers.ListNodes)
  21.         // 启动HTTP服务
  22.         log.Println("Blockchain service running on :8080")
  23.         if err := r.Run(":8080"); err != nil {
  24.                 log.Fatalf("Service startup failed: %v", err)
  25.         }
  26. }
复制代码

2.2.2. config/network.go



  • 作用:设置P2P网络参数
  1. package config
  2. var (
  3.         P2PPort       = 5000          // P2P网络端口  
  4.         BootstrapNode = "127.0.0.1:5000" // 初始节点地址  
  5.         MaxPeers      = 10            // 最大连接节点数  
  6. )
  7. // InitNetwork 初始化网络配置
  8. func InitNetwork() {
  9.         // 配置网络参数
  10. }
复制代码

2.2.3. config/blockchain.go



  • 作用:设置区块链参数
  1. package config
  2. var (
  3.         Difficulty      = 4               // 工作量证明难度  
  4.         BlockReward     = 50              // 区块奖励  
  5.         GenesisBlockHash = "00000000000000000000000000000000" // 创世区块哈希  
  6. )
  7. // InitBlockchain 初始化区块链配置
  8. func InitBlockchain() {
  9.         // 配置区块链参数
  10. }
复制代码

2.2.4. handlers/blockchain.go



  • 作用:提供区块链查询接口
  1. package handlers
  2. import (
  3.         "blockchain/services"
  4.         "github.com/gin-gonic/gin"
  5.         "net/http"
  6. )
  7. // GetBlockchain 获取区块链数据
  8. func GetBlockchain(c *gin.Context) {
  9.         chain, err := services.GetBlockchain()
  10.         if err != nil {
  11.                 c.JSON(http.StatusInternalServerError, gin.H{"error": "获取区块链失败"})
  12.                 return
  13.         }
  14.         c.JSON(http.StatusOK, chain)
  15. }
复制代码

2.2.5. handlers/transaction.go



  • 作用:处理处罚生意业务提交哀求
  1. package handlers
  2. import (
  3.         "blockchain/models"
  4.         "blockchain/services"
  5.         "github.com/gin-gonic/gin"
  6.         "net/http"
  7. )
  8. // SubmitTransaction 提交交易
  9. func SubmitTransaction(c *gin.Context) {
  10.         var tx models.Transaction
  11.         if err := c.BindJSON(&tx); err != nil {
  12.                 c.JSON(http.StatusBadRequest, gin.H{"error": "无效交易"})
  13.                 return
  14.         }
  15.         if err := services.ValidateTransaction(&tx); err != nil {
  16.                 c.JSON(http.StatusBadRequest, gin.H{"error": "交易验证失败"})
  17.                 return
  18.         }
  19.         if err := services.AddTransaction(&tx); err != nil {
  20.                 c.JSON(http.StatusInternalServerError, gin.H{"error": "交易提交失败"})
  21.                 return
  22.         }
  23.         c.JSON(http.StatusOK, gin.H{"message": "交易已提交"})
  24. }
复制代码

2.2.6. handlers/node.go



  • 作用:管理P2P网络节点
  1. package handlers
  2. import (
  3.         "blockchain/services"
  4.         "github.com/gin-gonic/gin"
  5.         "net/http"
  6. )
  7. // ListNodes 获取当前连接的节点列表
  8. func ListNodes(c *gin.Context) {
  9.         nodes := services.GetNodes()
  10.         c.JSON(http.StatusOK, nodes)
  11. }
复制代码

2.2.7. services/blockchain.go



  • 作用:实现区块链焦点逻辑
  1. package services
  2. import (
  3.         "blockchain/config"
  4.         "blockchain/models"
  5.         "blockchain/utils"
  6.         "time"
  7. )
  8. var Blockchain []models.Block
  9. // CreateBlock 创建新区块
  10. func CreateBlock(transactions []models.Transaction) (*models.Block, error) {
  11.         prevBlock := Blockchain[len(Blockchain)-1]
  12.         block := models.Block{
  13.                 Index:        prevBlock.Index + 1,
  14.                 Timestamp:    time.Now().Unix(),
  15.                 Transactions: transactions,
  16.                 PrevHash:     prevBlock.Hash,
  17.         }
  18.         // 工作量证明
  19.         nonce := 0
  20.         for !utils.IsValidHash(block.Hash(), config.Difficulty) {
  21.                 nonce++
  22.                 block.Nonce = nonce
  23.         }
  24.         Blockchain = append(Blockchain, block)
  25.         return &block, nil
  26. }
  27. // GetBlockchain 获取当前区块链
  28. func GetBlockchain() ([]models.Block, error) {
  29.         return Blockchain, nil
  30. }
复制代码

2.2.8. services/transaction.go



  • 作用:实现生意业务验证与提交逻辑
  1. package services
  2. import (
  3.         "blockchain/models"
  4.         "blockchain/utils"
  5.         "fmt"
  6. )
  7. // ValidateTransaction 验证交易合法性
  8. func ValidateTransaction(tx *models.Transaction) error {
  9.         // 验证签名
  10.         if !utils.VerifySignature(tx.Sender, tx.Signature, tx.Hash()) {
  11.                 return fmt.Errorf("签名验证失败")
  12.         }
  13.         // 验证余额
  14.         balance := GetBalance(tx.Sender)
  15.         if balance < tx.Amount {
  16.                 return fmt.Errorf("余额不足")
  17.         }
  18.         return nil
  19. }
  20. // AddTransaction 添加交易到待处理池
  21. func AddTransaction(tx *models.Transaction) error {
  22.         // 将交易添加到待处理交易池
  23.         // 实现略...
  24.         return nil
  25. }
复制代码

2.2.9. services/p2p.go



  • 作用:实现P2P网络通讯
  1. package services
  2. import (
  3.         "blockchain/config"
  4.         "blockchain/utils"
  5.         "golang.org/x/net/websocket"
  6. )
  7. var connections []*websocket.Conn
  8. // StartP2PNetwork 启动P2P网络
  9. func StartP2PNetwork() {
  10.         // 连接到初始节点
  11.         conn, err := utils.ConnectToNode(config.BootstrapNode)
  12.         if err != nil {
  13.                 log.Println("无法连接到初始节点:", err)
  14.                 return
  15.         }
  16.         connections = append(connections, conn)
  17.         // 监听P2P端口
  18.         // 实现略...
  19. }
  20. // GetNodes 获取当前连接的节点
  21. func GetNodes() []string {
  22.         var nodes []string
  23.         for _, conn := range connections {
  24.                 nodes = append(nodes, conn.RemoteAddr().String())
  25.         }
  26.         return nodes
  27. }
复制代码

2.2.10. models/block.go



  • 作用:界说区块数据布局
  1. package models
  2. import (
  3.         "time"
  4. )
  5. // Block 定义区块结构
  6. type Block struct {
  7.         Index        int64          `json:"index"`         // 区块高度  
  8.         Timestamp    int64          `json:"timestamp"`     // 时间戳  
  9.         Transactions []Transaction  `json:"transactions"`  // 交易列表  
  10.         PrevHash     string         `json:"prev_hash"`     // 前一个区块哈希  
  11.         Nonce        int64          `json:"nonce"`         // 工作量证明随机数  
  12.         Hash         string         `json:"hash"`          // 当前区块哈希  
  13. }
复制代码

2.2.11. models/transaction.go



  • 作用:界说生意业务数据布局
  1. package models
  2. // Transaction 定义交易结构
  3. type Transaction struct {
  4.         Sender    string  `json:"sender"`     // 发送方地址  
  5.         Recipient string  `json:"recipient"`  // 接收方地址  
  6.         Amount    float64 `json:"amount"`     // 交易金额  
  7.         Signature string  `json:"signature"`  // 交易签名  
  8. }
复制代码

2.2.12. models/wallet.go



  • 作用:界说钱包数据布局
  1. package models
  2. // Wallet 定义钱包结构
  3. type Wallet struct {
  4.         Address    string  `json:"address"`     // 钱包地址  
  5.         PrivateKey string  `json:"private_key"` // 私钥  
  6.         Balance    float64 `json:"balance"`     // 余额  
  7. }
复制代码

2.2.13. middleware/auth.go



  • 作用:JWT鉴权中心件,验证哀求合法性
  1. package middleware
  2. import (
  3.         "blockchain/utils"
  4.         "github.com/gin-gonic/gin"
  5.         "strings"
  6. )
  7. // Auth 鉴权中间件
  8. func Auth() gin.HandlerFunc {
  9.         return func(c *gin.Context) {
  10.                 token := strings.TrimPrefix(c.GetHeader("Authorization"), "Bearer ")
  11.                 if token == "" {
  12.                         c.AbortWithStatusJSON(401, gin.H{"error": "未提供访问令牌"})
  13.                         return
  14.                 }
  15.                 claims, err := utils.ParseJWT(token)
  16.                 if err != nil {
  17.                         c.AbortWithStatusJSON(403, gin.H{"error": "无效令牌"})
  18.                         return
  19.                 }
  20.                 c.Set("userID", claims.UserID)
  21.                 c.Set("roles", claims.Roles)
  22.                 c.Next()
  23.         }
  24. }
复制代码

2.2.14. middleware/rate_limiter.go



  • 作用:动态限流中心件,区分用户和IP
  1. package middleware
  2. import (
  3.         "blockchain/services"
  4.         "github.com/gin-gonic/gin"
  5. )
  6. // RateLimiter 限流中间件
  7. func RateLimiter() gin.HandlerFunc {
  8.         return func(c *gin.Context) {
  9.                 var key string
  10.                 if userID, exists := c.Get("userID"); exists {
  11.                         key = "user:" + string(userID.(uint))
  12.                 } else {
  13.                         key = "ip:" + c.ClientIP()
  14.                 }
  15.                 if !services.AllowRequest(c.Request.Context(), key, 100, time.Minute) {
  16.                         c.AbortWithStatusJSON(429, gin.H{"error": "请求过于频繁"})
  17.                         return
  18.                 }
  19.                 c.Next()
  20.         }
  21. }
复制代码

2.2.15. utils/crypto.go


  1. package utils
  2. import (
  3.         "crypto/ecdsa"
  4.         "crypto/elliptic"
  5.         "crypto/rand"
  6.         "crypto/sha256"
  7.         "encoding/hex"
  8.         "math/big"
  9. )
  10. // GenerateKeyPair 生成密钥对
  11. func GenerateKeyPair() (*ecdsa.PrivateKey, string) {
  12.         privateKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  13.         address := hex.EncodeToString(privateKey.PublicKey.X.Bytes())
  14.         return privateKey, address
  15. }
  16. // SignTransaction 对交易进行签名
  17. func SignTransaction(privateKey *ecdsa.PrivateKey, txHash string) string {
  18.         r, s, _ := ecdsa.Sign(rand.Reader, privateKey, []byte(txHash))
  19.         return hex.EncodeToString(r.Bytes()) + hex.EncodeToString(s.Bytes())
  20. }
  21. // VerifySignature 验证交易签名
  22. func VerifySignature(address, signature, txHash string) bool {
  23.         x, y := new(big.Int), new(big.Int)
  24.         x.SetString(address[:64], 16)
  25.         y.SetString(address[64:], 16)
  26.         publicKey := ecdsa.PublicKey{Curve: elliptic.P256(), X: x, Y: y}
  27.         r, s := new(big.Int), new(big.Int)
  28.         r.SetString(signature[:64], 16)
  29.         s.SetString(signature[64:], 16)
  30.         return ecdsa.Verify(&publicKey, []byte(txHash), r, s)
  31. }
复制代码

2.2.16. utils/db.go



  • 作用:封装LevelDB操纵工具函数
  1. package utils
  2. import (
  3.         "github.com/syndtr/goleveldb/leveldb"
  4. )
  5. var DB *leveldb.DB
  6. // InitDB 初始化LevelDB
  7. func InitDB() error {
  8.         db, err := leveldb.OpenFile("blockchain.db", nil)
  9.         if err != nil {
  10.                 return err
  11.         }
  12.         DB = db
  13.         return nil
  14. }
  15. // SaveBlock 保存区块到数据库
  16. func SaveBlock(block *models.Block) error {
  17.         key := []byte(block.Hash)
  18.         value, _ := json.Marshal(block)
  19.         return DB.Put(key, value, nil)
  20. }
  21. // GetBlock 从数据库获取区块
  22. func GetBlock(hash string) (*models.Block, error) {
  23.         value, err := DB.Get([]byte(hash), nil)
  24.         if err != nil {
  25.                 return nil, err
  26.         }
  27.         var block models.Block
  28.         json.Unmarshal(value, &block)
  29.         return &block, nil
  30. }
复制代码

2.2.17. utils/network.go



  • 作用:封装P2P网络工具函数
  1. package utils
  2. import (
  3.         "blockchain/config"
  4.         "golang.org/x/net/websocket"
  5. )
  6. // ConnectToNode 连接到指定节点
  7. func ConnectToNode(address string) (*websocket.Conn, error) {
  8.         conn, err := websocket.Dial("ws://"+address, "", "http://"+config.P2PPort)
  9.         if err != nil {
  10.                 return nil, err
  11.         }
  12.         return conn, nil
  13. }
  14. // BroadcastMessage 广播消息到所有节点
  15. func BroadcastMessage(message []byte) {
  16.         for _, conn := range connections {
  17.                 conn.Write(message)
  18.         }
  19. }
复制代码

2.2.18. docker-compose.yml



  • 作用容器化摆设全链路服务
  1. version: '3.8'
  2. services:
  3.   blockchain:
  4.     build: .
  5.     ports:
  6.       - "8080:8080"
  7.     volumes:
  8.       - blockchain_data:/app/data
  9.     environment:
  10.       - P2P_PORT=5000
  11.       - BOOTSTRAP_NODE=127.0.0.1:5000
  12. volumes:
  13.   blockchain_data:
复制代码

生产级实践总结


  • 高可用架构

    • P2P网络支持多节点毗连与数据同步
    • LevelDB长期化存储区块链数据

  • 安全机制

    • ECDSA署名保障生意业务不可篡改
    1. // 交易签名示例
    2. signature := utils.SignTransaction(privateKey, tx.Hash())
    复制代码
      

    • 工作量证实防止区块篡改

  • 性能优化

    • 并行盘算工作量证实
    • LevelDB批量写入区块数据

  • 可扩展性

    • 支持动态添加节点
    • 可扩展共识机制(如PoS、DPoS)

  • 监控监控与告警

    • Prometheus监控监控节点状态
    • Grafana展示区块链数据



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录

QQ|手机版|qidao123.com IT社区;IT企服评测▪应用市场 ( 浙ICP备20004199|浙ICP备20004199号 )|网站地图

GMT+8, 2026-7-7 17:05 , Processed in 0.045620 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表