当前位置: 首页 > news >正文

【Golang】区块链练习(一)

实现一个最简单的区块链结构

1. 定义区块结构

每个区块包含:

  • Index:区块的编号
  • Timestamp:区块创建的时间
  • Data:区块的数据(在这个示例中,我们将它简化为一个字符串)
  • PreviousHash:前一个区块的哈希值
  • Hash:当前区块的哈希值(通过计算所有区块信息来生成)
package mainimport ("crypto/sha256""encoding/hex""fmt""time"
)// Block 结构体表示一个区块
type Block struct {Index        intTimestamp    stringData         stringPreviousHash stringHash         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)}
}

解释:

  1. Block结构体:每个区块包含一个 IndexTimestampData(数据)、PreviousHash(前一个区块的哈希值)和 Hash(当前区块的哈希值)。

  2. CreateBlock函数:该函数创建一个新的区块,并根据区块的内容计算其哈希值。

  3. calculateHash函数:该函数计算区块内容的哈希值,通过拼接区块的各个字段,然后用 sha256 哈希算法生成哈希值。

  4. CreateGenesisBlock函数:创建创世区块,创世区块是区块链的第一个区块,通常没有前一个区块。

  5. CreateBlockchain函数:创建区块链并将创世区块添加到其中。

  6. AddBlock函数:向区块链中添加新的区块。新块的 PreviousHash 是前一个区块的哈希。

  7. Index: 0
    Timestamp: 2024-11-07 10:00:00 +0000 UTC
    Data: Genesis Block
    Previous Hash: 0
    Hash: f1a98be35dd3ad6b68d5c18f22079e6a86a3da38d9cb7c6310d4ffef6340c56bIndex: 1
    Timestamp: 2024-11-07 10:00:01 +0000 UTC
    Data: First block after Genesis
    Previous Hash: f1a98be35dd3ad6b68d5c18f22079e6a86a3da38d9cb7c6310d4ffef6340c56b
    Hash: a4160bcbb34376e4ef88db1a69f198df779d827f62c4b5a2f303fd18953cf029Index: 2
    Timestamp: 2024-11-07 10:00:02 +0000 UTC
    Data: Second block after Genesis
    Previous Hash: a4160bcbb34376e4ef88db1a69f198df779d827f62c4b5a2f303fd18953cf029
    Hash: 3a1f16bb3a77f9ea015717e87a1d4607595ad1e8f908318c86e477f89e4d9826
    

    总结:

  8. 这是一个非常基础的区块链应用,只包含创世区块和一些新创建的区块。
  9. 区块链的核心思想是每个区块包含前一个区块的哈希值,保证了区块链的不可篡改性。

扩展

  • 验证区块链的有效性
  • 使用共识算法(如工作量证明)来生成新区块
  • 将区块链数据存储到数据库中
  • 增加智能合约等高级功能

http://www.mrgr.cn/news/68116.html

相关文章:

  • 西门子KTP系列HMI用户自定义弹窗-多弹窗共用
  • Linux学习笔记之时间日期和查找和解压缩指令
  • RocketMQ 自动注入消费者
  • python-23-一篇文章帮你理解Python推导式
  • 【大模型】通过Crew AI 公司的崛起之路学习 AI Agents 的用法
  • 加入鲲鹏社区,领取精美礼品!
  • uniapp组件实现省市区三级联动选择
  • 用uio正确映射读写内存mmap
  • 如何在 Java 中使用 Canal 同步 MySQL 数据到 Redis
  • 数据结构——快速排序
  • 带你用Go实现二维码小游戏(下)
  • 一文了解git TAG
  • 基于Python+Vue开发的蛋糕商城管理系统
  • C++ 判断是不是平衡二叉树
  • 【fiddler】用fiddler实现手机抓包
  • 华为OD机试 - 学生排名(Java 2024 E卷 100分)
  • LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略
  • move_base
  • D365 无法在数据被选择或插入到另一个事务作用域中的缓冲区上调用 NEXT、update() 或 delete()
  • Visual Studio Code从安装到正常使用