使用go编写一个比特币区块链公链功能
创始人
2024-12-29 01:21:14
0次

使用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编写一个比特币区块链公链功能

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...