PoW算法
文章目錄
- 前言
- 一、PoW——工作量證明
- 二、go語言簡單案例
前言
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、PoW——工作量證明
? Proof-of-Work 簡稱 PoW,即為工作量證明
? 通過計算一個數(shù)值,使得拼揍上交易數(shù)據(jù)后內(nèi)容的值滿足規(guī)定的上限,在節(jié)點成功
找到滿足的 Hash 值之后,會馬上對全網(wǎng)進(jìn)行廣播打包區(qū)塊,網(wǎng)絡(luò)的節(jié)點收到廣播
打包區(qū)塊,會立刻對其進(jìn)行驗證
? 網(wǎng)絡(luò)中只有最快解密的區(qū)塊,才會添加的賬本中,其他的節(jié)點進(jìn)行復(fù)制,這樣就保
證了整個賬本的唯一性
? 假如節(jié)點有任何的作弊行為,都會導(dǎo)致網(wǎng)絡(luò)的節(jié)點驗證不通過,直接丟棄其打包的
區(qū)塊,這個區(qū)塊就無法記錄到總賬本中,作弊的節(jié)點耗費的成本就白費了,因此在
巨大的挖礦成本下,也使得礦工自覺自愿的遵守比特幣系統(tǒng)的共識協(xié)議,也就確保
了整個系統(tǒng)的安全
二、go語言簡單案例
package mainimport ("time""strconv""crypto/sha256""encoding/hex""fmt""strings" )//通過代碼,實現(xiàn)PoW挖礦//定義區(qū)塊 type Block struct {//上一個區(qū)塊的哈希PreHash string//當(dāng)前區(qū)塊的哈希HashCode string//時間戳TimeStamp string//難度系數(shù)Diff int//交易信息Data string//區(qū)塊高度Index int//隨機值Nonce int }//第一個區(qū)塊:創(chuàng)世區(qū)塊 func GenerateFirstBlock(data string) Block {//創(chuàng)建第一個Blockvar firstblock Blockfirstblock.PreHash = "0"firstblock.TimeStamp = time.Now().String()//暫設(shè)為4firstblock.Diff = 4//交易信息firstblock.Data = datafirstblock.Index = 1firstblock.Nonce = 0//通過sha256得到自己的哈希firstblock.HashCode = GenerationHashValue(firstblock)return firstblock }//生成區(qū)塊的哈希值 func GenerationHashValue(block Block) string {//按照比特幣的寫法,將區(qū)塊的所有屬性拼接后做哈希運算//int轉(zhuǎn)為字符串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() {//測試創(chuàng)建創(chuàng)世區(qū)塊var firstBlock = GenerateFirstBlock("創(chuàng)世區(qū)塊")fmt.Println(firstBlock)fmt.Println(firstBlock.Data)//需要生成下一個區(qū)塊GenerateNextBlock("第二區(qū)塊", firstBlock) }//產(chǎn)生新的區(qū)塊 func GenerateNextBlock(data string, oldBolock Block) Block {//產(chǎn)生一個新的區(qū)塊var newBlock BlocknewBlock.TimeStamp = time.Now().String()//難度系數(shù)newBlock.Diff = 5//高度newBlock.Index = 2newBlock.Data = datanewBlock.PreHash = oldBolock.HashCodenewBlock.Nonce = 0//創(chuàng)建pow()算法的方法//計算前導(dǎo)0為4個的哈希值newBlock.HashCode = pow(newBlock.Diff, &newBlock)return newBlock }//pow算法 func pow(diff int, block *Block) string {//實現(xiàn)不停地去挖礦for {//認(rèn)為是挖了一次礦了hash := GenerationHashValue(*block)//挖礦過程的哈希打印fmt.Println(hash)//判斷哈希值前導(dǎo)0是否為diff個0//strings.Repeat:判斷hash是否有diff個0,寫1,就判斷為有多少個1if strings.HasPrefix(hash, strings.Repeat("0", diff)) {//挖礦成功fmt.Println("挖礦成功")return hash} else {//沒挖到//隨機值自增block.Nonce++}} }總結(jié)
- 上一篇: java发送邮件354_基于SMTP的J
- 下一篇: linux 串口最高速率,Uart 1