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

go語(yǔ)言區(qū)塊鏈實(shí)戰(zhàn)實(shí)現(xiàn)簡(jiǎn)單的區(qū)塊與區(qū)塊鏈

 更新時(shí)間:2021年10月29日 15:07:49   作者:小生凡一  
這篇文章主要為大家介紹了go語(yǔ)言區(qū)塊鏈的實(shí)戰(zhàn)學(xué)習(xí),來(lái)實(shí)現(xiàn)簡(jiǎn)單的區(qū)塊與區(qū)塊鏈?zhǔn)纠^(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助

區(qū)塊鏈實(shí)戰(zhàn)

字節(jié) 字段 說(shuō)明
4 版本 區(qū)塊版本號(hào),表示本區(qū)塊遵守的驗(yàn)證規(guī)則
32 父區(qū)塊頭哈希值 前一區(qū)塊的Merkle樹根的哈希值,同樣采取SHA256計(jì)算
32 Merkle根 該區(qū)塊中交易的Merkle樹根的哈希值,同樣采用SHA256計(jì)算
4 時(shí)間戳 該區(qū)塊產(chǎn)生的近似時(shí)間,精確到秒的UNIX時(shí)間戳,必須嚴(yán)格大于前11各區(qū)塊的時(shí)間的中值,同時(shí)全節(jié)點(diǎn)也會(huì)拒接那些超過(guò)自己兩個(gè)小時(shí)的時(shí)間戳的區(qū)塊
4 難度目標(biāo) 該區(qū)塊工作量證明算法的難度目標(biāo),已經(jīng)使用特定算法編碼
4 Nonce 未來(lái)找到滿足難度目標(biāo)所設(shè)定的隨機(jī)數(shù),為了解決32為隨機(jī)數(shù)在算力飛升的情況下不夠用的問(wèn)題,規(guī)定時(shí)間戳和coinbase交易信息均改變,以此擴(kuò)展nonce的位數(shù)

注意:區(qū)塊不存儲(chǔ)hash值,節(jié)點(diǎn)接受區(qū)塊后獨(dú)立計(jì)算并存儲(chǔ)在本地。

Version 1

區(qū)塊相關(guān):

​ 1.定義一個(gè)區(qū)塊的結(jié)構(gòu)Block

​ a.區(qū)塊頭:6個(gè)字段

​ b.區(qū)塊體:字符串表示data

2.提供一個(gè)創(chuàng)建區(qū)塊的方法

​ NewBlock(參數(shù))

區(qū)塊鏈相關(guān)

定義一個(gè)區(qū)塊鏈結(jié)構(gòu)BlockChain

​ Block數(shù)組

提供一個(gè)創(chuàng)建BlockChain()的方法

​ NewBlockChain()

提供一個(gè)添加區(qū)塊的方法

​ AddBlock(參數(shù))

block.go文件

package main
import (
	"bytes"
	"crypto/sha256"
	"time"
)
/*
1.定義一個(gè)區(qū)塊的結(jié)構(gòu)Block
​a.區(qū)塊頭:6個(gè)字段
​b.區(qū)塊體:字符串表示data
*/
//區(qū)塊
type Block struct {
	Version int64   //版本
	PerBlockHash []byte //前一個(gè)區(qū)塊的hash值
	Hash []byte //當(dāng)前區(qū)塊的hash值,是為了簡(jiǎn)化代碼
	MerKelRoot []byte  //梅克爾根
	TimeStamp int64  //時(shí)間抽
	Bits int64  //難度值
	Nonce int64 //隨機(jī)值
//區(qū)塊體
	Data []byte  //交易信息
}

/*
提供一個(gè)創(chuàng)建區(qū)塊的方法
NewBlock(參數(shù))
*/
func NewBlock(data string ,prevBlockHash []byte) *Block {
	var block Block
	block = Block{
		Version:      1,
		PerBlockHash: prevBlockHash,
		//Hash:         []byte{},   	//區(qū)塊不存儲(chǔ)hash值,節(jié)點(diǎn)接受區(qū)塊后獨(dú)立計(jì)算并存儲(chǔ)在本地。
		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{})    //之后再計(jì)算hash
	hash := sha256.Sum256(data)
	block.Hash = hash[:]  //變切片
}
//創(chuàng)始?jí)K
func NewGensisBlock() *Block{
	return NewBlock("Genesis Block!",[]byte{})
}

blockChain.go文件

package main
/*
1. 定義一個(gè)區(qū)塊鏈結(jié)構(gòu)BlockChain
   Block數(shù)組
*/
type BlockChain struct {
   blocks []*Block
}
/*
2. 提供一個(gè)創(chuàng)建BlockChain()的方法
   NewBlockChain()
*/
func NewBlockChain() *BlockChain {
   block := NewGensisBlock()
   return &BlockChain{blocks:[]*Block{block}}  //創(chuàng)建只有一個(gè)元素的區(qū)塊鏈,初始化
}
/*
3. 提供一個(gè)添加區(qū)塊的方法
   AddBlock(參數(shù))
*/
func (bc *BlockChain)AddBlock(data string)  {
   PerBlockHash := bc.blocks[len(bc.blocks)-1].Hash  //這一個(gè)區(qū)塊的哈希是前一塊的哈希值
   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)
   }
}

執(zhí)行結(jié)果

以上就是go語(yǔ)言區(qū)塊鏈實(shí)戰(zhàn)實(shí)現(xiàn)簡(jiǎn)單的區(qū)塊與區(qū)塊鏈的詳細(xì)內(nèi)容,更多關(guān)于go語(yǔ)言實(shí)現(xiàn)區(qū)塊與區(qū)塊鏈的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang壓縮與解壓縮文件的示例代碼

    golang壓縮與解壓縮文件的示例代碼

    這篇文章主要給大家介紹了golang壓縮與解壓縮文件,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • golang中defer的關(guān)鍵特性示例詳解

    golang中defer的關(guān)鍵特性示例詳解

    defer是golang語(yǔ)言中的關(guān)鍵字,用于資源的釋放,會(huì)在函數(shù)返回之前進(jìn)行調(diào)用。下面這篇文章主要給大家介紹了關(guān)于golang中defer的關(guān)鍵特性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-08-08
  • golang包快速生成base64驗(yàn)證碼的方法

    golang包快速生成base64驗(yàn)證碼的方法

    這篇文章主要介紹了golang包快速生成base64驗(yàn)證碼的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Go?interface?接口的最佳實(shí)踐經(jīng)驗(yàn)分享

    Go?interface?接口的最佳實(shí)踐經(jīng)驗(yàn)分享

    go?的接口在go的編程里面用的十分頻繁,尤其是空接口的使用,因?yàn)橛辛私涌?,才使得Go語(yǔ)言變得異常的強(qiáng)大,今天給大家介紹下Go?interface?接口的最佳實(shí)踐經(jīng)驗(yàn)分享,感興趣的朋友一起看看吧
    2022-04-04
  • Golang?gRPC?HTTP協(xié)議轉(zhuǎn)換示例

    Golang?gRPC?HTTP協(xié)議轉(zhuǎn)換示例

    這篇文章主要為大家介紹了Golang?gRPC?HTTP協(xié)議轉(zhuǎn)換示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 一文掌握go的sync.RWMutex鎖

    一文掌握go的sync.RWMutex鎖

    這篇文章主要介紹了一文掌握go的sync.RWMutex鎖,本文是為了在面試中能快速口述RW鎖,并非為了完整解答RW鎖的機(jī)制,需要的朋友可以參考下
    2023-03-03
  • go語(yǔ)言make初始化的實(shí)現(xiàn)

    go語(yǔ)言make初始化的實(shí)現(xiàn)

    Go語(yǔ)言中的make函數(shù)用于初始化切片、映射和通道,本文就來(lái)介紹一下go語(yǔ)言make初始化的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • 使用golang腳本基于kubeadm創(chuàng)建新的token(問(wèn)題分析)

    使用golang腳本基于kubeadm創(chuàng)建新的token(問(wèn)題分析)

    這篇文章主要介紹了使用golang腳本基于kubeadm創(chuàng)建新的token(問(wèn)題分析),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-10-10
  • Go語(yǔ)言的變量、函數(shù)、Socks5代理服務(wù)器示例詳解

    Go語(yǔ)言的變量、函數(shù)、Socks5代理服務(wù)器示例詳解

    這篇文章主要介紹了Go語(yǔ)言的變量、函數(shù)、Socks5代理服務(wù)器的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • Go語(yǔ)言刪除文本文件中的指定行操作代碼

    Go語(yǔ)言刪除文本文件中的指定行操作代碼

    假設(shè)現(xiàn)在有一個(gè)文本文件,我們需要?jiǎng)h除文件中亂碼的行。我們可以使用go的os庫(kù)來(lái)處理文件,遍歷整個(gè)文件然后將除過(guò)亂碼的行寫入一個(gè)新文件,以此來(lái)實(shí)現(xiàn)我們的需求,這篇文章主要介紹了Go語(yǔ)言刪除文本文件中的指定行,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

太湖县| 怀仁县| 富锦市| 平远县| 巴彦县| 周口市| 泉州市| 和龙市| 建昌县| 利津县| 鱼台县| 沙河市| 绍兴县| 雷山县| 新沂市| 治多县| 宝兴县| 长宁区| 九龙城区| 镇江市| 南雄市| 腾冲县| 罗江县| 姚安县| 东光县| 东乡县| 昌宁县| 商城县| 红原县| 鄂尔多斯市| 若尔盖县| 墨竹工卡县| 水富县| 茌平县| 阆中市| 巴青县| 兴国县| 县级市| 临沭县| 宿州市| 兰考县|