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++}} }總結
- 上一篇: java发送邮件354_基于SMTP的J
- 下一篇: 过渡效果_剪映教程:剪映怎么添加视频之间