使用go實(shí)現(xiàn)簡(jiǎn)易比特幣區(qū)塊鏈公鏈功能
使用go語(yǔ)言實(shí)現(xiàn)具備以下功能的簡(jiǎn)易區(qū)塊鏈
- 區(qū)塊與區(qū)塊鏈
- 共識(shí)機(jī)制
- 數(shù)據(jù)庫(kù)
- Cli命令行操作
- 交易管理
- 密碼學(xué)
- 數(shù)字簽名
- 交易緩存池
- P2P網(wǎng)絡(luò)管理
由于平時(shí)還要進(jìn)行論文工作,項(xiàng)目不定時(shí)更新
2021.1.1實(shí)現(xiàn)了區(qū)塊結(jié)構(gòu)、區(qū)塊鏈結(jié)構(gòu)、工作量證明pow,剩下部分陸續(xù)更新
1.實(shí)現(xiàn)區(qū)塊結(jié)構(gòu)
package BLC import ( "bytes" "crypto/sha256" "time" ) //實(shí)現(xiàn)一個(gè)最基本的區(qū)塊結(jié)構(gòu) type Block struct { TimeStamp int64 //時(shí)間戳,區(qū)塊產(chǎn)生的時(shí)間 Heigth int64//區(qū)塊高度(索引、號(hào)碼)代表當(dāng)前區(qū)塊的高度 PreBlockHash []byte//前一個(gè)區(qū)塊(父區(qū)塊)的哈希 Hash []byte//當(dāng)前區(qū)塊的哈希 Data []byte//交易數(shù)據(jù) } //創(chuàng)建一個(gè)新的區(qū)塊 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 } //計(jì)算區(qū)塊哈希 func (b *Block)SetHash() { //int64轉(zhuǎn)換成字節(jié)數(shù)組 //高度轉(zhuǎn)換 heightBytes:=IntToHex(b.Heigth) //時(shí)間轉(zhuǎn)換 timeStampBytes:=IntToHex(b.TimeStamp) //拼接所有屬性進(jìn)行hash blockBytes:=bytes.Join([][]byte{heightBytes,timeStampBytes,b.PreBlockHash,b.Data},[]byte{}) hash:=sha256.Sum256(blockBytes) b.Hash=hash[:] }
2.實(shí)現(xiàn)區(qū)塊鏈結(jié)構(gòu)
package BLC type BlockChain struct { Blocks []*Block //存儲(chǔ)有序的區(qū)塊 } //初始化區(qū)塊鏈 func CreateBlockChainWithGenesisBlock() *BlockChain { //添加創(chuàng)世區(qū)塊 genesisBlock:=CreateGenesisBlock("the init of blockchain") return &BlockChain{[]*Block{genesisBlock}} } //添加新的區(qū)塊到區(qū)塊鏈中 func (bc *BlockChain)AddBlock(height int64,data []byte,prevBlockHash []byte){ newBlock := NewBlock(height,prevBlockHash,data) bc.Blocks=append(bc.Blocks,newBlock) }
3.實(shí)現(xiàn)工作量證明
package BLC import ( "bytes" "crypto/sha256" "fmt" "math/big" ) //目標(biāo)難度值,生成的hash前 targetBit 位為0才滿足條件 const targetBit =16 //工作量證明 type ProofOfWork struct { Block *Block //對(duì)指定的區(qū)塊進(jìn)行驗(yàn)證 target *big.Int //大數(shù)據(jù)存儲(chǔ) } //創(chuàng)建新的pow對(duì)象 func NewProofOfWork(block *Block) *ProofOfWork { target:=big.NewInt(1) target=target.Lsh(target,256-targetBit) return &ProofOfWork{block,target} } //開(kāi)始工作量證明 func (proofOfWork *ProofOfWork)Run() ([]byte,int64) { //數(shù)據(jù)拼接 var nonce=0 //碰撞次數(shù) var hash [32]byte //生成的hash var hashInt big.Int //存儲(chǔ)轉(zhuǎn)換后的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("碰撞次數(shù):%d\n",nonce) return hash[:],int64(nonce) } //準(zhǔn)備數(shù)據(jù),將區(qū)塊屬性拼接起來(lái),返回字節(jié)數(shù)組 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.當(dāng)前運(yùn)行結(jié)果
到此這篇關(guān)于使用go實(shí)現(xiàn)簡(jiǎn)易比特幣區(qū)塊鏈公鏈功能的文章就介紹到這了,更多相關(guān)go實(shí)現(xiàn)比特幣區(qū)塊鏈公鏈內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang如何使用struct的tag屬性的詳細(xì)介紹
這篇文章主要介紹了golang如何使用struct的tag屬性的詳細(xì)介紹,從例子說(shuō)起,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11go 對(duì)象池化組件 bytebufferpool使用詳解
這篇文章主要為大家介紹了go 對(duì)象池化組件 bytebufferpool使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10基于go實(shí)例網(wǎng)絡(luò)存儲(chǔ)協(xié)議詳解
這篇文章主要為大家介紹了基于go實(shí)例網(wǎng)絡(luò)存儲(chǔ)協(xié)議詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Go json omitempty如何實(shí)現(xiàn)可選屬性
在Go語(yǔ)言中,使用`omitempty`可以幫助我們?cè)谶M(jìn)行JSON序列化和反序列化時(shí),忽略結(jié)構(gòu)體中的零值或空值,本文介紹了如何通過(guò)將字段類型改為指針類型,并在結(jié)構(gòu)體的JSON標(biāo)簽中添加`omitempty`來(lái)實(shí)現(xiàn)這一功能,例如,將float32修改為*float322024-09-09Go并發(fā):使用sync.WaitGroup實(shí)現(xiàn)協(xié)程同步方式
這篇文章主要介紹了Go并發(fā):使用sync.WaitGroup實(shí)現(xiàn)協(xié)程同步方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05golang切片擴(kuò)容規(guī)則實(shí)現(xiàn)
這篇文章主要介紹了golang切片擴(kuò)容規(guī)則實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Golang并發(fā)發(fā)送HTTP請(qǐng)求的各種方法
在 Golang 領(lǐng)域,并發(fā)發(fā)送 HTTP 請(qǐng)求是優(yōu)化 Web 應(yīng)用程序的一項(xiàng)重要技能,本文探討了實(shí)現(xiàn)此目的的各種方法,從基本的 goroutine 到涉及通道和sync.WaitGroup 的高級(jí)技術(shù),需要的朋友可以參考下2024-02-02Go并發(fā)編程結(jié)構(gòu)體多字段原子操作示例詳解
這篇文章主要為大家介紹了Go并發(fā)編程結(jié)構(gòu)體多字段原子操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12go-zero數(shù)據(jù)的流處理利器fx使用詳解
這篇文章主要為大家介紹了go-zero數(shù)據(jù)的流處理利器fx使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05