成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

區(qū)塊鏈概念 That You Must Know 第四期(3)

k00baa / 1037人閱讀

摘要:區(qū)塊里的哈希是如何產(chǎn)生的如第四期篇里講到的,每個(gè)區(qū)塊里包含了,,,,,等信息。,就是將剩下的其他信息拼接成字符串,然后將這個(gè)字符串進(jìn)行哈希的結(jié)果。當(dāng)值取到某數(shù),并使之形成的哈希值匹配上了當(dāng)前的有效哈希難度,哈希碰撞就成功了。

第四期 簡(jiǎn)介go語(yǔ)言下挖礦難度的代碼實(shí)現(xiàn)(3)
卡酷少

Wechat:13260325501


經(jīng)過(guò)之前所有的鋪墊,這一期我們將對(duì)難度的代碼實(shí)現(xiàn)作出簡(jiǎn)單演示。(以下是在不考慮近期各機(jī)構(gòu)對(duì)于區(qū)塊存儲(chǔ)信息改進(jìn)的情況下。對(duì)于區(qū)塊信息的調(diào)整,有比如“隔離驗(yàn)證”等方法。暫時(shí)不了解沒(méi)有關(guān)系,本期并不涉及這點(diǎn)。之后隨著學(xué)習(xí)的深入,我們會(huì)一一介紹給大家。)

本期我們將對(duì)上期圖二中幾項(xiàng)信息給出示例,然后代碼模擬難度的實(shí)現(xiàn)。

區(qū)塊里的哈希是如何產(chǎn)生的?

如第四期(1)篇里講到的,每個(gè)區(qū)塊里包含了index,current hash,previous hash,timestamp,data,nounce等信息。current hash,就是將剩下的其他信息拼接成字符串,然后將這個(gè)字符串進(jìn)行哈希的結(jié)果。正如上一個(gè)區(qū)塊的當(dāng)前哈希也是由它之前的區(qū)塊的這些信息哈希生成的。

其中,nounce作為計(jì)算機(jī)窮舉的隨機(jī)數(shù),不斷變化,形成字符串的變化,產(chǎn)生了不同的哈希值。這個(gè)哈希值不斷去匹配現(xiàn)階段的哈希難度。當(dāng)nounce值取到某數(shù),并使之形成的哈希值匹配上了當(dāng)前的有效哈希難度,哈希碰撞就成功了。

以下為代碼實(shí)現(xiàn)

哈希sha256

先給出代碼

/*
代碼邏輯:
    第一步:導(dǎo)入crypto/sha256庫(kù)
    第二步:聲明字符串
    第三步:sha256.New()創(chuàng)建一個(gè)對(duì)象
    第四步:將字符串轉(zhuǎn)換為字節(jié)數(shù)組
    第五步:使用對(duì)象調(diào)用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))


    //輸出兩個(gè)哈希是否相等,bytes.Equal()
    fmt.Println(bytes.Equal(first.Sum(nil), second.Sum(nil)))

}

==sha256== 輸出結(jié)果:

0000e1343c8d9ec8a8996f0c1c8d1f9f1d954a750c3db5525205f401c516222d
185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
false

Process finished with exit code 0

其中一些函數(shù)大家一定急于了解,但這些函數(shù)的封裝過(guò)于艱深,我們?cè)诖瞬蛔魃罹俊V饕氖谴蠹乙涀∷膫€(gè)關(guān)鍵步驟3,4,5,6,并熟練使用。其中包括以下幾點(diǎn):

==sha256.New()== 有返回值,需要聲明變量并接收。且它的返回值一個(gè)是哈希對(duì)象,而且是一個(gè)指針對(duì)象。它可以調(diào)用一些方法,其中有write方法?!?步

哈希對(duì)象調(diào)用 ==obj.Write()== 方法是需要傳參,且參數(shù)類(lèi)型為字節(jié)數(shù)組。所以涉及到要將哈希的字符串先轉(zhuǎn)化為 ==[ ]byte== 類(lèi)型——第4步第5步

哈希對(duì)象調(diào)用 ==first.Sum(nil)== 方法返回哈希值,方法有參數(shù)且參數(shù)固定為==nil==;可以聲明變量接收或者直接輸出?!?步

關(guān)于哈希難度的判斷

要寫(xiě)出挖礦難度的完整代碼,其中有一環(huán)節(jié)必須要解決。那就是如何判斷哈希難度是否是有效的呢?下面我們先給出代碼

/*
代碼邏輯:
(我們將代碼)
    第一步:聲明一個(gè)隨機(jī)取的哈希值,來(lái)在之后測(cè)驗(yàn)isValidDifficulty是否有效
    第二步:設(shè)置當(dāng)前哈希難度,difficulty
    第三步:寫(xiě)入一個(gè)循環(huán)來(lái)迭代匹配哈希值對(duì)應(yīng)位置的值,查看是否這個(gè)位置是否是哈希難度要求的值
    第四步:打印對(duì)這個(gè)哈希值的判斷
*/

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 運(yùn)行結(jié)果

true
Process finished with exit code 0

h1 運(yùn)行結(jié)果

false
Process finished with exit code 0

h2 運(yùn)行結(jié)果

false
Process finished with exit code 0

于是我們將代碼封裝一下,使它看起來(lái)更清晰,更便于調(diào)用。

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
}

下一篇給出完整代碼

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/24084.html

相關(guān)文章

  • 區(qū)塊概念 That You Must Know 四期(4)

    摘要:我們給出的項(xiàng)數(shù)據(jù)只是一個(gè)簡(jiǎn)單舉例,并沒(méi)有完全列舉生成區(qū)塊哈希時(shí)參與的所有數(shù)據(jù)。這里的哈希難度是我們認(rèn)為設(shè)定的,并不是真實(shí)哈希難度的生成方法。真是的哈希難度是由很復(fù)雜的數(shù)學(xué)模型實(shí)現(xiàn)的,是會(huì)根據(jù)當(dāng)前全網(wǎng)算力自動(dòng)調(diào)整的。。 第四期 簡(jiǎn)介go語(yǔ)言下挖礦難度的代碼實(shí)現(xiàn)(4) 卡酷少Wechat:13260325501 之前的都講完了,因?yàn)榇a太多導(dǎo)致文章比較長(zhǎng)。所以新增了一片。在這最后的最后...

    funnyZhang 評(píng)論0 收藏0
  • 區(qū)塊概念 That You Must Know 四期(2)

    摘要:下圖給出一個(gè)簡(jiǎn)單的列表圖什么是哈希和哈希值為理解挖礦的代碼機(jī)制,首先解決幾個(gè)概念。第一個(gè)就是哈希。哈希值為十六進(jìn)制表示的數(shù),且長(zhǎng)度固定。也正是哈希值的這些特點(diǎn),賦予了其加密信息時(shí)更高的安全性。 第四期 挖礦的相關(guān)算法(2) 卡酷少Wechat:13260325501 看過(guò)(1)篇,相信你一定對(duì)挖礦的機(jī)制有了一點(diǎn)了解。那么本篇,我們來(lái)一起看一下挖礦中涉及的算法。 在本篇文章中,如果在...

    Sourcelink 評(píng)論0 收藏0
  • 區(qū)塊概念 That You Must Know 四期(1)

    摘要:挖礦是什么挖礦是將一段時(shí)間內(nèi)比特幣系統(tǒng)中發(fā)生的交易進(jìn)行確認(rèn),并記錄在區(qū)塊鏈上形成新區(qū)塊的過(guò)程。而成功搶到記賬權(quán)的礦工,會(huì)獲得系統(tǒng)新生的比特幣獎(jiǎng)勵(lì)。礦機(jī)只執(zhí)行單一的計(jì)算程序,實(shí)際是礦工之間比拼算力,擁有較多算力的礦工挖到比特幣的概率更大。 第四期 有關(guān)挖礦和獲取比特幣(1) 卡酷少Wechat:13260325501 了解了這么多,大家是否想獲取一些屬于自己的比特幣呢?之前我們?cè)诘谝?..

    evin2016 評(píng)論0 收藏0
  • 區(qū)塊概念 That You Must Know 第二期

    摘要:第二期比特幣的總量和發(fā)行卡酷少上期我們簡(jiǎn)單了解了比特幣的誕生及其創(chuàng)始人。記賬完成后,他將獲得一定數(shù)量的比特幣。每萬(wàn)個(gè)區(qū)塊后,每個(gè)區(qū)塊的比特幣產(chǎn)量減半。從年至今,比特幣產(chǎn)量已經(jīng)減半次,當(dāng)前每個(gè)區(qū)塊發(fā)行個(gè)比特幣。早期約有的比特幣網(wǎng)站靠其導(dǎo)流。 第二期 比特幣的總量和發(fā)行 卡酷少Wechat:13260325501 上期我們簡(jiǎn)單了解了比特幣的誕生及其創(chuàng)始人。今天我們將對(duì)比特幣做一些深入和...

    娣辯孩 評(píng)論0 收藏0
  • 區(qū)塊概念 That You Must Know 第一期.md

    摘要:而比特幣,是由中本聰化名提出,一種點(diǎn)對(duì)點(diǎn),去中心化的數(shù)字資產(chǎn)。比特幣預(yù)計(jì)共有萬(wàn)枚,大約將在年發(fā)行完畢。比特幣電子現(xiàn)金系統(tǒng)解決了在沒(méi)有中心機(jī)構(gòu)的情況下,總量恒定的數(shù)字資產(chǎn)的發(fā)行和流通問(wèn)題。比特幣通過(guò)比特幣系統(tǒng)進(jìn)行轉(zhuǎn)賬,全網(wǎng)記錄公開(kāi)透明。 第一期 比特幣與中本聰 卡酷少Wechat:13260325501 說(shuō)起區(qū)塊鏈,就不得不提比特幣。也正是因?yàn)楸忍貛攀袌?chǎng)的火熱,比特幣系統(tǒng)的去中心化概...

    zorro 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<