共识算法(一)—— Pow(工作量证明)、PoS(权益证明)

PoW简介

PoW (Proof-of-Work)即工作量证明,根据当时区块链网络算力得出的难易程度(前导零,所计算出来的hash开头有多少个0),将区块的属性使其拼凑成一个满足要求的hash值,(nonce值让其一直改变,从而才会计算出不同的hash),然后马上对全网进行广播打包区块,网络上的节点收到广播打包区块,会立即进行验证。网络中最快解密的区块,才会添加到帐本中,其他节点进行复制,这样就保证了整个账本的唯一性。假如节点有任何作弊行为,都会导致网络的节点验证不通过,直接丢弃打包的区块,这个区块就不会被记录到账本中,作弊的成本就白费了,因此在巨大的挖矿成本下,这样也就能是矿工自觉遵守区块链系统的共识协议,也就确保了整个系统的安全。

代币

比特币,ETH(eth最先是pow,但随着时间的推移,可能会更换其共识算法)

优点

  1. 去中心化,使用PoW执行分配记账权的方式,可以实现相对的公平,也就是说,你挖矿的有效贡献多少,决定着你获得到的币有多少。
  2. 安全性高:要想破坏系统就需要极大的成本,如果想要作弊,就要有压倒大多数人的算力(51%攻击),因此破坏成本的增高,会让矿工更加诚实的挖矿。
  3. 有效避免矿工同一时间挖到矿使整个网络账本不一致的问题。

缺点

  1. 浪费了算力,消耗了大量的资源。
  2. 网络性能较低,等待确认十分缓慢。容易分叉。
  3. 算力集中化,会使其失去去中心化的头衔。
  4. 奖励每四年减半,到最后会使矿工挖矿积极性不大,从而造成网络性能更差(无人或很少将区块打包)从而使交易的手续费抬高。
做的有效工作越多,获得的就越多

案例:

package main

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

type Block struct {

	//前区块hash
	Prehash string
	//当前区块hash
	Hash string
	//时间戳
	Timestamp string
	//随机值
	Nonce *big.Int

	//数据
	Data string
	//高度
	Index  *big.Int
	//难度
	Diff int

}


//生成第一个区块
func  genFirstBlock(data string)(Block){

	firstBlock := new(Block)
	firstBlock.Data = data
	firstBlock.Diff = 4
	firstBlock.Index=big.NewInt(0)
	firstBlock.Prehash = "0000000000000000000000000000000000000000000000000000000000000000"
	firstBlock.Timestamp= time.Now().String()
	firstBlock.Hash = Pow(firstBlock)

	return  *firstBlock
}

//pow
func Pow(block *Block)string{

	var hash string

	block.Nonce = big.NewInt(0)

	for {

		s := block.Prehash+block.Timestamp+block.Index.String()+strconv.Itoa(block.Diff)+block.Data+block.Nonce.String()
		hash = genBlockHash(s)

		fmt.Println(hash)
		repeat := strings.Repeat("0", 4)

		prefix := strings.HasPrefix(hash, repeat)

		if prefix {
			break
		}
			 block.Nonce = big.NewInt(0).Add(block.Nonce, big.NewInt(1))


	}


	return hash
}



//计算hash
func genBlockHash(s string)(hash string){

	sha:= sha256.New()
	_, err := sha.Write([]byte(s))
	handle(" crypto write faild!",err)

	 hash = hex.EncodeToString(sha.Sum(nil))

	return
}





func main() {

	block := genFirstBlock("first block ")

	fmt.Println(block)

}



//错误处理函数
func handle (why string, err error){

	if err!=nil{
		fmt.Println(err,"reason:",why)
	}
}

直接运行即可

运行结果:

 

PoS简介

PoS(Proof-of-Stake)即权益证明,可看其为PoW的替换,其解决了PoW中 的一些问题,但也出现了新的问题。其设计理念是区块记账权的抉择是根据不同节点的股份和占有时间来进行随机选择的。它解决了比特币随着矿工积极性的下降从而使矿工人数的减少,造成的整个网络可能陷入瘫痪的问题,也增加了安全性,因为破环成本不光是51%的算例,而且还需要51%的持有量。

代币

点点币,NVC,雅币等

优点

  1. 节能,不会消耗很多资源
  2. 更加的去中心化,51%算力+51%货币持有量可以攻破
  3. 避免了通货膨胀

缺点

  1. 纯粹的PoS机制的话,会通过IPO方式发行,这样就会导致很多人获得大量成本低的货币。
  2. PoS信用基础不牢固
拥有越多,得到的就越多

PoW与PoS的区别

各有千秋,PoW耗费了资源,PoS不怎么耗费资源,但是PoS前期采用IPO方式会使少数人获得大量成本低的货币,而PoW就不会,PoW会使算力集中,但PoS并不会,在这方面,PoS更能体现去中心化这一理念。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值