区块链实现之POW分析

Posted 一只特立独行的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链实现之POW分析相关的知识,希望对你有一定的参考价值。

本代码的全部实现已在github上面同步开源,项目地址:
link

PoW算法介绍

工作量证明(Proof Of Work,简称POW),简单理解就是一份证明,用来确认你做过一定量的工作。监测工作的整个过程通常是极为低效的,而通过对工作的结果进行认证来证明完成了相应的工作量,则是一种非常高效的方式。比如现实生活中的毕业证、驾驶证等等,也是通过检验结果的方式(通过相关的考试)所取得的证明。

工作量证明系统(或者说协议、函数),是一种应对拒绝服务攻击和其他服务滥用的经济对策。它要求发起者进行一定量的运算,也就意味着需要消耗计算机一定的时间。

PoW算法思路

通过不断对结点的数据进行哈希计算,通过比较目标哈希与当前哈希值的对比,实现共识算法。

代码与实现思路

伪码思路:
1.建立ProofOfWork类,带有两个属性目标哈希,目标区块
2.通过ProofOfWork类进行计算目标区块的哈希,并与目标哈希进行比较。
3.若判定目标区块的哈希值小于目标哈希值,则完成工作量证明,进行广播,并上链。
ProofOfWork的结构:

// 工作量证明的结构
type ProofOfWork struct 
	//需要共识验证的区块
	Block *Block
	//目标难度的哈希,大数存储
	target *big.Int

进行哈希值的比较:

func (pow *ProofOfWork) run() ([]byte, int64) 
	//碰撞次数
	var nonce = int64(0)
	//用于比较的大数hash
	var hashInt big.Int
	//目标hash值
	var hash [32]byte
	//无限循环,生成符合条件的哈希
	for 
		//生成准备数据
		dataByte := pow.prepareData(int64(nonce))
		hash = sha256.Sum256(dataByte)
		//将byte数据转换为大数
		hashInt.SetBytes(hash[:])
		if pow.target.Cmp(&hashInt) == 1 
			//找到了符合条件的hash
			break
		
		nonce++
	
	fmt.Printf("打印碰撞次数%v\\n", nonce)
	return hash[:], nonce

拼接区块数据,便于计算哈希值:

// 生成准备数据,对ProofOfWork数据拼接形成哈希值并返回
func (pow *ProofOfWork) prepareData(nonce int64) []byte 
	var data []byte
	timeStampBytes := IntToHex(pow.Block.TimeStamp)
	heightBytes := IntToHex(pow.Block.Height)
	//将多个[]byte数组转换为一个[]byte数组
	data = bytes.Join([][]byte
		timeStampBytes,
		heightBytes,
		pow.Block.PrevBlockHash,
		pow.Block.Data,
		IntToHex(nonce),
		IntToHex(targetBit),
	, []byte)
	return data


实验结果

可以看到,总共生成了三个区块,每个区块的碰撞次数如下。最后输出整个区块链,可以看到,区块的哈希值之间呈现链表结构。

以上是关于区块链实现之POW分析的主要内容,如果未能解决你的问题,请参考以下文章

区块链主流共识算法

区块链主流共识算法

详解在区块链中的POW和哈希算法

Golang区块链开发002-初始化区块链与POW挖矿实现

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

区块链之工作量证明