如何理解Pow共识算法?

发布时间:2022-07-2 编辑:RainNight 阅读:223

如何理解Pow共识算法?

POW简介


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

算法具体实现原理


这里涉及到两个重要的概念,一个是难度系数,一个是nonce,nonce可以理解为一个随机数,就是挖矿中要找到一个符合条件的nonce值。

代码实现

package main

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

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)
}

file

PoW 挖矿算法分类与简介


PoW 挖矿算法大致分为两个大类,第一类叫做计算困难,第二类叫内存困难。

这两类的区别在于对于提供工作量证明的组件要求不同。我们知道计算机的组成分为计算单元和存储单元,通过以往的编程经验我们还可以知道,一个计算机的瓶颈往往是 IO,如果要制造大量的 IO 操作,可以通过写程序撑大内存,制造大量的数据处理过程,使工作量证明从计算单元转变为存储单元。 那为什么要这么做呢?

其实在 PoW 挖矿中心化以后,又出现了一次挖矿工具改进,这次超越了 GPU,人们先是尝试在 FPGA 上尝试 SHA256 的计算过程,结果计算效率成倍于 GPU。

FPGA 出现的时间比较短暂,最终人们开发出了 ASIC 专业芯片来计算 SHA256,这就是我们常说的专业矿机。

专业矿机的出现加速了 PoW 挖矿的中心化过程,因为购买专业矿机需要额外的时间和精力,配置运行还有一定的门槛,普通人也只能从专业机构手里购买专业矿机。

所以这些专业矿机直接就是数字货币印钞机,生产专业挖矿芯片的商业公司几乎成了数字货币的货币发行司,这不得不说到市值直逼英伟达的比特大陆公司,它用的就是专业生产数字货币挖矿芯片。

PoW 的优势和劣势


PoW 共识的内在优势在于可以稳定币价,因为在 PoW 币种下,矿工的纯收益来自 Coinbase 奖励减去设备和运营成本,成本会驱使矿工至少将币价维持在一个稳定水平,所以攻击者很难在短时间内获得大量算力来攻击主链。

PoW 共识的外在优势是目前它看起来依然是工业成熟度最高的区块共识算法,所以在用户信任度上、矿工基础上都有很好的受众。

PoW 共识最大的缺点是非常消耗计算资源,耗电耗能源,这一点也一直为人们所诟病。因为每次产生新的区块都会让相当一部分工作量证明白白浪费了,也就是将计算资源浪费了。

目前来看这个是无解的,只要是 PoW 共识,一定会遇到计算资源浪费的问题。不过人们也想了一些改进方案,早期如素数币,近期有比原币,它们都号称深度学习友好型的工作量证明方法。

PoW 共识机制是一种简单粗暴的共识算法,它不要求高质量的 P2P 网络资源,它可以为公链提供稳定有效的记账者筛选机制。

github实例代码
gitee实例代码

关键字词[区块链]