摘要:區塊里的哈希是如何產生的如第四期篇里講到的,每個區塊里包含了,,,,,等信息。,就是將剩下的其他信息拼接成字符串,然后將這個字符串進行哈希的結果。當值取到某數,并使之形成的哈希值匹配上了當前的有效哈希難度,哈希碰撞就成功了。
第四期 簡介go語言下挖礦難度的代碼實現(3)
卡酷少Wechat:13260325501
經過之前所有的鋪墊,這一期我們將對難度的代碼實現作出簡單演示。(以下是在不考慮近期各機構對于區塊存儲信息改進的情況下。對于區塊信息的調整,有比如“隔離驗證”等方法。暫時不了解沒有關系,本期并不涉及這點。之后隨著學習的深入,我們會一一介紹給大家。)
本期我們將對上期圖二中幾項信息給出示例,然后代碼模擬難度的實現。
區塊里的哈希是如何產生的?如第四期(1)篇里講到的,每個區塊里包含了index,current hash,previous hash,timestamp,data,nounce等信息。current hash,就是將剩下的其他信息拼接成字符串,然后將這個字符串進行哈希的結果。正如上一個區塊的當前哈希也是由它之前的區塊的這些信息哈希生成的。
其中,nounce作為計算機窮舉的隨機數,不斷變化,形成字符串的變化,產生了不同的哈希值。這個哈希值不斷去匹配現階段的哈希難度。當nounce值取到某數,并使之形成的哈希值匹配上了當前的有效哈希難度,哈希碰撞就成功了。
以下為代碼實現
哈希sha256先給出代碼
/* 代碼邏輯: 第一步:導入crypto/sha256庫 第二步:聲明字符串 第三步:sha256.New()創建一個對象 第四步:將字符串轉換為字節數組 第五步:使用對象調用write方法 第六步:first.Sum(nil) 返回hash值 */ package main import ( //第1步 "crypto/sha256" "fmt" "bytes" ) func main() { //第2步 const input1 = "199778A - > B 100" //第3步 first := sha256.New() //第4步 //第5步 first.Write([]byte(input1)) //第6步 fmt.Printf("%x ", first.Sum(nil)) const input2 = "Hello" second := sha256.New() second.Write([]byte(input2)) fmt.Printf("%x ", second.Sum(nil)) //輸出兩個哈希是否相等,bytes.Equal() fmt.Println(bytes.Equal(first.Sum(nil), second.Sum(nil))) }
==sha256== 輸出結果:
0000e1343c8d9ec8a8996f0c1c8d1f9f1d954a750c3db5525205f401c516222d 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969 false Process finished with exit code 0
其中一些函數大家一定急于了解,但這些函數的封裝過于艱深,我們在此不作深究。主要的是大家要記住四個關鍵步驟3,4,5,6,并熟練使用。其中包括以下幾點:
==sha256.New()== 有返回值,需要聲明變量并接收。且它的返回值一個是哈希對象,而且是一個指針對象。它可以調用一些方法,其中有write方法。——第3步
哈希對象調用 ==obj.Write()== 方法是需要傳參,且參數類型為字節數組。所以涉及到要將哈希的字符串先轉化為 ==[ ]byte== 類型——第4步第5步
哈希對象調用 ==first.Sum(nil)== 方法返回哈希值,方法有參數且參數固定為==nil==;可以聲明變量接收或者直接輸出。——第6步
關于哈希難度的判斷要寫出挖礦難度的完整代碼,其中有一環節必須要解決。那就是如何判斷哈希難度是否是有效的呢?下面我們先給出代碼
/* 代碼邏輯: (我們將代碼) 第一步:聲明一個隨機取的哈希值,來在之后測驗isValidDifficulty是否有效 第二步:設置當前哈希難度,difficulty 第三步:寫入一個循環來迭代匹配哈希值對應位置的值,查看是否這個位置是否是哈希難度要求的值 第四步:打印對這個哈希值的判斷 */ package main import "fmt" func main() { h := "0000e1343c8d9ec8a8996f0c1c8d1f9f1d954a750c3db5525205f401c516222d" //h1 := "0033e1343c8d9ec8a8996f0c1c8d1f9f1d954a750c3db5525205f401c516222d" //h2 := "0003e1343c8d9ec8a8996f0c1c8d1f9f1d954a750c3db5525205f401c516222d" difficulty := 4 var i int for i = 0; i < len(h); i++ { if h[i] != "0" { break } } fmt.Print( i >= difficulty) }
h 運行結果
true Process finished with exit code 0
h1 運行結果
false Process finished with exit code 0
h2 運行結果
false Process finished with exit code 0
于是我們將代碼封裝一下,使它看起來更清晰,更便于調用。
package main import "fmt" func main() { h := "0000e1343c8d9ec8a8996f0c1c8d1f9f1d954a750c3db5525205f401c516222d" fmt.Println(isValidHashDifficulty(h, 4)) } func isValidHashDifficulty(h string, difficulty int) bool { b := len(h) // 64 var i int for i = 0; i < b; i++ { if h[i] != "0" { break } } return i >= difficulty }
下一篇給出完整代碼
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/24084.html
摘要:我們給出的項數據只是一個簡單舉例,并沒有完全列舉生成區塊哈希時參與的所有數據。這里的哈希難度是我們認為設定的,并不是真實哈希難度的生成方法。真是的哈希難度是由很復雜的數學模型實現的,是會根據當前全網算力自動調整的。。 第四期 簡介go語言下挖礦難度的代碼實現(4) 卡酷少Wechat:13260325501 之前的都講完了,因為代碼太多導致文章比較長。所以新增了一片。在這最后的最后...
摘要:下圖給出一個簡單的列表圖什么是哈希和哈希值為理解挖礦的代碼機制,首先解決幾個概念。第一個就是哈希。哈希值為十六進制表示的數,且長度固定。也正是哈希值的這些特點,賦予了其加密信息時更高的安全性。 第四期 挖礦的相關算法(2) 卡酷少Wechat:13260325501 看過(1)篇,相信你一定對挖礦的機制有了一點了解。那么本篇,我們來一起看一下挖礦中涉及的算法。 在本篇文章中,如果在...
摘要:挖礦是什么挖礦是將一段時間內比特幣系統中發生的交易進行確認,并記錄在區塊鏈上形成新區塊的過程。而成功搶到記賬權的礦工,會獲得系統新生的比特幣獎勵。礦機只執行單一的計算程序,實際是礦工之間比拼算力,擁有較多算力的礦工挖到比特幣的概率更大。 第四期 有關挖礦和獲取比特幣(1) 卡酷少Wechat:13260325501 了解了這么多,大家是否想獲取一些屬于自己的比特幣呢?之前我們在第一...
摘要:第二期比特幣的總量和發行卡酷少上期我們簡單了解了比特幣的誕生及其創始人。記賬完成后,他將獲得一定數量的比特幣。每萬個區塊后,每個區塊的比特幣產量減半。從年至今,比特幣產量已經減半次,當前每個區塊發行個比特幣。早期約有的比特幣網站靠其導流。 第二期 比特幣的總量和發行 卡酷少Wechat:13260325501 上期我們簡單了解了比特幣的誕生及其創始人。今天我們將對比特幣做一些深入和...
摘要:而比特幣,是由中本聰化名提出,一種點對點,去中心化的數字資產。比特幣預計共有萬枚,大約將在年發行完畢。比特幣電子現金系統解決了在沒有中心機構的情況下,總量恒定的數字資產的發行和流通問題。比特幣通過比特幣系統進行轉賬,全網記錄公開透明。 第一期 比特幣與中本聰 卡酷少Wechat:13260325501 說起區塊鏈,就不得不提比特幣。也正是因為比特幣市場的火熱,比特幣系統的去中心化概...
閱讀 1181·2023-04-26 02:42
閱讀 1633·2021-11-12 10:36
閱讀 1780·2021-10-25 09:47
閱讀 1262·2021-08-18 10:22
閱讀 1801·2019-08-30 15:52
閱讀 1213·2019-08-30 10:54
閱讀 2635·2019-08-29 18:46
閱讀 3496·2019-08-26 18:27