最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用go實(shí)現(xiàn)簡易比特幣區(qū)塊鏈公鏈功能

 更新時間:2021年01月20日 10:29:59   作者:sgentle  
這篇文章主要介紹了使用go實(shí)現(xiàn)簡易比特幣區(qū)塊鏈公鏈功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

使用go語言實(shí)現(xiàn)具備以下功能的簡易區(qū)塊鏈

  • 區(qū)塊與區(qū)塊鏈
  • 共識機(jī)制
  • 數(shù)據(jù)庫
  • Cli命令行操作
  • 交易管理
  • 密碼學(xué)
  • 數(shù)字簽名
  • 交易緩存池
  • P2P網(wǎng)絡(luò)管理

由于平時還要進(jìn)行論文工作,項(xiàng)目不定時更新

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)一個最基本的區(qū)塊結(jié)構(gòu)
type Block struct {
	TimeStamp int64 //時間戳,區(qū)塊產(chǎn)生的時間
	Heigth int64//區(qū)塊高度(索引、號碼)代表當(dāng)前區(qū)塊的高度
	PreBlockHash []byte//前一個區(qū)塊(父區(qū)塊)的哈希
	Hash []byte//當(dāng)前區(qū)塊的哈希
	Data []byte//交易數(shù)據(jù)
}
//創(chuàng)建一個新的區(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)
	//時間轉(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 //存儲有序的區(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 //對指定的區(qū)塊進(jìn)行驗(yàn)證
	target *big.Int //大數(shù)據(jù)存儲
}
//創(chuàng)建新的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) {
	//數(shù)據(jù)拼接
	var nonce=0 //碰撞次數(shù)
	var hash [32]byte //生成的hash
	var hashInt big.Int //存儲轉(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ū)塊屬性拼接起來,返回字節(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)簡易比特幣區(qū)塊鏈公鏈功能的文章就介紹到這了,更多相關(guān)go實(shí)現(xiàn)比特幣區(qū)塊鏈公鏈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang拾遺之自定義類型和方法集詳解

    Golang拾遺之自定義類型和方法集詳解

    golang拾遺主要是用來記錄一些遺忘了的、平時從沒注意過的golang相關(guān)知識。這篇文章主要整理了一下Golang如何自定義類型和方法集,需要的可以參考一下
    2023-02-02
  • 在Visual Studio Code中配置GO開發(fā)環(huán)境的詳細(xì)教程

    在Visual Studio Code中配置GO開發(fā)環(huán)境的詳細(xì)教程

    這篇文章主要介紹了在Visual Studio Code中配置GO開發(fā)環(huán)境的詳細(xì)教程,需要的朋友可以參考下
    2017-02-02
  • Go語言帶緩沖的通道實(shí)現(xiàn)

    Go語言帶緩沖的通道實(shí)現(xiàn)

    這篇文章主要介紹了Go語言帶緩沖的通道實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Go語言實(shí)現(xiàn)登錄驗(yàn)證代碼案例

    Go語言實(shí)現(xiàn)登錄驗(yàn)證代碼案例

    這篇文章主要介紹了Go語言實(shí)現(xiàn)登錄驗(yàn)證代碼案例,代碼和圖文講解的很清晰,有感興趣的可以學(xué)習(xí)下
    2021-03-03
  • go-micro微服務(wù)JWT跨域認(rèn)證問題

    go-micro微服務(wù)JWT跨域認(rèn)證問題

    JWT 以 JSON 對象的形式安全傳遞信息。因?yàn)榇嬖跀?shù)字簽名,因此所傳遞的信息是安全的,這篇文章主要介紹了go-micro微服務(wù)JWT跨域認(rèn)證,需要的朋友可以參考下
    2023-01-01
  • 利用go-zero在Go中快速實(shí)現(xiàn)JWT認(rèn)證的步驟詳解

    利用go-zero在Go中快速實(shí)現(xiàn)JWT認(rèn)證的步驟詳解

    這篇文章主要介紹了如何利用go-zero在Go中快速實(shí)現(xiàn)JWT認(rèn)證,本文分步驟通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-10-10
  • golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)現(xiàn)

    golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)現(xiàn)

    這篇文章主要為大家介紹了golang架構(gòu)設(shè)計(jì)開閉原則手寫實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 詳解Go如何優(yōu)雅的對時間進(jìn)行格式化

    詳解Go如何優(yōu)雅的對時間進(jìn)行格式化

    這篇文章主要為大家詳細(xì)介紹了Go語言中是如何優(yōu)雅的對時間進(jìn)行格式化的,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-06-06
  • 初探GO中unsafe包的使用

    初探GO中unsafe包的使用

    unsafe是Go語言標(biāo)準(zhǔn)庫中的一個包,提供了一些不安全的編程操作,本文將深入探討Go語言中的unsafe包,介紹它的使用方法和注意事項(xiàng),感興趣的可以了解下
    2023-08-08
  • Golang使用Apache PLC4X連接modbus的示例代碼

    Golang使用Apache PLC4X連接modbus的示例代碼

    Modbus是一種串行通信協(xié)議,是Modicon公司于1979年為使用可編程邏輯控制器(PLC)通信而發(fā)表,這篇文章主要介紹了Golang使用Apache PLC4X連接modbus的示例代碼,需要的朋友可以參考下
    2024-07-07

最新評論

南和县| 陈巴尔虎旗| 固阳县| 十堰市| 亚东县| 兴城市| 金寨县| 嫩江县| 海门市| 长岭县| 普陀区| 时尚| 监利县| 德化县| 鹤岗市| 房山区| 锡林浩特市| 分宜县| 伊金霍洛旗| 乌兰浩特市| 利津县| 寿阳县| 班戈县| 漳浦县| 甘泉县| 札达县| 黄石市| 河西区| 高州市| 政和县| 关岭| 贵港市| 开原市| 华阴市| 隆安县| 南康市| 哈密市| 濉溪县| 修文县| 门源| 称多县|