Go区块链之共识算法系列——PoW(一)

738 阅读2分钟

「这是我参与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来计算,下面的内容我们下一期再说吧~敬请期待!

\