区块链实现之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分析的主要内容,如果未能解决你的问题,请参考以下文章