摘要:区块里的哈希是如何产生的如第四期篇里讲到的,每个区块里包含了,,,,,等信息。,就是将剩下的其他信息拼接成字符串,然后将这个字符串进行哈希的结果。当值取到某数,并使之形成的哈希值匹配上了当前的有效哈希难度,哈希碰撞就成功了。
第四期 简介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 }
下一篇给出完整代码
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/24084.html
摘要:我们给出的项数据只是一个简单举例,并没有完全列举生成区块哈希时参与的所有数据。这里的哈希难度是我们认为设定的,并不是真实哈希难度的生成方法。真是的哈希难度是由很复杂的数学模型实现的,是会根据当前全网算力自动调整的。。 第四期 简介go语言下挖矿难度的代码实现(4) 卡酷少Wechat:13260325501 之前的都讲完了,因为代码太多导致文章比较长。所以新增了一片。在这最后的最后...
摘要:下图给出一个简单的列表图什么是哈希和哈希值为理解挖矿的代码机制,首先解决几个概念。第一个就是哈希。哈希值为十六进制表示的数,且长度固定。也正是哈希值的这些特点,赋予了其加密信息时更高的安全性。 第四期 挖矿的相关算法(2) 卡酷少Wechat:13260325501 看过(1)篇,相信你一定对挖矿的机制有了一点了解。那么本篇,我们来一起看一下挖矿中涉及的算法。 在本篇文章中,如果在...
摘要:挖矿是什么挖矿是将一段时间内比特币系统中发生的交易进行确认,并记录在区块链上形成新区块的过程。而成功抢到记账权的矿工,会获得系统新生的比特币奖励。矿机只执行单一的计算程序,实际是矿工之间比拼算力,拥有较多算力的矿工挖到比特币的概率更大。 第四期 有关挖矿和获取比特币(1) 卡酷少Wechat:13260325501 了解了这么多,大家是否想获取一些属于自己的比特币呢?之前我们在第一...
摘要:第二期比特币的总量和发行卡酷少上期我们简单了解了比特币的诞生及其创始人。记账完成后,他将获得一定数量的比特币。每万个区块后,每个区块的比特币产量减半。从年至今,比特币产量已经减半次,当前每个区块发行个比特币。早期约有的比特币网站靠其导流。 第二期 比特币的总量和发行 卡酷少Wechat:13260325501 上期我们简单了解了比特币的诞生及其创始人。今天我们将对比特币做一些深入和...
摘要:而比特币,是由中本聪化名提出,一种点对点,去中心化的数字资产。比特币预计共有万枚,大约将在年发行完毕。比特币电子现金系统解决了在没有中心机构的情况下,总量恒定的数字资产的发行和流通问题。比特币通过比特币系统进行转账,全网记录公开透明。 第一期 比特币与中本聪 卡酷少Wechat:13260325501 说起区块链,就不得不提比特币。也正是因为比特币市场的火热,比特币系统的去中心化概...
阅读 1131·2023-04-26 02:42
阅读 1600·2021-11-12 10:36
阅读 1700·2021-10-25 09:47
阅读 1231·2021-08-18 10:22
阅读 1775·2019-08-30 15:52
阅读 1174·2019-08-30 10:54
阅读 2598·2019-08-29 18:46
阅读 3465·2019-08-26 18:27