区块链,工作证明(POW)代码+原理 golang版剖析 推荐 原创 64180190 2018-03-21 18:39:29 博主文章分类:区块链专研 ©著作权 文章标签 区块链 工作证明 文章分类 区块链 ©著作权归作者所有:来自51CTO博客作者64180190的原创作品,请联系作者获取转载授权,否则将追究法律责任 介绍在之前的文章中,我们构建了一个非常简单的数据结构,这是块链数据库的本质。 而且我们可以用它们之间的链式关系向它添加区块:每个区块与前一个链接。 唉,然而在现实中添加一个区块添加到链是艰巨的工作。工作证明块链的一个关键思想是,必须通过工作证明才能将数据放入其中。这是一个艰巨的工作,使块链安全和一致。此外,这笔辛苦的工作也得到了奖励(这是人们获得采矿硬币的方式)。这种机制与现实生活中的机制非常相似:人们必须工作获酬劳励并维持生命。在网络中,网络的一些参与者(矿工)努力维持网络,为其添加新的块,并为他们的工作获得奖励。作为其工作的结果,块以安全的方式并入到块链中,这保持了整个块链数据库的稳定性。值得注意的是,完成工作的人必须证明这一点。这个整体“努力工作和证明工作价值”机制被称为工作证明。这很难因为它需要很多的计算能力:即使是高性能的计算机也不能很快的完成。此外,这项工作的难度不时增加,以保持新的块率每小时大约6个块。在比特币,这样的工作的目标是找到一个块的哈希,满足一些要求。这是散列,作为证明。因此,找到证据是实际工作。最后要注意的事情。工作证明算法必须满足要求:做完工作不易完成,证明工作容易完成。证明通常交给非工作者,所以对他们来说,验证它不应该花太多的时间。哈希算法加密在本文中,我们将讨论哈希值。 如果你熟悉这个概念,你可以跳过这个部分。哈希是获取指定数据的哈希值的过程。 哈希值是对其计算的数据的唯一表示。 哈希函数是一个获取任意大小的数据并产生固定大小的哈希的函数。 以下是哈希的一些主要功能:原始数据无法从哈希值恢复。 因此,散列不是加密。数据只能有一个哈希值,散列是唯一的。更改输入数据中的一个字节将导致完全不同的散列。哈希函数被广泛用于检查数据的一致性。在区块链中,使用哈希来保证块的一致性。 哈希算法的输入数据包含前一个块的哈希值,从而使得已经生成的链难以修改之前产生的区块(或至少相当困难):必须重新计算其后的所有块的哈希值。哈希现金 、 Hashcash比特币使用Hashcash,哈希现金的发明最初是为防止电子邮件垃圾邮件而开发的。它可以分为以下几个步骤:获取公开的数据(在电子邮件的情况下,它是接收者的电子邮件地址;在比特币的情况下,它是块标题)。添加一个计数器。计数器从0开始。获取数据+计数器组合的散列。检查哈希值是否符合要求。如果满足要求,结束过程。如果不满足要求,增加计数器并重复步骤3和4。因此,这是一个强力算法:您更改计数器,计算一个新的哈希,检查它,增加计数器,计算哈希等。这就是为什么它在计算上是昂贵的。现在让我们看看一个哈希必须满足的要求。在原来的Hashcash实现中“哈希的前20位必须是零”。然而在比特币中,哈希要求是不时进行调整的,因为尽管计算能力随着时间的推移而增加,越来越多的矿工加入网络,因此设计必须每10分钟生成一个块。为了演示这个算法,我从前面的例子中获取了数据(“我喜欢甜甜圈”),并发现一个以0个零字节开头的哈希:编写代码程序员小提醒:go和python都是不用加分号的语言好的,我们完成了理论,让我们编写代码! 首先,我们来定义挖掘的难度:const targetBits = 24In Bitcoin, “target bits” is the block header storing the difficulty at which the block was mined. We won’t implement a target adjusting algorithm, for now, so we can just define the difficulty as a global constant.24 is an arbitrary number, our goal is to have a target that takes less than 256 bits in memory. And we want the difference to be significant enough, but not too big, because the bigger the difference the more difficult it’s to find a proper hash.在比特币中,“目标位(target bit)”是存储块被挖掘的困难的块头。 我们现在不会实现目标调整算法,所以我们可以将难度定义为全局常数。24是一个任意数字,我们的目标是在内存中占用少于256位的目标。 而且我们希望差异足够大,但不要太大,因为差异越大,找到合适的哈希越难。type ProofOfWork struct { block *Block target *big.Int //定义目标位 } func NewProofOfWork(b *Block) *ProofOfWork { target := big.NewInt(1) target.Lsh(target, uint(256-targetBits)) //左移256个 target bits位 pow := &ProofOfWork{b, target} return pow }这里创建保存指向块的指针的工作证明结构和指向目标的指针。 “目标”是上一段所述要求的另一个名称。 我们使用一个大整数,因为我们将哈希与目标进行比较:我们将哈希转换为一个大整数,并检查它是否小于目标。big: https://golang.org/pkg/math/big/在新的工作证明的函数中,我们初始化一个值为1的big.Int,并将其左移256个 - targetBits位。 256是SHA-256哈希的长度,以比特为单位,它是我们要使用的SHA-256散列算法。 目标的十六进制表示为:0x10000000000000000000000000000000000000000000000000000000000它在内存中占用29个字节。 这是与以前的例子中的哈希的比较:0fac49161af82ed938add1d8725835cc123a1a87b1b196488360e58d4bfb51e3 0000010000000000000000000000000000000000000000000000000000000000 0000008b0f41ec78bab747864db66bcb9fb89920ee75f43fdaaeb5544f7f76ca第一个哈希(以“我喜欢甜甜圈”计算)大于目标,因此它不是有效的工作证明。 第二个哈希(以“我喜欢甜甜圈ca07ca”计算)小于目标,因此这是一个有效的证明。您可以将目标视为范围的上限:如果数字(哈希)低于边界,则它是有效的,反之亦然。 降低边界将导致有效数量减少,因此找到有效数量所需的工作更加困难。现在,对数据进行哈希处理。func (pow *ProofOfWork) prepareData(nonce int) []byte { data := bytes.Join( [][]byte{ pow.block.PrevBlockHash, pow.block.Data, IntToHex(pow.block.Timestamp), IntToHex(int64(targetBits)), IntToHex(int64(nonce)), }, []byte{}, ) return data }我们只是将块区域与目标和随机数合并。 nonce这里是从上面的Hashcash描述的计数器,这是加密术语。好的,所有的准备工作都完成了,我们来实现PoW算法的核心:func (pow *ProofOfWork) Run() (int, []byte) { var hashInt big.Int var hash [32]byte nonce := 0 fmt.Printf("Mining the block containing \"%s\"\n", pow.block.Data) for nonce < maxNonce { data := pow.prepareData(nonce) // 准备数据 hash = sha256.Sum256(data) // SHA-256加密 fmt.Printf("\r%x", hash) hashInt.SetBytes(hash[:]) // 讲hash转换成Big Integer if hashInt.Cmp(pow.target) == -1 { break } else { nonce++ } } fmt.Print("\n\n") return nonce, hash[:] }首先,我们初始化变量:hashInt是哈希的整数表示; nonce是柜台。 接下来,我们运行一个“无限”循环:它受限于maxNonce,它等于math.MaxInt64; 这样做是为了避免可能的随机数溢出。 虽然我们的PoW实施的难度太低,以至于防止溢出,但最好是进行此检查,以防万一。在循环中我们:准备数据用SHA-256进行哈希。将散列转换为大整数。将整数与目标进行比较。现在我们可以删除Block的SetHash方法并修改NewBlock函数:func NewBlock(data string, prevBlockHash []byte) *Block { block := &Block{time.Now().Unix(), []byte(data), prevBlockHash, []byte{}, 0} pow := NewProofOfWork(block) nonce, hash := pow.Run() block.Hash = hash[:] block.Nonce = nonce return block }Here you can see that nonce is saved as a Block property. This is necessary because nonce is required to verify a proof. The Blockstructure now looks so:type Block struct { Timestamp int64 Data []byte PrevBlockHash []byte Hash []byte Nonce int }验证工作证明func (pow *ProofOfWork) Validate() bool { var hashInt big.Int data := pow.prepareData(pow.block.Nonce) hash := sha256.Sum256(data) hashInt.SetBytes(hash[:]) isValid := hashInt.Cmp(pow.target) == -1 return isValid }主函数代代码再次检查func main() { ... for _, block := range bc.blocks { ... pow := NewProofOfWork(block) fmt.Printf("PoW: %s\n", strconv.FormatBool(pow.Validate())) fmt.Println() } }结论我们的块链是一个更接近其实际架构的一步:添加块现在需要努力工作,因此挖掘是可能的。 但是它仍然缺乏一些关键的特征:块链数据库不是持久的,没有钱包,地址,交易,没有共识机制。 所有这些我们将在以后的文章中实现的,现在,开采开采! 赞 收藏 评论 分享 举报 上一篇:区块链,以太坊 Ethereum JSON-Api 的调用说明 官网翻译版 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 () 最热 最新 相关文章 探秘空投女巫:区块链世界的神秘现象 在区块链世界中,充满了各种新奇的名词和概念,其中一个引人注目的现象就是“空投女巫”。这个神秘的名字让人不禁好奇,究竟是什么?什么是空投女巫?空投女巫是指那些在区块链项目中频繁参与空投活动,并且通过不断的转移和出售代币来利润的人。简而言之,她们是利用空投活动来赚取利润的熟练操作者。她们通常有着敏锐的市场洞察力和高超的操作技巧,在空投活动中能够获得最大的利益。空投活动是什么?空投活动是区块链项目常 区块链 计算技术 深入剖析 Git 对象底层原理 我们知道,Git 是一个内容寻址文件系统,其核心部分是一个键值对数据库。当我们向 Git 仓库中插入任意类型的内容时,它会返回一个唯一的键。我们可以通过该键在任意时刻再次取回插入的内容。 git 数据库 文件名 Istio架构及工作原理 从 Istio 的设计和实现原理可以看出,它是采用模块化设计,并且各个模块之间高度解耦,Proxy 专注于负责服务之间的通信,Pilot 专注于流量控制,Mixer 专注于策略控制以及监控日志功能,而 Citadel 专注于安全。 微服务 Istio 软考浙江省工作证明 工作证明软件 根据海南省人力资源开发局《关于做好2022年度计算机技术与软件专业技术资格(水平)考试工作的通知》(琼人发〔2022〕7号)可以得知,2022年下半年海南软件设计师报名时考生须以本人真实身份信息进行注册,并上传提交本人在海南工作或在海南居住的相关证明,可以从以下材料选择其一:身份证、社保卡(含电子社保卡)、居住证、学生证、户口本、工作证明。很多考生也许只能选工作证明,凡提交工作证明的,将核验 软考 软件设计师 计算机技术 上传 pmp报名工作证明 在项目管理领域,PMP(项目管理专业人士)认证被视为一项权威的资质认证,它代表着持证者在项目管理方面具备了专业的知识和技能。然而,获得PMP认证并不是一劳永逸的事情,为了保持认证的有效性,持证者需要在每三年的时间内获得60个PDU(专业发展单元)。这一要求确保了项目管理专业人士能够不断更新自己的知识,与项目管理领域的最新发展保持同步。对于想要获得PMP认证的人来说,考试是他们必须面对的一道关卡 项目管理 认证机构 职业生涯 跨省软考工作证明 **跨省软考工作证明的重要性与申请流程**在信息技术日益渗透到我们日常生活的今天,软件行业已成为了推动社会进步与发展的关键力量。为了适应这一行业的快速发展,并对从事软件工作的专业人员进行标准化评价,我国实施了软件水平考试(简称软考)。软考不仅是对个人专业技能的考核,更是对软件从业人员综合素质的评估。对于许多希望在软件行业深耕或寻求更广阔发展空间的专业人士来说,跨省参加软考并获得相应的工作证明, 职业发展 信息技术 软件水平考试 软考还要工作证明 关于软考与工作证明的深入解析在当今信息化、数字化的时代,软件行业成为了推动社会进步与发展的重要引擎。伴随着行业的蓬勃发展,对于专业技术人才的需求也日益旺盛。在这样的背景下,软考(计算机软件资格考试)应运而生,成为了衡量软件行业从业者技术水平与专业能力的重要标准。然而,近年来,关于软考报名是否需要提供工作证明的问题,引起了广泛的关注和讨论。首先,我们要明确的是,软考作为国家级别的专业技术资格 项目经验 职业发展 计算机软件 pmp报名资格 工作证明 在当今快速发展的项目管理领域,PMP(项目管理专业人士)认证已成为衡量项目管理人员专业能力和水平的重要标准。PMP认证不仅代表了持证者在项目管理知识领域的专业素养,更是其职业发展道路上的有力支持。然而,获得PMP认证并非一劳永逸,为了保持认证的有效性,持证者需要在每三年内获得60个PDU(专业发展单元)。这一要求确保了项目管理人员能够持续更新自己的知识体系,与行业发展保持同步。PMP考试作为获 项目管理 知识体系 职业发展 pmp报名需要工作证明 在项目管理领域,PMP(项目管理专业人士)认证被视为一项极具权威性的国际资格认证。持有PMP认证的项目管理人员不仅在全球范围内备受认可,同时也能够在职业生涯中获得更多的机会与优势。然而,获得PMP认证并非一劳永逸,为了保持认证的有效性,持证者需要在每三年的周期内获得60个PDU(专业发展单元)。本文将围绕PMP考试的相关要点,特别是报名过程中需要提供的工作证明进行详细解析。首先,我们来了解一下 项目管理 职业生涯 PMI 报名软考工作证明 关于报名软考所需工作证明的重要性及相关解析在信息技术日新月异的今天,软件行业作为国家经济发展的重要支柱,对于专业人才的需求日益旺盛。为了更好地评价和选拔软件行业的专业技术人才,我国设立了软件水平考试(简称软考)。软考不仅是衡量从业人员专业水平的重要标准,更是软件企业选拔人才、提升团队整体实力的重要途径。在报名软考时,除了基本的身份证明和学历证明外,工作证明也是不可或缺的一项重要材料。**工 职业发展 信息技术 时间段 江苏软考工作证明 在信息技术日新月异的今天,软件行业已成为推动社会进步和发展的重要力量。伴随着行业的蓬勃发展,对于专业人才的评价与认证也显得愈发重要。在中国,计算机软件专业技术资格(水平)考试,即人们常说的“软考”,便是评价和选拔IT人才的重要途径之一。对于江苏地区的软考考生而言,工作证明在考试报名和职业发展中扮演着不可或缺的角色。首先,我们要明确什么是软考工作证明。简单来说,工作证明是考生所在单位出具的一份书 职业发展 信息技术 计算机软件 浙江软考工作证明 **浙江软考工作证明与职业发展**在信息技术日新月异的今天,软件行业作为其中的佼佼者,一直引领着技术革新的潮流。在这个行业中,软件专业技术人员的角色尤为重要。为了评价和认定这些技术人员的专业水平,我国设立了计算机软件资格考试,即人们常说的“软考”。在浙江,软考不仅是一项考试,更是衡量软件从业人员能力的重要标准。对于许多在浙江从事软件工作的人来说,软考不仅仅是一张证书那么简单。它代表着一个人 职业发展 信息技术 计算机软件 软考工作证明模板 【软考工作证明模板】在软件行业中的应用与重要性随着信息技术的飞速发展,软件行业已经成为全球经济的重要支柱之一。在这个领域中,软件考试(简称软考)是衡量从业人员专业能力和素质的重要标准。为了确保软考的公平、公正和有效性,相关机构要求考生提供工作证明。本文将从软考工作证明模板的定义、作用、应用及重要性等方面进行阐述。一、软考工作证明模板的定义软考工作证明模板是指用于证明考生在软件行业从业经 信息技术 山东软考工作证明 **山东软考工作证明的重要性及其应用**在信息技术日新月异的今天,软件行业已成为了国家经济发展的重要支柱。为了保证软件从业者的专业能力和素质,我国设立了软件水平考试(简称软考)。软考不仅是对个人技能的认证,更是企事业单位选拔人才的重要依据。而在软考报名和职场发展中,工作证明则扮演着一个不可或缺的角色,尤其对于山东地区的软件从业者来说,一份正规的山东软考工作证明,往往能够为其职业发展带来诸多便利 职业发展 信息技术 软件水平考试 软考需要工作证明吗 关于“软考需要工作证明吗”这一问题的探讨,我们首先要了解软考的基本背景和考试要求。软考,即计算机软件资格考试,是我国针对计算机技术与软件专业技术资格(水平)所设立的一项国家级考试。它不仅是对个人计算机技术能力的认证,更是企事业单位选拔和评定人才的重要标准之一。由于其权威性和专业性,软考在IT行业中具有很高的认可度。那么,回到问题本身,软考报名时是否需要提供工作证明呢?答案是:视情况而定。 计算机软件 IT 个人计算机 软考报名需要工作证明 关于软考报名所需工作证明的深度解析在当今社会,随着信息技术的迅猛发展,软件行业对于专业人才的需求日益旺盛。为了更好地评估和提升个人的专业技能水平,越来越多的人选择参加软件水平考试(简称软考)。软考作为国内最具权威性的软件专业技术资格(水平)考试,其报名条件和要求也备受考生关注。其中,工作证明作为软考报名的一项重要材料,更是引发了广泛讨论。本文将围绕“软考报名需要工作证明”这一关键词,对软考报名 信息技术 软件水平考试 软考初级审核工作证明 软考初级审核工作证明的重要性及其相关流程解析在信息技术迅猛发展的今天,软件行业作为国家经济发展的重要支柱,对于专业人才的评价与认定显得尤为关键。软考,作为国内最具权威性的软件专业技术资格考试,其证书在行业内具有很高的认可度。而软考初级审核工作证明,作为考试报名过程中的一项重要环节,对于保障考试的公平、公正、安全具有不可替代的作用。首先,我们来了解一下软考初级审核工作证明的基本含义。在软考报 信息技术 提交审核 上传 软考需要工作证明嘛 关于软考是否需要工作证明的问题,一直是许多准备参加软考的考生所关心的焦点。软考,即计算机技术与软件专业技术资格(水平)考试,是由国家人力资源和社会保障部、工业和信息化部联合主办的一项国家级考试,其目的在于对全国范围内从事计算机应用、软件、网络、信息系统和信息服务等专业技术工作的人员进行职业资格、专业技术资格认定和专业技术水平测试。那么,针对这个问题,我们首先要明确一点:软考的报名条件中并没有明 理论基础 计算机应用 计算机技术 考pmp需要工作证明吗 【考PMP需要工作证明吗】一文详解PMP考试相关要求PMP(项目管理专业人士)认证在全球范围内被广泛认可,是项目管理领域最具权威性的证书之一。对于有志于提升项目管理能力的专业人士来说,获得PMP认证无疑是一个重要的里程碑。然而,在申请PMP考试及保持认证有效性的过程中,许多考生对于所需材料和工作证明的要求存在诸多疑问。本文将详细解答“考PMP需要工作证明吗”这一问题,并全面介绍PMP考试的相关 项目管理 PMI 知识体系 软考高级要工作证明吗 关于软考高级是否需要工作证明的问题,一直以来都是众多考生关注的焦点。本文将对这一问题进行深入探讨,帮助考生更好地了解软考高级的相关政策和要求。一、软考高级概述软考,全称为计算机技术与软件专业技术资格(水平)考试,是由国家人力资源和社会保障部组织的一项国家级考试。软考分为初、中、高三个级别,其中高级别考试对应的是高级工程师职务,具有很高的专业性和权威性。通过软考高级考试,可以证明考生在计算机 计算机技术 职业发展