文章目录
- 前言
- 一、PoS——权益证明
- 二、go语言简单实现
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、PoS——权益证明
- PoS 是什么
⚫ PoS(Proof of Stake)译为权益证明,是一种在公链中的共识算法,可作为 PoW 算
法的一种替换
⚫ 基于权益证明的数字货币中,下一个区块的选择是根据不同节点的股份和时间进行
随机选择的
- PoS 解决的问题
⚫ PoS 的设计理念,来自于对比特币危机的思考,比特币的区块产量每 4 年会减半,
在不久的未来,随着比特币区块包含的产量越来越低,大家挖矿的动力将会不断下
降,矿工人数越来越少,整个比特币网络有可能会逐渐陷入瘫痪
⚫ 其次,若干年后,随着矿工人数的下降,比特币很有可能被一些高算力的人、或团
队、或矿池,进行 51%攻击,导致整个比特币网络崩溃
- 3.为什么会出现PoS?
在比特币系统中采用了PoW(工作量证明)算法,PoW其实就是由所有的节点相互竞争,提交一个难于计算但是容易验证的计算结果,任何节点都可以验证这个这个结果的正确性,验证通过即算这个节点完成了大量的计算工作。
然而PoW机制存在明显的弊端。 一是算力不公平,矿场的竞争力比单个节点大,还有就是随着硬件的发展,特别是量子计算机的出现,可能几秒就破解了Hash。 二是PoW算法太浪费了,比特币网络每秒可完成数百万亿次SHA256计算, 但这些计算除了使恶意攻击者不能轻易地伪装成几百万个节点和打垮比特币网络,并没有更多实际或科学价值。
鉴于以上问题,POS股权证明诞生了。
二、go语言简单实现
package mainimport ("crypto/sha256""encoding/hex""fmt""math/rand""strconv""time"
)//实现PoS算法//定义区块
type Block struct {Index intTimeStamp stringBPM intHashCode stringPrevHash string//区块验证者Validator string
}//创建区块链,数组
var Blockchain []Block//生成新的区块
//address是矿工地址
func GenerateNextBlock(oldBlock Block, BPM int, address string) Block {var newBlock BlocknewBlock.Index = oldBlock.Index + 1newBlock.TimeStamp = time.Now().String()newBlock.PrevHash = oldBlock.HashCodenewBlock.BPM = BPM//挖矿节点地址newBlock.Validator = address//哈希,计算newBlock.HashCode = GenerateHashValue(newBlock)return newBlock
}//计算哈希
func GenerateHashValue(block Block) string {var hashcode = block.PrevHash +block.TimeStamp + block.Validator +strconv.Itoa(block.BPM) + strconv.Itoa(block.Index)//哈希var sha = sha256.New()sha.Write([]byte(hashcode))hashed := sha.Sum(nil)return hex.EncodeToString(hashed)
}//网络上的全节点
type Node struct {//记录有多少个币tokens int//节点地址address string
}//存放几个节点,有几个用户在参与
var n [2] Node//用于记录挖矿地址
var addr [8000] stringfunc main() {//测试//var firstBlock Block//myBlock := GenerateNextBlock(firstBlock,1,"abc")//fmt.Println(myBlock)//创建两个参与者//传入持有的币和节点地址n[0] = Node{tokens: 3000, address: "abc123"}n[1] = Node{tokens: 5000, address: "bcd321"}//以下为PoS共识算法var count = 0//外出循环节点个数for i := 0; i < len(n); i++ {for j := 0; j < n[i].tokens; j++ {addr[count] = n[i].addresscount++}}//设置随机种子rand.Seed(time.Now().Unix())//通过随机值[0,6000)var rd = rand.Intn(6000)println(rd)//随机选矿工var adds = addr[rd]//创建创世区块var firstBlock BlockfirstBlock.BPM = 100firstBlock.PrevHash = "0"firstBlock.TimeStamp = time.Now().String()firstBlock.Validator = "abc123"firstBlock.Index = 1firstBlock.HashCode = GenerateHashValue(firstBlock)//将区块加到区块链Blockchain = append(Blockchain, firstBlock)//第二个区块//让addsvar secondBlock = GenerateNextBlock(firstBlock, 200, adds)Blockchain = append(Blockchain, secondBlock)fmt.Println(Blockchain)
}