「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」。
区块链之共识算法系列——PoW(一)
一、前言
说到区块链我们先要了解什么是P2P,这个P2P不是金融方面的名词,而是指对等网络。在中本聪的白皮书中提出了像微信支付、支付宝这样的需要经过第三方的点对点支付系统是没有任何意义的。
而我们的P2P,就是这样一个不需要经过第三方的概念,其之所以会出现的一个重要原因就是避免有第三方和中心。
在P2P对等网络中所有的节点功能都是一样的,没有哪一个节点是特殊的,他们之间互相提供服务。
因为没有第三方,没有中心,所以保证了数据的透明、自由、平等。
我们常听说的比特币就是使用PoW共识算法的。PoW是Proof-of-Work的简称,即工作量证明。就是计算一个数值,使得和数据合并后的值满足要求后,就马上广播全网打包区块,全网的节点收到广播之后,就会验证其正确性。如果节点有作弊行为,那么就不会通过验证,这个打包的区块会被丢弃,无法记录到账本,挖矿成本这么高,如果作弊导致区块被丢弃,比特币也拿不到了,岂不是还得亏本。所以矿工都愿意遵守比特币系统的共识协议。
二、PoW代码实现
我们先定义区块的结构体:
type Block struct {
//上一个区块的哈希值
PreHash string
//当前区块的哈希值
HashCode string
//时间戳
TimeStamp string
//难度系数
Diff int
//交易信息
Data string
//区块高度
Index int
//随机值
Nonce int
}
根据比特币,我们将这个区块的信息设置为以下几点:上一个区块的哈希值、当前区块的哈希值、时间戳、难度系数、交易信息、区块高度、随机值。
然后我们来建立一个创世区块。
//创世区块
func GneFirBlock(data string) Block {
//创建第一个区块
var firstblock Block
firstblock.PreHash = ""
firstblock.TimeStamp = time.Now().String()
firstblock.Diff = 3
firstblock.Index = 1
firstblock.Nonce = 0
//通过sha256计算哈希值
firstblock.HashCode =GneHashValue(firstblock)
return firstblock
}
因为是第一个区块,所以前一个区块是为空,时间戳我们使用现在的时间,难度我们暂时设置为3,因为是第一个区块,所以区块高度为1,随机值可以随便搞一个,我们就用0吧。然后我们得计算当前区块的hash值,我们要使用sha256来计算,下面的内容我们下一期再说吧~敬请期待!
\