上篇文章中爽茴,我們解釋了比特幣的賬戶系統(tǒng)葬凳,今天來(lái)看看記賬權(quán)限的界定是如何完成的。
我們知道室奏,傳統(tǒng)世界中火焰,記賬權(quán)限是完全交由中央銀行去處理的,哪筆交易有效胧沫,哪筆交易無(wú)效昌简,都由它來(lái)界定。
但在比特幣的世界里绒怨,記賬是由很多平行節(jié)點(diǎn)來(lái)完成纯赎,這些節(jié)點(diǎn)之間并沒有權(quán)限的高低之分,也沒有信用一說南蹂,都是網(wǎng)絡(luò)中的一個(gè)個(gè)體犬金。
這種情況下,記賬這一行為就會(huì)帶來(lái)分歧六剥,網(wǎng)絡(luò)中這么多節(jié)點(diǎn)當(dāng)中由誰(shuí)負(fù)責(zé)下一個(gè)記賬呢佑附?誰(shuí)來(lái)界定有效與無(wú)效呢?
我們需要一種算法仗考,這種算法既保證了每個(gè)節(jié)點(diǎn)都可以參與音同,也可以隨時(shí)驗(yàn)證,同時(shí)毫無(wú)捷徑可走秃嗜。
于是出現(xiàn)了工作量證明 - Proof of Work算法权均,中本聰將其應(yīng)用到了比特幣當(dāng)中。
哈希-Hash
為了講解POW锅锨,我們要弄清楚哈希的概念叽赊。
Hash,一般翻譯做“散列”必搞,也有直接音譯為“哈媳刂福”的,就是把任意長(zhǎng)度的輸入通過散列算法變換成固定長(zhǎng)度的輸出恕洲,該輸出就是散列值塔橡。
這種轉(zhuǎn)換是一種壓縮映射梅割,也就是,散列值的空間通常遠(yuǎn)小于輸入的空間葛家,不同的輸入可能會(huì)散列成相同的輸出户辞,所以不可能從散列值來(lái)確定唯一的輸入值。簡(jiǎn)單的說就是一種將任意長(zhǎng)度的消息壓縮到某一固定長(zhǎng)度的消息摘要的函數(shù)癞谒。
哈希的性質(zhì):
- 不同的輸入值底燎,會(huì)通過算法出現(xiàn)不同的輸出值。(有可能出現(xiàn)同樣的輸出值弹砚,稱之為碰撞)
- 無(wú)法根據(jù)輸出值推斷輸入值双仍。
我用“bitcoin”得出計(jì)算哈希值的話,我們就會(huì)看到:
假如我稍微變化“bitcoin”這段文字桌吃,比如后面加個(gè)“1”殊校,我們就會(huì)看到:
可以看到不管輸入什么值,最后的輸出值為衡長(zhǎng)的字符串读存。
大家可以在這個(gè)網(wǎng)站上試試哈希:http://www.kjson.com/encrypt/hash/?fm=map
工作量證明 - Proof of Work
一個(gè)區(qū)塊里有一些什么信息呢?假如當(dāng)前的區(qū)塊鏈高度為9999呕屎,現(xiàn)在需要計(jì)算第10000個(gè)區(qū)塊的數(shù)據(jù)让簿,那么第10000個(gè)區(qū)塊可能是這樣的:
當(dāng)前區(qū)塊高度:10000
前一區(qū)塊哈希:00001425cd88cbc87a6eee5ec70cfce3a8ab38fcabb92122a9
時(shí)間戳:2018-09-15 10:04:45
交易內(nèi)容:
A -> B 轉(zhuǎn)移 10 BTC
C -> D 轉(zhuǎn)移 20 BTC
Nonce:待計(jì)算
當(dāng)前區(qū)塊哈希:待計(jì)算
從區(qū)塊里我們可以看到:Nonce、當(dāng)前區(qū)塊哈希秀睛、時(shí)間戳是變動(dòng)信息尔当,而交易內(nèi)容與前一區(qū)塊哈希為固定信息。
當(dāng)前區(qū)塊哈希 = Hash(交易內(nèi)容 + 前一區(qū)塊哈希 + 當(dāng)前區(qū)塊高度 + 時(shí)間戳 + Nonce)蹂安;
挖礦難度 = 哈希的前4位數(shù)為0椭迎;
if ( 當(dāng)前區(qū)塊哈希 == 挖礦難度 )
{
Nonce 有效;
當(dāng)前區(qū)塊哈希 有效田盈;
}
它將 固定信息 - 交易內(nèi)容 + 前一區(qū)塊哈希 + 當(dāng)前區(qū)塊高度 與 變動(dòng)信息 - 時(shí)間戳(根據(jù)計(jì)算時(shí)間變更) + Nonce 作為整段內(nèi)容進(jìn)行哈希運(yùn)算畜号,得出當(dāng)前區(qū)塊哈希值 - CurrentHash,如果CurrentHash滿足挖礦難度允瞧,即前4位數(shù)為0简软,我們就判斷為有效的新區(qū)塊。
這一計(jì)算Nonce述暂、得出新區(qū)塊哈希的過程 - 我們稱之為挖礦痹升。
挖礦的過程實(shí)際上就是代入不同的Nonce值,從1開始代入畦韭,一直到得出滿足挖礦條件的Hash值為止疼蛾;
當(dāng)計(jì)算出滿足條件的Hash值后,該節(jié)點(diǎn)會(huì)向網(wǎng)絡(luò)中其他節(jié)點(diǎn)廣播艺配,待其他節(jié)點(diǎn)驗(yàn)證成功后察郁,他們會(huì)根據(jù)最新區(qū)塊繼續(xù)計(jì)算下一區(qū)塊衍慎。
當(dāng)網(wǎng)絡(luò)中同時(shí)出現(xiàn)兩個(gè)有效的新區(qū)塊時(shí),網(wǎng)絡(luò)中的其他節(jié)點(diǎn)會(huì)做出選擇绳锅,到底承認(rèn) A區(qū)塊還是承認(rèn) B區(qū)塊西饵;區(qū)塊鏈網(wǎng)絡(luò)中,最終只承認(rèn)高度最高的一條鏈鳞芙,因此經(jīng)過幾輪計(jì)算后眷柔,一條鏈會(huì)被放棄,所有節(jié)點(diǎn)又重新回到一條主鏈上原朝。
- 既然是工作量證明驯嘱,是不是誰(shuí)算過的數(shù)值多,誰(shuí)就可以拿更多獎(jiǎng)勵(lì)喳坠?
- 不鞠评,獎(jiǎng)勵(lì)只與是否最后得出有效Nonce與區(qū)塊有關(guān),一個(gè)節(jié)點(diǎn)為此付出了多少勞動(dòng)與獎(jiǎng)勵(lì)無(wú)關(guān)壕鹉。
挖礦獎(jiǎng)勵(lì)
現(xiàn)在我們知道了剃幌,挖礦的行為本質(zhì)就是獲得記賬權(quán),獲得記賬權(quán)后將交易寫入新區(qū)塊中晾浴,這些交易會(huì)率先獲得承認(rèn)负乡。
有人可能會(huì)好奇,挖礦獎(jiǎng)勵(lì)來(lái)自哪里呢脊凰?
中本聰將該部分邏輯寫進(jìn)了區(qū)塊鏈底層代碼當(dāng)中抖棘,任何新出區(qū)塊的地址將獲得比特幣的獎(jiǎng)勵(lì),這一獎(jiǎng)勵(lì)用于補(bǔ)償它在過程中消耗的硬件與電力資源狸涌。
- 銀行為了維持它的業(yè)務(wù)順利進(jìn)行切省,會(huì)從客戶身上收取手續(xù)費(fèi)。
- 比特幣節(jié)點(diǎn)為了鼓勵(lì)更多人參與到網(wǎng)絡(luò)同步與記賬帕胆,除了從客戶身上收取手續(xù)費(fèi)以外朝捆,還制定了出塊激勵(lì)。
良好的激勵(lì)機(jī)制導(dǎo)致了更多人加入到了比特幣的網(wǎng)絡(luò)當(dāng)中懒豹,參與了挖礦右蹦,加強(qiáng)了網(wǎng)絡(luò)的安全性。
很多人呼吁:區(qū)塊鏈?zhǔn)菂^(qū)塊鏈歼捐,虛擬幣是虛擬幣何陆;區(qū)塊鏈應(yīng)當(dāng)脫離虛擬幣、脫離炒幣存在豹储,而真正將目光集中在解決問題上贷盲。
對(duì)于這種看法我只想說:Too young, Too naive。
這個(gè)問題的具體解釋放到后面。
還有一個(gè)經(jīng)常聽到的問題是:挖礦能不能掙錢巩剖,我能不能也挖礦铝穷?
相信你已經(jīng)明白了什么是挖礦,那么挖礦能不能掙錢呢佳魔?
在當(dāng)前的算力難度以及比特幣價(jià)格下曙聂,個(gè)人很難通過挖礦去獲利;從經(jīng)濟(jì)學(xué)的角度來(lái)看鞠鲜,如果普通人也能在挖礦市場(chǎng)中獲利宁脊,那么參與者會(huì)越來(lái)越多,直到所有人都沒有短期利益為止贤姆。
所以我們能得到最后問題的答案:你也可以挖礦榆苞,但能不能獲利得認(rèn)真考究。