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

【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)
	}
}

解释:

  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: 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
    

    总结:

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

扩展

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

http://www.kler.cn/a/383828.html

相关文章:

  • SQL Server 日志记录
  • Unity网络开发基础(part5.网络协议)
  • String、StringBuffer、StringBuilder
  • swoole扩展安装--入门篇
  • java 对人名和电话 脱敏-replaceAll
  • Bert模型介绍
  • 2025天津市考8日报名,建议收藏好报名流程
  • 昆仑通态触摸屏学习路程
  • NFT Insider #154:The Sandbox Alpha 4 第四周开启,NBA Topshot NFT 销量激增至新高
  • WPF中的转换器
  • 机器学习—推理:做出预测(前向传播)
  • WPF+MVVM案例实战(二十二)- 制作一个侧边弹窗栏(CD类)
  • AWS S3在客户端应用不能使用aws-sdk场景下的文件上传与下载
  • 七.numpy模块
  • 2024-11-06 问AI: [AI面试题] 人工智能如何用于欺诈检测和网络安全?
  • Bert快速入门
  • 【大数据学习 | kafka高级部分】kafka的优化参数整理
  • 数据集整理
  • 机器学习:使用SVM进行人脸识别
  • Linux(CentOS)运行 jar 包
  • WireShark入门学习笔记
  • Maven(19)如何使用Maven部署项目?
  • 矩阵论 •「线性空间、基变换与向量坐标变换」
  • 批量压缩tif文件到指定物理宽度mm,同时保持DPI大于300
  • 【spring】IOC与DI
  • mysql字段是datetime如何按照小时来统计