资讯专栏INFORMATION COLUMN

区块链概念 That You Must Know 第四期(4)

funnyZhang / 2913人阅读

摘要:我们给出的项数据只是一个简单举例,并没有完全列举生成区块哈希时参与的所有数据。这里的哈希难度是我们认为设定的,并不是真实哈希难度的生成方法。真是的哈希难度是由很复杂的数学模型实现的,是会根据当前全网算力自动调整的。。

第四期 简介go语言下挖矿难度的代码实现(4)
卡酷少

Wechat:13260325501


之前的都讲完了,因为代码太多导致文章比较长。所以新增了一片。在这最后的最后,我们将把挖矿的过程最终展示在大家面前。建议大家也将代码在goland里实际跑一跑,会更有感觉。

挖矿难度的代码实现

话不多说,直接给代码实现。

/*
代码逻辑:
    第一步:导库
    第二步:声明并将各项值初始化,共5个数据:blockId(区块id),preHash,timeStamp(区块诞生时间),data,nounce(不明白为什么需要这些数据的同学可以找回第四期(2)篇看一下)
    第三步:声明并创建一个哈希对象,shaObj
    第四步:迭代调用函数isValidHashDifficulty来判断哈希值有效与否。迭代中将nounce值以自增1的方式变化,再每次配合其他信息去生成当前哈希。
*/

package main

import (
    "fmt"
    //第1步
    "crypto/sha256"
)

func main() {
    //第2步
    var (
        blockId    = "100"
        preHash    = "0000fedaa499741317a18f1ad626f933776ad24822cb422634978bfe8005c94b"
        timeStamp = "Thu, 26 Apr 2018 03:30:54 GMT"
        data       = "A -> B 100"
        nonce      = 0  //将nounce初始化为0   (此处注意:nounce为int类型,但是在哈希时算数运算符两边的数据类型必须一致,所以要在字符串拼接时转换类型)
        hashString = "" //将当前hash初始化为空字符串
    )
    //第3步
    shaObj := sha256.New()
    //第4步
    for !isValidHashDifficulty(hashString, 4) {
        nonce++
        input := blockId + preHash + timeStamp + data + string(nonce)
        shaObj.Write([]byte(input))
        hashString = fmt.Sprintf("%x", shaObj.Sum(nil));
        fmt.Println(hashString)//这里打印每次用于匹配的哈希值只是为了将挖矿的过程形象展示,并没有额外含义,写不写都可以
    }
    //当生成有效哈希时,挖矿成功,迭代停止。
    //现实中挖矿时不用停止,继续挖下一个节点即可。
}

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
}

运行结果没有比较好的展示方式。这里我们只截取一部分。建议大家可以把代码考下来跑一跑。

如果你已经看过之前的篇章,相信这代码的原理你已经了然于胸了。下面我们只给出一些注意事项。

我们给出的5项数据只是一个简单举例,并没有完全列举生成区块哈希时参与的所有数据。

我们为了简便将blockId设为了string类型,并不代表区块id一定是字符串类型的。

这里的哈希难度是我们认为设定的,并不是真实哈希难度的生成方法。真是的哈希难度是由很复杂的数学模型实现的,是会根据当前全网算力自动调整的。

OK。到此挖矿的真相已经大白了。不知道大家有没有豁然开朗的感觉呢?。。。接下里我们就相约一起探索更多区块链的内容吧!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24083.html

相关文章

  • 区块概念 That You Must Know 四期(3)

    摘要:区块里的哈希是如何产生的如第四期篇里讲到的,每个区块里包含了,,,,,等信息。,就是将剩下的其他信息拼接成字符串,然后将这个字符串进行哈希的结果。当值取到某数,并使之形成的哈希值匹配上了当前的有效哈希难度,哈希碰撞就成功了。 第四期 简介go语言下挖矿难度的代码实现(3) 卡酷少Wechat:13260325501 经过之前所有的铺垫,这一期我们将对难度的代码实现作出简单演示。(以...

    k00baa 评论0 收藏0
  • 区块概念 That You Must Know 四期(2)

    摘要:下图给出一个简单的列表图什么是哈希和哈希值为理解挖矿的代码机制,首先解决几个概念。第一个就是哈希。哈希值为十六进制表示的数,且长度固定。也正是哈希值的这些特点,赋予了其加密信息时更高的安全性。 第四期 挖矿的相关算法(2) 卡酷少Wechat:13260325501 看过(1)篇,相信你一定对挖矿的机制有了一点了解。那么本篇,我们来一起看一下挖矿中涉及的算法。 在本篇文章中,如果在...

    Sourcelink 评论0 收藏0
  • 区块概念 That You Must Know 四期(1)

    摘要:挖矿是什么挖矿是将一段时间内比特币系统中发生的交易进行确认,并记录在区块链上形成新区块的过程。而成功抢到记账权的矿工,会获得系统新生的比特币奖励。矿机只执行单一的计算程序,实际是矿工之间比拼算力,拥有较多算力的矿工挖到比特币的概率更大。 第四期 有关挖矿和获取比特币(1) 卡酷少Wechat:13260325501 了解了这么多,大家是否想获取一些属于自己的比特币呢?之前我们在第一...

    evin2016 评论0 收藏0
  • 区块概念 That You Must Know 第一期.md

    摘要:而比特币,是由中本聪化名提出,一种点对点,去中心化的数字资产。比特币预计共有万枚,大约将在年发行完毕。比特币电子现金系统解决了在没有中心机构的情况下,总量恒定的数字资产的发行和流通问题。比特币通过比特币系统进行转账,全网记录公开透明。 第一期 比特币与中本聪 卡酷少Wechat:13260325501 说起区块链,就不得不提比特币。也正是因为比特币市场的火热,比特币系统的去中心化概...

    zorro 评论0 收藏0
  • 区块概念 That You Must Know 第二期

    摘要:第二期比特币的总量和发行卡酷少上期我们简单了解了比特币的诞生及其创始人。记账完成后,他将获得一定数量的比特币。每万个区块后,每个区块的比特币产量减半。从年至今,比特币产量已经减半次,当前每个区块发行个比特币。早期约有的比特币网站靠其导流。 第二期 比特币的总量和发行 卡酷少Wechat:13260325501 上期我们简单了解了比特币的诞生及其创始人。今天我们将对比特币做一些深入和...

    娣辩孩 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<