go言语区块链实战完成复杂的区块与区块链

2026-07-20 19:22:52/知识/3 阅读

区块链实战

字节字段声明
4版本区块版本号 ,言语展示本区块屈就的区块区块区块验证轨则
32父区块头哈希值前一区块的Merkle树根的哈希值 ,一样采取SHA256筹算
32Merkle根该区块中生意的链实链Merkle树根的哈希值 ,一样采取SHA256筹算
4时分戳该区块产生发火的战完杂近似时分 ,切确到秒的成复UNIX时分戳 ,必须严格除夜于前11各区块的言语时分的中值,同时全节点也会拒接那些超出本身两个小时的区块区块区块时分戳的区块
4难度方针该区块工作量证实算法的难度方针,已独霸特定算法编码
4Nonce将来找到知足难度方针所设定的链实链随机数 ,为体味决32为随机数在算力飞升的战完杂气候下不足用的问题 ,端方时分戳和coinbase生意信息均改削,成复以此扩大年夜大年夜大年夜大年夜nonce的言语位数

寄看 :区块不存储hash值 ,节点领受区块后自力筹算并存储在外埠。区块区块区块

Version 1

区块相干:

​ 1.定义一个区块的链实链筹划Block

​ a.区块头 :6个字段

​ b.区块体 :字符串展示data

2.供给一个成立区块的编制

​ NewBlock(参数)

区块链相干

定义一个区块链筹划BlockChain

​ Block数组

供给一个成立BlockChain()的编制

​ NewBlockChain()

供给一个添加区块的编制

​ AddBlock(参数)

block.go文件

package mainimport (	"bytes"	"crypto/sha256"	"time")/*1.定义一个区块的筹划Block​a.区块头:6个字段​b.区块体
:字符串展示data*///区块type Block struct { 	Version int64   //版本	PerBlockHash []byte //前一个区块的hash值	Hash []byte //往后区块的hash值,是战完杂为了简化代码	MerKelRoot []byte  //梅克尔根	TimeStamp int64  //时分抽	Bits int64  //难度值	Nonce int64 //随机值//区块体	Data []byte  //生意信息}/*供给一个成立区块的编制NewBlock(参数)*/func NewBlock(data string ,prevBlockHash []byte) *Block { 	var block Block	block = Block{ 		Version:      1,		PerBlockHash: prevBlockHash,		//Hash:         []byte{ },   	//区块不存储hash值	,节点领受区块后自力筹算并存储在外埠。成复		MerKelRoot:   []byte{ },		TimeStamp:    time.Now().Unix(),		Bits:         1,		Nonce:        1,		Data:         []byte(data),	}	block.SetHash()  //加添Hash	return &block}func (block *Block) SetHash() { 	// 源码里面是要传二维切片 func Join(s [][]byte, sep []byte) []byte	tmp :=[][]byte{ 		IntToByte(block.Version),		block.PerBlockHash,		block.MerKelRoot,		IntToByte(block.TimeStamp),		IntToByte(block.Bits),		IntToByte(block.Nonce),	}	data:=bytes.Join(tmp,[]byte{ })    //此后再筹算hash	hash := sha256.Sum256(data)	block.Hash = hash[:]  //变切片}//草创块func NewGensisBlock() *Block{ 	return NewBlock("Genesis Block!",[]byte{ })}

blockChain.go文件

package main/*1. 定义一个区块链筹划BlockChain   Block数组*/type BlockChain struct {    blocks []*Block}/*2. 供给一个成立BlockChain()的编制   NewBlockChain()*/func NewBlockChain() *BlockChain {    block := NewGensisBlock()   return &BlockChain{ blocks:[]*Block{ block}}  //成立只需一个元素的区块链	,初始化}/*3. 供给一个添加区块的编制   AddBlock(参数)*/func (bc *BlockChain)AddBlock(data string)  {    PerBlockHash := bc.blocks[len(bc.blocks)-1].Hash  //这一个区块的哈希是前一块的哈希值   block := NewBlock(data,PerBlockHash)   bc.blocks = append(bc.blocks,block)}

utils.go文件

package mainimport (   "bytes"   "encoding/binary"   "fmt"   "os")func IntToByte(num int64) []byte {    //func Write(w io.Writer, order ByteOrder, data inte***ce{ }) error {    var buffer bytes.Buffer   err := binary.Write(&buffer, binary.BigEndian, num)   CheckErr("IntToByte",err)   return buffer.Bytes()}func CheckErr(position string,err error) {    if err != nil {       fmt.Println("error ,pos:",position,err)      os.Exit(1)   }}

main.go文件

package mainimport "fmt"func main() {    bc := NewBlockChain()   bc.AddBlock("A send B 1BTC")   bc.AddBlock("B send C 1BTC")   for _,block := range bc.blocks {       fmt.Printf("Version : %d\n",block.Version)      fmt.Printf("PerBlockHash : %x\n",block.PerBlockHash)      fmt.Printf("Hash : %x\n",block.Hash)      fmt.Printf("MerKelRoot : %x\n",block.MerKelRoot)      fmt.Printf("TimeStamp : %d\n",block.TimeStamp)      fmt.Printf("Bits : %d\n",block.Bits)      fmt.Printf("Nonce : %d\n",block.Nonce)      fmt.Printf("Data : %s\n",block.Data)   }}

奉行下场

以上就是Go言措辞语区块链实战完成复杂的区块与区块链的具体内容,更多关于go言语完成区块与区块链的材料请存眷完竣下载此外相干文章!

#免责声明#

本站提供的一切资源、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络收集整理,版权争议与本站无关。