本代碼的全部實(shí)現(xiàn)已在github上面同步開(kāi)源,項(xiàng)目地址:
link
PoW算法介紹
工作量證明(Proof Of Work,簡(jiǎn)稱POW),簡(jiǎn)單理解就是一份證明,用來(lái)確認(rèn)你做過(guò)一定量的工作。監(jiān)測(cè)工作的整個(gè)過(guò)程通常是極為低效的,而通過(guò)對(duì)工作的結(jié)果進(jìn)行認(rèn)證來(lái)證明完成了相應(yīng)的工作量,則是一種非常高效的方式。比如現(xiàn)實(shí)生活中的畢業(yè)證、駕駛證等等,也是通過(guò)檢驗(yàn)結(jié)果的方式(通過(guò)相關(guān)的考試)所取得的證明。
工作量證明系統(tǒng)(或者說(shuō)協(xié)議、函數(shù)),是一種應(yīng)對(duì)拒絕服務(wù)攻擊和其他服務(wù)濫用的經(jīng)濟(jì)對(duì)策。它要求發(fā)起者進(jìn)行一定量的運(yùn)算,也就意味著需要消耗計(jì)算機(jī)一定的時(shí)間。
PoW算法思路
通過(guò)不斷對(duì)結(jié)點(diǎn)的數(shù)據(jù)進(jìn)行哈希計(jì)算,通過(guò)比較目標(biāo)哈希與當(dāng)前哈希值的對(duì)比,實(shí)現(xiàn)共識(shí)算法。
代碼與實(shí)現(xiàn)思路
偽碼思路:
1.建立ProofOfWork類,帶有兩個(gè)屬性{目標(biāo)哈希,目標(biāo)區(qū)塊}
2.通過(guò)ProofOfWork類進(jìn)行計(jì)算目標(biāo)區(qū)塊的哈希,并與目標(biāo)哈希進(jìn)行比較。
3.若判定目標(biāo)區(qū)塊的哈希值小于目標(biāo)哈希值,則完成工作量證明,進(jìn)行廣播,并上鏈。
ProofOfWork的結(jié)構(gòu):
// 工作量證明的結(jié)構(gòu)
type ProofOfWork struct {
//需要共識(shí)驗(yàn)證的區(qū)塊
Block *Block
//目標(biāo)難度的哈希,大數(shù)存儲(chǔ)
target *big.Int
}
進(jìn)行哈希值的比較:
func (pow *ProofOfWork) run() ([]byte, int64) {
//碰撞次數(shù)
var nonce = int64(0)
//用于比較的大數(shù)hash
var hashInt big.Int
//目標(biāo)hash值
var hash [32]byte
//無(wú)限循環(huán),生成符合條件的哈希
for {
//生成準(zhǔn)備數(shù)據(jù)
dataByte := pow.prepareData(int64(nonce))
hash = sha256.Sum256(dataByte)
//將byte數(shù)據(jù)轉(zhuǎn)換為大數(shù)
hashInt.SetBytes(hash[:])
if pow.target.Cmp(&hashInt) == 1 {
//找到了符合條件的hash
break
}
nonce++
}
fmt.Printf("打印碰撞次數(shù)%v\n", nonce)
return hash[:], nonce
}
拼接區(qū)塊數(shù)據(jù),便于計(jì)算哈希值:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-761898.html
// 生成準(zhǔn)備數(shù)據(jù),對(duì)ProofOfWork數(shù)據(jù)拼接形成哈希值并返回
func (pow *ProofOfWork) prepareData(nonce int64) []byte {
var data []byte
timeStampBytes := IntToHex(pow.Block.TimeStamp)
heightBytes := IntToHex(pow.Block.Height)
//將多個(gè)[]byte數(shù)組轉(zhuǎn)換為一個(gè)[]byte數(shù)組
data = bytes.Join([][]byte{
timeStampBytes,
heightBytes,
pow.Block.PrevBlockHash,
pow.Block.Data,
IntToHex(nonce),
IntToHex(targetBit),
}, []byte{})
return data
}
實(shí)驗(yàn)結(jié)果
可以看到,總共生成了三個(gè)區(qū)塊,每個(gè)區(qū)塊的碰撞次數(shù)如下。最后輸出整個(gè)區(qū)塊鏈,可以看到,區(qū)塊的哈希值之間呈現(xiàn)鏈表結(jié)構(gòu)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-761898.html
到了這里,關(guān)于區(qū)塊鏈實(shí)現(xiàn)之POW分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!