亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用go語言區塊鏈實戰實現簡單的區塊與區塊鏈

發布時間:2021-10-29 17:15:39 來源:億速云 閱讀:190 作者:iii 欄目:開發技術

本篇內容介紹了“怎么用go語言區塊鏈實戰實現簡單的區塊與區塊鏈”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

區塊鏈實戰

字節字段說明
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 main
import (
	"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 main

import (
   "bytes"
   "encoding/binary"
   "fmt"
   "os"
)

func IntToByte(num int64) []byte {
   //func Write(w io.Writer, order ByteOrder, data interface{}) 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 main
import "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語言區塊鏈實戰實現簡單的區塊與區塊鏈”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

重庆市| 成武县| 八宿县| 崇文区| 纳雍县| 永定县| 松阳县| 神池县| 汉阴县| 屏东县| 红安县| 凌源市| 张家界市| 廊坊市| 个旧市| 全南县| 称多县| 辰溪县| 金沙县| 彰化县| 曲沃县| 盐津县| 天水市| 岑巩县| 隆回县| 抚松县| 江华| 德江县| 金寨县| 北安市| 贡山| 内乡县| 孟村| 临安市| 万州区| 平定县| 平利县| 密山市| 吉水县| 清远市| 凌云县|