本代码的全部实现已在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
}
拼接区块数据,便于计算哈希值:文章来源:https://www.toymoban.com/news/detail-761898.html
// 生成准备数据,对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
}
实验结果
可以看到,总共生成了三个区块,每个区块的碰撞次数如下。最后输出整个区块链,可以看到,区块的哈希值之间呈现链表结构。
文章来源地址https://www.toymoban.com/news/detail-761898.html
到了这里,关于区块链实现之POW分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!