日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PoW算法

發布時間:2024/7/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PoW算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、PoW——工作量證明
  • 二、go語言簡單案例


前言

提示:以下是本篇文章正文內容,下面案例可供參考

一、PoW——工作量證明

? Proof-of-Work 簡稱 PoW,即為工作量證明
? 通過計算一個數值,使得拼揍上交易數據后內容的值滿足規定的上限,在節點成功
找到滿足的 Hash 值之后,會馬上對全網進行廣播打包區塊,網絡的節點收到廣播
打包區塊,會立刻對其進行驗證
? 網絡中只有最快解密的區塊,才會添加的賬本中,其他的節點進行復制,這樣就保
證了整個賬本的唯一性
? 假如節點有任何的作弊行為,都會導致網絡的節點驗證不通過,直接丟棄其打包的
區塊,這個區塊就無法記錄到總賬本中,作弊的節點耗費的成本就白費了,因此在
巨大的挖礦成本下,也使得礦工自覺自愿的遵守比特幣系統的共識協議,也就確保
了整個系統的安全

二、go語言簡單案例

package mainimport ("time""strconv""crypto/sha256""encoding/hex""fmt""strings" )//通過代碼,實現PoW挖礦//定義區塊 type Block struct {//上一個區塊的哈希PreHash string//當前區塊的哈希HashCode string//時間戳TimeStamp string//難度系數Diff int//交易信息Data string//區塊高度Index int//隨機值Nonce int }//第一個區塊:創世區塊 func GenerateFirstBlock(data string) Block {//創建第一個Blockvar firstblock Blockfirstblock.PreHash = "0"firstblock.TimeStamp = time.Now().String()//暫設為4firstblock.Diff = 4//交易信息firstblock.Data = datafirstblock.Index = 1firstblock.Nonce = 0//通過sha256得到自己的哈希firstblock.HashCode = GenerationHashValue(firstblock)return firstblock }//生成區塊的哈希值 func GenerationHashValue(block Block) string {//按照比特幣的寫法,將區塊的所有屬性拼接后做哈希運算//int轉為字符串var hashdata = strconv.Itoa(block.Index) + strconv.Itoa(block.Nonce) +strconv.Itoa(block.Diff) + block.TimeStamp//算哈希var sha = sha256.New()sha.Write([]byte(hashdata))hashed := sha.Sum(nil)return hex.EncodeToString(hashed) }func main() {//測試創建創世區塊var firstBlock = GenerateFirstBlock("創世區塊")fmt.Println(firstBlock)fmt.Println(firstBlock.Data)//需要生成下一個區塊GenerateNextBlock("第二區塊", firstBlock) }//產生新的區塊 func GenerateNextBlock(data string, oldBolock Block) Block {//產生一個新的區塊var newBlock BlocknewBlock.TimeStamp = time.Now().String()//難度系數newBlock.Diff = 5//高度newBlock.Index = 2newBlock.Data = datanewBlock.PreHash = oldBolock.HashCodenewBlock.Nonce = 0//創建pow()算法的方法//計算前導0為4個的哈希值newBlock.HashCode = pow(newBlock.Diff, &newBlock)return newBlock }//pow算法 func pow(diff int, block *Block) string {//實現不停地去挖礦for {//認為是挖了一次礦了hash := GenerationHashValue(*block)//挖礦過程的哈希打印fmt.Println(hash)//判斷哈希值前導0是否為diff個0//strings.Repeat:判斷hash是否有diff個0,寫1,就判斷為有多少個1if strings.HasPrefix(hash, strings.Repeat("0", diff)) {//挖礦成功fmt.Println("挖礦成功")return hash} else {//沒挖到//隨機值自增block.Nonce++}} }

總結

以上是生活随笔為你收集整理的PoW算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。