共识算法POW原理及实现

POW简介

Proof of Work,工作证明。
POW共识算法主要是通过计算难度值来决定谁来出块。POW的工作量是指方程式求解,谁先解出来,谁就有权利出块。方程式是通过前一个区块的哈希值和随机值nonce来计算下一个区块的哈希值,谁先找到nonce,谁就能最先计算出下一个区块的哈希值,这种方式之所以被称为计算难度值是因为方程式没有固定解法,只能不断的尝试,这种解方程式的方式称为哈希碰撞,是概率事件,碰撞的次数越多,方程式求解的难度就会越大。比特币就是采用POW共识算法

算法具体实现原理

这里涉及到两个重要的概念,一个是难度系数,一个是nonce,nonce可以理解为一个随机数,就是挖矿中要找到一个符合条件的nonce值。
这里假设难度系数是4(比特币初始难度系数就是4),将一个区块中的数据加上nonce值打包,nonce值从0开始一直递增,将这打包的数据计算hash值,hash满足最前面有4个0,就是挖矿成功。难度系数为多少,hash最前面就需要满足多少个0。

代码简单实现其原理

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
package main

import (	"strconv"	"time"	"crypto/sha256"	"strings"	"encoding/hex"	"fmt")

//pow 挖矿算法

//定义难度系数大专栏  共识算法POW原理及实现">const difiiculty = 4

type Block struct {	Index      int // 区块高度	TimeStamp  int64	Data       string //交易记录	Hash       string	Prehash    string	Nonce      int	Difficulty int //难度系数}

//创建区块链var BlockChain []Block

//创世区块func GenesisBlock() *Block {

	var geneBlock = Block{0, time.Now().Unix(), "", "", "", 0, difiiculty}	geneBlock.Hash = hex.EncodeToString(BlockHash(geneBlock))

	return &geneBlock

}

func BlockHash(block Block) []byte {	re := strconv.Itoa(block.Index) + strconv.Itoa(int(block.TimeStamp)) + block.Data + block.Prehash +		strconv.Itoa(block.Nonce) + strconv.Itoa(block.Difficulty)

	h := sha256.New()	h.Write([]byte(re))	hashed := h.Sum(nil)

	return hashed

}

func isBlockValid(block Block) bool  {	prefix := strings.Repeat("0", block.Difficulty)	return strings.HasPrefix(block.Hash, prefix)}

//创建新区块 pow挖矿func CreateNewBlock(lastBlock *Block, data string) *Block {	var newBlock Block	newBlock.Index = lastBlock.Index + 1	newBlock.TimeStamp = time.Now().Unix()	newBlock.Data = data	newBlock.Prehash = lastBlock.Hash	newBlock.Difficulty = difiiculty	newBlock.Nonce = 0	//开挖-当前区块的hash值的前面的0的个数与难度系数值相同	for {		//计算hash		cuhash := hex.EncodeToString(BlockHash(newBlock))		fmt.Println("挖矿中",cuhash)		newBlock.Hash = cuhash		if isBlockValid(newBlock) {

			//校验区块			if VerflyBlock(newBlock, *lastBlock) {				fmt.Println("挖矿成功")				return  &newBlock			}		}

		newBlock.Nonce ++

	}}

//校验新的区块是否合法func VerflyBlock(newblock Block, lastBlock Block) bool  {	if lastBlock.Index +1 !=newblock.Index {		return false	}	if newblock.Prehash !=lastBlock.Hash {		return false	}	return true

}

func main()  {

	var genBlock = GenesisBlock()

	newBlock := CreateNewBlock(genBlock,"新区块")	fmt.Println(newBlock)

}

输出

123456
挖矿中 ac6665903c0cd2f000e17483fbcf6e3e8fa365de2b55663e7c94167f816d1489挖矿中 a46e18c7938ccb2d0554232f94c6e8db933fae509adafd4091f5f0b51951e6ae挖矿中 3738b5eb5f8f956974fc767058a6d7c94da0fc406e86df2d508b9b87fc109171挖矿中 0000694b1acaec754175f0a49a1aa190e122b58e9f58125bd18ceec898f8d811挖矿成功&{1 1530267247 新区块 0000694b1acaec754175f0a49a1aa190e122b58e9f58125bd18ceec898f8d811 a8df431924b17633bdf0303763661aa7a41c2608cd99f6527542e1326c718152 12167 4}

原文地址:https://www.cnblogs.com/sanxiandoupi/p/11711068.html

时间: 2024-11-08 01:47:40

共识算法POW原理及实现的相关文章

区块链的共识算法 及 分叉 的通俗讲解 (一)

作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguanh/ GitHub : https://github.com/af913337456/ 腾讯云专栏: https://cloud.tencent.com/developer/user/1148436/activities 本文不做一般入门的区块链描述讲解.着重简述讲解: 区块链的分叉 共识算法 目录

1.4 [区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结.尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理.本篇文章主要参考<区块链技术指南>,首先表示感谢! ---Begin--- 区块链架构是一种分布式的架构.其部署模式有公共链.联盟链.私有链三种,对应的是去中心化分布式系统.部分去中心化分布式系统和弱中心分布式系统. 在分布式系统中,多个主机通过异步通信方式组成网络集群.在这样的一个异步系统中,需要主机之间进行状态

《Nodejs开发加密货币》之二十四:DPOS机制(分布式共识算法)

前言 共识机制是分布式应用软件特有的算法机制.在中心化的软件里,再复杂的问题都可以避开使用复杂的算法逻辑(当然,如果能用算法统领,代码会更加简洁.高效),在开发设计上可以省却一定的麻烦.但在分布式软件开发中,节点间的互操作,节点行为的统一管理,没有算法理论作为支撑,根本无法实现.所以,要想开发基于分布式网络的加密货币,共识机制无法回避. 在第一个部分,专门用一篇文章<共识机制,可编程的"利益"转移规则>来介绍共识机制的作用,也对比了当前加密货币领域常用的三种共识算法原理和优

bitcoin PoW原理及区块创建过程

bitcoin PoW原理及区块创建过程 PoW 为了在点对点的基础上实现一个分布式时间戳服务器,我们需要使用PoW(Proof of Work)系统来达成共识.PoW过程就是寻找一个目标值的过程,当对该目标值使用SHA-256之类Hash算法进行Hash运算时,要求得到的哈希值是以一定数目的0位开始的数.随着要求0位数目的增加,PoW过程的工作量是指数级增长的.通过对目标值进行一次哈希运算就可以验证目标是是否符合要求. 在PoW的实现中,我们在block中引入一个Nounce变量,我们通过No

区块链快速入门(四)——BFT(拜占庭容错)共识算法

区块链快速入门(四)--BFT(拜占庭容错)共识算法 一.BFT简介 1.拜占庭将军问题简介 拜占庭将军问题(Byzantine Generals Problem)是Leslie Lamport(2013年的图灵奖得主)用来为描述分布式系统一致性问题(Distributed Consensus)在论文中抽象出来一个著名的例子.拜占庭将军问题简易的非正式描述如下:拜占庭帝国想要进攻一个强大的敌人,为此派出了10支军队去包围这个敌人.这个敌人虽不比拜占庭帝国,但也足以抵御5支常规拜占庭军队的同时袭击

区块链主流共识算法

一.POW(Proof Of Work) Proof Of Work,也就是工作量证明.工作量证明系统(或者说协议.函数),是一种应对拒绝服务攻击和其他服务滥用的经济对策.它要求发起者进行一定量的运算,也就意味着需要消耗计算机一定的时间.这种系统要求得到证明的过程是低效且漫长的,可是校验则是高效且迅速,概括起来就是求解难,验证容易. 比特币是第一个区块链应用,同时也是最著名的应用之一,它所使用的共识机制就是POW.那么具体是怎么实现的呢? 在比特币中,使用了SHA256这种哈希函数作为求解手段.

区块链快速入门(三)——CFT(非拜占庭容错)共识算法

区块链快速入门(三)--CFT(非拜占庭容错)共识算法 一.CFT简介 CFT(Crash Fault Tolerance),即故障容错,是非拜占庭问题的容错技术.Paxos 问题是指分布式的系统中存在故障(crash fault),但不存在恶意(corrupt)节点的场景(即可能消息丢失或重复,但无错误消息)下的共识达成问题,是分布式共识领域最为常见的问题.最早由Leslie Lamport用 Paxon 岛的故事模型来进行描述而得以命名.解决Paxos问题的算法主要有Paxos系列算法和Ra

解密区块链最强心脏 迅雷链共识算法详解

11月10日在广州贝塔咖啡举办的迅雷链技术沙龙上,迅雷链底层工程师张骁就迅雷链共识算法的内在细节,向到场的开发者和区块链爱好者做了详细解读.DPoA+PBFT的算法保证了分布式系统中的强一致性和高效率共识,吸引了在场来宾的关注. 什么是共识算法? 张骁认为,区块链建立在分布式系统上,有若干个节点,每个节点都会维护自己的数据,这些数据需要保证一致性.如果不同的节点提供的数据不同,就不是一个能够正常对外工作的分布式系统.所以在区块链中,需要把这些数据通过复制和同步,来保持一致性,这个过程就叫做共识.

区块链共识算法实现

最近对区块链的共识算法比较感兴趣,也在尝试着使用JAVA实现它.进度不是很快,日积月累吧,目前在写POW,RAFT. POW还有一小块部分没有搞明白,还在搜索资料中. RAFT实现了第一个阶段:LEADER选举,使用了JAVA,MAVEN,DOCKER实现.虽然还有一些小瑕疵,慢慢来吧. 附上GitHub地址,希望各位大佬可以指点迷津(主要还是自学进度太慢了). 原文地址:https://www.cnblogs.com/cbkj-xd/p/11614027.html