使用go实现简易比特币区块链公链功能

 更新时间:2021年01月20日 10:29:59   作者:sgentle  
这篇文章主要介绍了使用go实现简易比特币区块链公链功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

使用go语言实现具备以下功能的简易区块链

  • 区块与区块链
  • 共识机制
  • 数据库
  • Cli命令行操作
  • 交易管理
  • 密码学
  • 数字签名
  • 交易缓存池
  • P2P网络管理

由于平时还要进行论文工作,项目不定时更新

2021.1.1实现了区块结构、区块链结构、工作量证明pow,剩下部分陆续更新

1.实现区块结构

package BLC

import (
	"bytes"
	"crypto/sha256"
	"time"
)

//实现一个最基本的区块结构
type Block struct {
	TimeStamp int64 //时间戳,区块产生的时间
	Heigth int64//区块高度(索引、号码)代表当前区块的高度
	PreBlockHash []byte//前一个区块(父区块)的哈希
	Hash []byte//当前区块的哈希
	Data []byte//交易数据
}
//创建一个新的区块
func NewBlock(height int64,preBlockHash []byte,Data []byte) *Block {
	var block Block
	block=Block{Heigth: height,PreBlockHash: preBlockHash,Data: Data,TimeStamp: time.Now().Unix()}
	block.SetHash()
	return &block
}
//计算区块哈希
func (b *Block)SetHash() { 
	//int64转换成字节数组
	//高度转换
	heightBytes:=IntToHex(b.Heigth)
	//时间转换
	timeStampBytes:=IntToHex(b.TimeStamp)
//拼接所有属性进行hash
	blockBytes:=bytes.Join([][]byte{heightBytes,timeStampBytes,b.PreBlockHash,b.Data},[]byte{})
	hash:=sha256.Sum256(blockBytes)
	b.Hash=hash[:]
}

2.实现区块链结构

package BLC

type BlockChain struct {
	Blocks []*Block //存储有序的区块
}
//初始化区块链
func CreateBlockChainWithGenesisBlock() *BlockChain {
	//添加创世区块
	genesisBlock:=CreateGenesisBlock("the init of blockchain")

	return &BlockChain{[]*Block{genesisBlock}}
}
//添加新的区块到区块链中
func (bc *BlockChain)AddBlock(height int64,data []byte,prevBlockHash []byte){
	newBlock := NewBlock(height,prevBlockHash,data)
	bc.Blocks=append(bc.Blocks,newBlock)
}

3.实现工作量证明

package BLC

import (
	"bytes"
	"crypto/sha256"
	"fmt"
	"math/big"
)

//目标难度值,生成的hash前 targetBit 位为0才满足条件
const targetBit =16
//工作量证明
type ProofOfWork struct {
	Block *Block //对指定的区块进行验证
	target *big.Int //大数据存储
}
//创建新的pow对象
func NewProofOfWork(block *Block) *ProofOfWork {
	target:=big.NewInt(1)
	target=target.Lsh(target,256-targetBit)
	return &ProofOfWork{block,target}
}
//开始工作量证明
func (proofOfWork *ProofOfWork)Run() ([]byte,int64) {
	//数据拼接
	var nonce=0 //碰撞次数
	var hash [32]byte //生成的hash
	var hashInt big.Int //存储转换后的hash
	for {
		dataBytes:=proofOfWork.prepareData(nonce)
		hash=sha256.Sum256(dataBytes)
		hashInt.SetBytes(hash[:])
		fmt.Printf("hash:\r%x",hash)
		//难度比较
		if proofOfWork.target.Cmp(&hashInt)==1{
			break
		}
		nonce++
	}
	fmt.Printf("碰撞次数:%d\n",nonce)
	return hash[:],int64(nonce)
}
//准备数据,将区块属性拼接起来,返回字节数组
func (pow *ProofOfWork)prepareData(nonce int) []byte {
	data:=bytes.Join([][]byte{
		pow.Block.PreBlockHash,
		pow.Block.Data,
		IntToHex(pow.Block.TimeStamp),
		IntToHex(pow.Block.Heigth),
		IntToHex(int64(nonce)),
		IntToHex(targetBit),
	},[]byte{})
	return data
}

4.当前运行结果

在这里插入图片描述

到此这篇关于使用go实现简易比特币区块链公链功能的文章就介绍到这了,更多相关go实现比特币区块链公链内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang如何使用struct的tag属性的详细介绍

    golang如何使用struct的tag属性的详细介绍

    这篇文章主要介绍了golang如何使用struct的tag属性的详细介绍,从例子说起,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • go 对象池化组件 bytebufferpool使用详解

    go 对象池化组件 bytebufferpool使用详解

    这篇文章主要为大家介绍了go 对象池化组件 bytebufferpool使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 基于go实例网络存储协议详解

    基于go实例网络存储协议详解

    这篇文章主要为大家介绍了基于go实例网络存储协议详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Go json omitempty如何实现可选属性

    Go json omitempty如何实现可选属性

    在Go语言中,使用`omitempty`可以帮助我们在进行JSON序列化和反序列化时,忽略结构体中的零值或空值,本文介绍了如何通过将字段类型改为指针类型,并在结构体的JSON标签中添加`omitempty`来实现这一功能,例如,将float32修改为*float32
    2024-09-09
  • golang slice元素去重操作

    golang slice元素去重操作

    这篇文章主要介绍了golang slice元素去重操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go并发:使用sync.WaitGroup实现协程同步方式

    Go并发:使用sync.WaitGroup实现协程同步方式

    这篇文章主要介绍了Go并发:使用sync.WaitGroup实现协程同步方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • golang切片扩容规则实现

    golang切片扩容规则实现

    这篇文章主要介绍了golang切片扩容规则实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Golang并发发送HTTP请求的各种方法

    Golang并发发送HTTP请求的各种方法

    在 Golang 领域,并发发送 HTTP 请求是优化 Web 应用程序的一项重要技能,本文探讨了实现此目的的各种方法,从基本的 goroutine 到涉及通道和sync.WaitGroup 的高级技术,需要的朋友可以参考下
    2024-02-02
  • Go并发编程结构体多字段原子操作示例详解

    Go并发编程结构体多字段原子操作示例详解

    这篇文章主要为大家介绍了Go并发编程结构体多字段原子操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • go-zero数据的流处理利器fx使用详解

    go-zero数据的流处理利器fx使用详解

    这篇文章主要为大家介绍了go-zero数据的流处理利器fx使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论