• 区块链的生成与基本操作



    项目github地址 link

    一、项目愿景

    通过该项目,能够了解区块链的构成以及如何实现一个功能完善的区块链。

    二、项目架构

    在这里插入图片描述

    三、项目特点

    1.去中心化
    2.可追溯
    3.不可篡改

    四、项目流程

    区块的基本结构与操作

    在这里插入图片描述
    区块头的细节如上图所示。每一个区块由6个部分组成分别为时间戳,前一区块哈希,当前区块哈希,随机数,区块号码(区块高度),merkle根,其中为了方便代码,将merkle根表示为数据。最后的区块的代码如下:

    // 实现一个基本的区块结构
    type Block struct {
    	TimeStamp     int64  //代表区块时间
    	Hash          []byte //当前区块hash
    	PrevBlockHash []byte //前一区块Hash
    	Height        int64  //区块高度
    	Data          []byte //存储交易数据(先不考虑merkle树)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    创建区块

    每一个区块都需要以上六个部分,其中,时间戳可以在创建时生成,当前区块哈希与随机数也是创建时生成,所以需要传参为前一区块哈希,区块高度,交易数据
    具体的代码如下:

    // 新建区块
    func newBlock(prevBlockHash []byte, height int64, data []byte) *Block {
    	var block Block
    	block = Block{
    		TimeStamp:     time.Now().Unix(),
    		Hash:          nil,
    		PrevBlockHash: prevBlockHash,
    		Height:        height,
    		Data:          data,
    	}
    
    	return &block
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    创建创世区块,将其的高度设为1。

    // 生成创世区块
    func CreateGenesisBlock(data []byte) *Block {
    	return NewBlock(nil, 1, data)
    }
    
    • 1
    • 2
    • 3
    • 4

    运行截图
    在这里插入图片描述

    区块链的生成与基本操作

    区块链的基本结构
    可以采用两种方式进行存放区块,切片与结构体都可以实现。为了更方便的理解,这里采用结构体的方式进行存储。

    // 区块链基本结构
    type BlockChain struct {
    	Blocks []*Block //区块链的切片
    }
    
    • 1
    • 2
    • 3
    • 4

    区块链的操作中,通过区块的添加,实现区块链的延长。

    // 添加区块到区块链中
    func (bc *BlockChain) AddBlock(prevBlockHash []byte, height int64, data []byte) {
    	var newBlock *Block
    	newBlock = NewBlock(prevBlockHash, height, data)
    	bc.Blocks = append(bc.Blocks, newBlock)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    但是对于第一个区块而言,由于没有前驱结点, 所以把他作为创世区块单独处理。

    // 初始化区块链
    func CreateBlockChainWithGenesisBlock() *BlockChain {
    	//生成创世区块
    	block := CreateGenesisBlock([]byte("the first block"))
    	return &BlockChain{[]*Block{block}}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    最终的加入了创世区块的区块链如下
    在这里插入图片描述
    最终加入了三个区块了区块链如下:
    在这里插入图片描述

    // 启动
    func main() {
    	//初始化区块链
    	blockChain := BLC.CreateBlockChainWithGenesisBlock()
    	//fmt.Printf("the first block :%v\n", blockChain)
    	//加入第二个区块
    	blockChain.AddBlock(blockChain.Blocks[len(blockChain.Blocks)-1].Hash,
    		blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, []byte("Alice send 10 btc to bob"))
    	//加入第三个区块
    	blockChain.AddBlock(blockChain.Blocks[len(blockChain.Blocks)-1].Hash,
    		blockChain.Blocks[len(blockChain.Blocks)-1].Height+1, []byte("Bob send 5 btc to Tom"))
    	//依次展示区块
    	for _, d := range blockChain.Blocks {
    		fmt.Printf("prevHash:%v\nnowHash:%v\n", d.PrevBlockHash, d.Hash)
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    验证hash值是否成一条链
    在这里插入图片描述

  • 相关阅读:
    flume系列之:基于zookeeper部署flume agent升级guava和curator版本
    员工离职倾向尽在公司掌握,争议发生后,监控系统研发商悄悄下架相关服务
    ubuntu 源码编译安装make过程很慢问题解决
    电子统计台账:数据感知与模板找错
    VirtualBox Ubuntu扩展虚拟机磁盘空间
    【网络教程】IPtables官方教程--学习笔记4
    通过termux tailscale huggingface 来手把手一步一步在手机上部署LLAMA2-7b和LLAMA2-70b大模型
    Metasploit-模块介绍
    go 分支与循环
    SSM+基于web的《计算机基础》自学系统的设计与开发 毕业设计-附源码221509
  • 原文地址:https://blog.csdn.net/qq_45931661/article/details/127720272