什么是工作量证明

Proof Of Work,简称POW,即对工作量的证明。

为什么要做工作量证明

**挖矿(计算or工作)**的结果会作为数据加入区块链成为一个区块,完成这个**工作**的人也会获得奖励(即挖矿获得比特币)。
所以**挖矿**的过程是一种多劳多得的按劳分配模式,算力高,花费的时间多,获得的数字货币也就越多。
所以必须要证明矿工们为了得到答案确实进行了**计算**。

怎么样做工作量证明

哈希算法
SHA256:一种将任意长度的消息压缩到某一固定长度的消息摘要的函数

为什么选择哈希算法

①哈希算法不是加密算法,也就是没有密码,根据一个哈希值看不出或者说得不到原始数据,非常安全。
②一个唯一的原始数据,只能有唯一一个哈希,而且在已知原始数据和算法的前提下,可以较快计算出一个哈希值。

工作量证明代码

①pay attention to “//新加”

需要注意的是“ { ”不能单独放在一行,但是为了清晰,下面的代码都手动做了处理!

需要注意的是“ { ”不能单独放在一行,但是为了清晰,下面的代码都手动做了处理!

需要注意的是“ { ”不能单独放在一行,但是为了清晰,下面的代码都手动做了处理!

②main.go文件

package mainimport ("../core""fmt""strconv"
)func main()
{bc :=core.NewBlockchain()bc.AddBlock("Send 1 BTC to Ivan")bc.AddBlock("Send 2 createblockchain -address hanshuhuan more BTC to Ivan")for _,block :=range bc.Blocks{fmt.Printf( "Prev. hash: %x\n",block.PrevBlockHash)fmt.Printf( "Data: %s\n",block.Data)fmt.Printf( "Hash: %x\n",block.Hash)//新加:证明某个block的工作量pow :=core.NewProofOfWork(block)//新加:校验算法fmt.Printf("PoW:%s\n",strconv.FormatBool(pow.Validate()))fmt.Println()}
}

③block.go文件

package coreimport ("bytes""crypto/sha256""encoding/gob""log""time"
)
type Block struct
{Timestamp     int64Transactions  []*TransactionPrevBlockHash []byteHash          []byte//新加Nonce         int
}func NewBlock(transactions []*Transaction, prevBlockHash []byte) *Block
{block := &Block{Timestamp:     time.Now().Unix(),Transactions:  transactions,PrevBlockHash: prevBlockHash,Hash:          []byte{},//新加Nonce:         0}//新加:创建一个工作量证明pow := NewProofOfWork(block)//进行工作量证明nonce, hash := pow.Run()block.Hash = hash[:]//新加block.Nonce = noncereturn block
}
func (b *Block) SetHash()
{timestamp :=[]byte(strconv.FormatInt(b.Timestamp,10))headers :=bytes.Join([][]byte{b.PrevBlockHash,b.Data,timestamp},[]byte{})hash :=sha256.Sum256(headers)b.Hash=hash[:]
}
func NewGenesisBlock() *Block
{return NewBlock( "Genesis Block",[]byte{})
}

④proofofwork.go文件

package core;limport ("bytes""crypto/sha256""fmt""math""math/big"
)var
(maxNonce=math.MaxInt64
)
//决定了挖矿的难度
const targetBits = 20
//ProofOfWork represents a proof-of-work对这个区块计算要满足目标
type ProofOfWork struct
{block *Blocktarget *big.Int
}
//NewProofOfWork builds and returns a ProofOfWork
func NewProofOfWork(b *Block) *ProofOfWork
{//首先确定一个固定的整数1target :=big.NewInt(1)//做移位操作target.Lsh(target,uint(256-targetBits))pow :=&ProofOfWork{b,target}return pow
}
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
}
func IntToHex(num int64) []byte
{buff:=new(bytes.Buffer)err :=binary.Write(buff,binary.BigEndian,num)if err !=nil{log.Panic(err)}return buff.Bytes()
}func (pow *ProofOfWork) Run()(int,[]byte)
{var hashInt big.Intvar hash    [32]bytenonce :=0//开始计算fmt.Printf("Mining the blockcontaining \"%s\"\n",pow.block.Data)//一个一个对比for nonce < maxNonce{//由四项不可变数据+一个可变数字nonce组成data :=pow.prepareData(nonce)//哈希算法hash =sha256.Sum256(data)fmt.Printf("\r%x",hash)//把哈希值转成哈希整数hashInt.SetBytes(hash[:])//对比if hashInt.Cmp(pow.target) == -1{break} else {nonce++}}fmt.Printf("\n\n")return nonce,hash[:]
}
// Validate 校验算法
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) == -1return isValid
}

⑤blockchain.go文件

没有改动

⑥util.go文件

package coreimport
("bytes""encoding/binary""log"
)// IntToHex Convert an int64 to a byte array
func IntToHex(num int64) []byte{buff := new(bytes.Buffer)err := binary.Write(buff, binary.BigEndian, num)if err != nil {log.Panic(err)}return buff.Bytes()
}

运行结果展示

运行结果解释

从main文件开始,创建了一个区块链,返回了一个创世纪块,然后又新加了两个区块(这三个区块都经历了newblock()这个方法,所以都会进行工作量证明),然后遍历这个区块链(数组),输出每一个区块的“前一个哈希值、本身的数据、后一个区块的哈希值”,然后去证明每个区块的工作量(详情请见注释),并输出最后证明的结果。

总结

通过一个“看似没有用的算法”,得到一个“看似没有用,但是又很麻烦的数”,因为这个计算的过程非常耗费时间(其实费电),所以这个工作量就有了价值。
首先得到这个结果的人把答案发布到网上,其他人都可以去证明(校验算法),都承认这个结果正确之后,那个首先拿到答案的人就有了比特币。
随着时间的推移,比特币全网算力不断增加,算法运行需要消耗的CPU越来越多,导致设备所需算力提高,比特币挖矿变得越发困难,所以比特币越来越难拿到,但是它本身数量有限,所以比特币越来越值钱。

区块链技术——工作量证明相关推荐

  1. 区块链基础--工作量证明

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链基础(6)–工作量证明1 我认为技术和共识构建了区块链,那么就由几个问题需要去解决,第一:如果由多个打包节点,那会 ...

  2. 动手学区块链学习笔记(二):区块链以及工作量证明算法

    引言 紧接上文,在介绍完区块链中的加密解密以及公钥私钥等算法后,本篇开始正式进入区块链概念与一个简单区块链系统的实现过程介绍. 区块链技术介绍 什么是区块链? 区块链,就是一个又一个区块组成的链条.每 ...

  3. 区块链的工作量证明(Proof of Work)初步解释

    Proof Of Work,顾名思义,直译过来就是工作的证明,也就是证明你,某人做了一定量工作.这就是这种机制的命名来源.如果希望证明某人做了什么工作的话,那显然,最有力的就是目睹,观测他整个工作的过 ...

  4. 共识机制:区块链技术的根基

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. Chapter-1:什么是共识机制? 技术定义是:共识机制是一个群体决策的流程,群体中的个体会执行和支持对群体其他个人最 ...

  5. 区块链技术用解决拜占庭将军问题_区块链是如何解决拜占庭将军问题的?

    原标题:区块链是如何解决拜占庭将军问题的? 区块链火爆后不少人认为它是继蒸汽机.电力.互联网之后第四代具有颠覆性的技术.但凡了解它,或者对比特币有一定见解的人,都多多少少听过拜占庭将军问题.现阶段区块 ...

  6. 报名 | 相约杭州,我们来聊聊区块链技术与行业应用落地

     (营营友情提示:文末有福利噢~) 目前,区块链研究领域正迈入"千帆竞渡,百花齐放"的新阶段.从企业层面来看,跨国行业巨头与新兴创业公司争相进军区块链领域,并带动新一轮创业.创 ...

  7. 区块链技术下数字货币发展现状与挑战分析

    区块链技术区块链技术被部分学者认为是继互联网之后,下一代对世界有颠覆性影响的核心技术.而这种技术作为数字货币技术的基础,有助于推动数字金融以及数字金融的发展.在对已有文献进行综述的基础上,主要研究区块 ...

  8. 智利将区块链技术实施到国家能源网中 解决能源数据安全问题

    智利国家能源委员会(CNE)是该国能源监管机构,他们已经宣布将在国家能源网中部署区块链技术,对相关行业数据进行验证,包括边际成本.平均市场价格.燃料价格等. 智利国家能源委员会透露,他们希望所有能源行 ...

  9. 一文读懂区块链技术如何改变非洲贸易(上)

    缺乏硬通货.欺诈频发和高昂的交易成本阻碍了非洲国际贸易的发展.但现在,区块链技术正在帮助非洲的企业克服这些障碍. 链集市 · 让区块链落地更简单 <区块链行业观察>专栏·第 34 篇 作者 ...

最新文章

  1. CUBRID学习笔记 1 简介 cubrid教程
  2. Redis缓存穿透、缓存击穿和缓存雪崩
  3. 适合程序员的画图工具
  4. eclipse中的JSP项目连接mysql报错,找不到jdbc驱动,java项目却没问题
  5. 计算机组成原理 第六章 总线
  6. 问题解决: 此文件来自其他计算机,可能被阻止以帮助保护该计算机/WORD在试图打开文件时遇到错误……
  7. 腾讯微信被怼,iOS版微信不能打赏了
  8. Matlab 谢尔宾斯基三角形
  9. android4.4呼叫转移,安卓呼叫转移
  10. 2021 ICPC Gran Premio de Mexico 2da Fecha - F.Flipped Factorization(PN筛)
  11. 基于STM32的无损压缩算法miniLZO移植,压缩率很高,20KB随机数压缩到638字节,耗时275us
  12. 使用opencv中的方法进行图像保存时,出现保存的图像全黑的问题
  13. 【基础】信息时代与计算机
  14. modbus调试团结_教学团结? 为教育者免费提供丰富的课程资源
  15. 云计算 第七章 云安全(3)概述 云计算面临的安全问题 云安全问题的深层原因 云安全关键技术 云计算信息安全的国内外标准化
  16. C语言-编写程序,找出2~100以内的所有质数(素数)。
  17. 将两个或多个div放在同一行
  18. 使用广播接收者获取短信及拦截电话
  19. 魅蓝note6救砖_魅蓝Note6线刷刷机教程 魅蓝Note6线刷包救砖刷机包下载
  20. 关于计算机房弱电工程的书籍,弱电工程计算机机房设计规范..doc

热门文章

  1. oracle的nvl函数返回的类型,oracle的nvl函数的用法-查询结果若是NULL则用指定值代(转) sober...
  2. ZSV10-20M、DHF10-220H插装式电磁常闭型阀ZSV10-21、DHF10-221
  3. 计算机网络之HTTP状态码
  4. java第八讲:多态
  5. EVM底层探索:字节码级分析最小化代理标准EIP1167
  6. 银行木马BANLOAD加入FIFA世界杯足球赛
  7. 通过图片获取gps地理位置
  8. python翻译器教程_自动翻译器1
  9. 专家分享|物联网正如何改变物理安全的面貌
  10. 一个有趣的关于setBackgroundColor问题