网络知识 娱乐 如何理解Pow共识算法?

如何理解Pow共识算法?

POW简介

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

算法具体实现原理

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

代码实现

package mainnnimport (nt"crypto/sha256"nt"encoding/hex"nt"fmt"nt"strconv"nt"strings"nt"time"n)nnconst difiiculty = 4 //定义难度系数nntype Block struct {ntIndex int // 区块高度ntTimeStamp int64ntData string //交易记录ntHash stringntPrehash stringntNonce intntDifficulty int //难度系数n}nnvar BlockChain []Block //创建区块链nn//创世区块nfunc GenesisBlock() *Block {ntvar geneBlock = Block{0, time.Now().Unix(), "", "", "", 0, difiiculty}ntgeneBlock.Hash = hex.EncodeToString(BlockHash(geneBlock))nntreturn &geneBlockn}nnfunc BlockHash(block Block) []byte {ntre := strconv.Itoa(block.Index) + strconv.Itoa(int(block.TimeStamp)) + block.Data + block.Prehash +nttstrconv.Itoa(block.Nonce) + strconv.Itoa(block.Difficulty)nth := sha256.New()nth.Write([]byte(re))nthashed := h.Sum(nil)nntreturn hashedn}nnfunc isBlockValid(block Block) bool {ntprefix := strings.Repeat("0",block.Difficulty)ntreturn strings.HasPrefix(block.Hash,prefix)n}nn//创建新区块 pow挖矿nfunc CreateNewBlock(lastBlock *Block,data string) *Block {ntvar newBlock BlockntnewBlock.Index = lastBlock.Index + 1ntnewBlock.TimeStamp = time.Now().Unix()ntnewBlock.Data = datantnewBlock.Prehash = lastBlock.HashntnewBlock.Difficulty = difiicultyntnewBlock.Nonce = 0nt//开挖-当前区块的hash值的前面的0的个数与难度系数值相同ntfor{ntt//计算hashnttcuhash := hex.EncodeToString(BlockHash(newBlock))nttfmt.Println("挖矿中",cuhash)nttnewBlock.Hash = cuhashnttif isBlockValid(newBlock) {nnttt//校验区块ntttif VerflyBlock(newBlock, *lastBlock) {nttttfmt.Println("挖矿成功")nttttreturn &newBlocknttt}ntt}nnttnewBlock.Nonce ++nt}n}nn//校验新的区块是否合法nfunc VerflyBlock(newblock Block, lastBlock Block) bool {ntif lastBlock.Index +1 !=newblock.Index {nttreturn falsent}ntif newblock.Prehash !=lastBlock.Hash {nttreturn falsent}ntreturn truen}nnfunc main() {ntvar genBlock = GenesisBlock()ntnewBlock := CreateNewBlock(genBlock,"新区块")ntfmt.Println(newBlock)n}如何理解Pow共识算法?

PoW 挖矿算法分类与简介

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

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

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

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

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

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

PoW 的优势和劣势

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

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

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

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

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