區(qū)塊鏈
什么是區(qū)塊鏈罕袋?
區(qū)塊鏈?zhǔn)且环N分布式的去中心化的數(shù)據(jù)庫(kù)台盯。
比特幣
什么是比特幣存筏?
比特幣本質(zhì)是一個(gè)記賬簿宠互。
它是一個(gè)去中心化的網(wǎng)絡(luò)味榛,每一個(gè)節(jié)點(diǎn)稱為礦工。
記賬的方式:
發(fā)生比特幣交易時(shí)予跌,需要加入這個(gè)比特幣網(wǎng)絡(luò)搏色,交易雙方為比特幣網(wǎng)絡(luò)的節(jié)點(diǎn),例如:A向B轉(zhuǎn)賬
這個(gè)轉(zhuǎn)賬申請(qǐng)加入?yún)^(qū)塊鏈網(wǎng)絡(luò)券册,因?yàn)檫@個(gè)網(wǎng)絡(luò)是由很多節(jié)點(diǎn)組成的频轿,需要一半以上的節(jié)點(diǎn)的同意,才可以加入網(wǎng)絡(luò)烁焙,也就是51%的節(jié)點(diǎn)的同意略吨。好,同意之后考阱,就可以在這個(gè)網(wǎng)絡(luò)記錄起來(lái)了。
那這個(gè)交易記錄存放在哪里了鞠苟,交易記錄存放在一個(gè)稱為區(qū)塊的地方乞榨,這個(gè)網(wǎng)絡(luò)每隔10分鐘就會(huì)產(chǎn)生一個(gè)新的區(qū)塊,存放這個(gè)區(qū)塊產(chǎn)生時(shí)間和上一個(gè)區(qū)塊產(chǎn)生時(shí)間內(nèi)的所有被同意的交易当娱,也就是這10分鐘的交易吃既。
問(wèn)題:如何產(chǎn)生第一個(gè)區(qū)塊
剛才講到,這個(gè)網(wǎng)絡(luò)由很多個(gè)節(jié)點(diǎn)組成跨细,那這個(gè)新的區(qū)塊到底是由哪個(gè)節(jié)點(diǎn)產(chǎn)生鹦倚?這是一個(gè)需要思考的問(wèn)題
事實(shí)上,所有的節(jié)點(diǎn)都想當(dāng)?shù)谝粋€(gè)冀惭,因?yàn)椋?br>
第一個(gè)生成新區(qū)塊的節(jié)點(diǎn)有一項(xiàng)特權(quán)震叙,可以在新生成的區(qū)塊中插入一條特殊交易記錄:憑空向一個(gè)地址轉(zhuǎn)入一定數(shù)額的比特幣。
“憑空”的意思是不需要輸入U(xiǎn)TXO散休,這些比特幣是憑空產(chǎn)生的媒楼,是作為產(chǎn)生新區(qū)塊的獎(jiǎng)勵(lì)。這個(gè)特殊交易稱為“創(chuàng)幣交易”戚丸,因?yàn)檫@一過(guò)程也是發(fā)行新比特幣的過(guò)程划址,這就是為什么產(chǎn)生新區(qū)塊被稱為“挖礦”。
那么獎(jiǎng)勵(lì)的數(shù)額有多大呢限府?創(chuàng)建新區(qū)塊的獎(jiǎng)勵(lì)數(shù)額是不定的:第一個(gè)區(qū)塊獎(jiǎng)勵(lì)的是50個(gè)比特幣夺颤,隨后每產(chǎn)生210000個(gè)區(qū)塊這一數(shù)字就遞減50%,直到變?yōu)?胁勺。目前區(qū)塊鏈的長(zhǎng)度已接近50W世澜,因此每次獎(jiǎng)勵(lì)12.5個(gè)比特幣。通過(guò)以下公式便可算出署穗,比特幣的上限是2100W個(gè)宜狐。
除了創(chuàng)塊獎(jiǎng)勵(lì)外势告,創(chuàng)塊的收益還包括所有交易的交易費(fèi)。因?yàn)槊總€(gè)區(qū)塊記錄了這10分鐘內(nèi)的交易抚恒,交易的時(shí)候需要收取交易費(fèi)咱台,這些交易非也會(huì)給創(chuàng)建第一個(gè)區(qū)塊的節(jié)點(diǎn)。
那么俭驮,
如何才能創(chuàng)建一個(gè)新區(qū)塊呢回溺?通過(guò)解決一個(gè)問(wèn)題:即找到一個(gè)nonce值,使得新區(qū)塊頭的哈希值小于某個(gè)指定的值混萝,即區(qū)塊頭結(jié)構(gòu)中的“難度目標(biāo)”遗遵。
區(qū)塊頭中的信息,在挖礦前大部分已經(jīng)是固定下來(lái)的逸嘀,或者是可計(jì)算的车要。
版本號(hào)
跟隨比特幣客戶端而定,一段時(shí)間內(nèi)不會(huì)改變崭倘。即使要改變翼岁,也會(huì)有比特幣的核心開發(fā)人員來(lái)協(xié)調(diào)升級(jí)策略,這個(gè)可以理解為一個(gè)靜態(tài)常數(shù)司光。
前一區(qū)塊的哈希摘要
一次哈希即可琅坡。前一區(qū)塊已經(jīng)是打包好的。
默克爾樹的根
剛才已經(jīng)得到了結(jié)果残家,根據(jù)本次交易包含的交易列表得到榆俺。
時(shí)間
取打包時(shí)的時(shí)間。也不需要很精確坞淮,前后幾秒茴晋,幾十秒也都可以。
難度目標(biāo)
參考上兩周產(chǎn)生的區(qū)塊的平均生成時(shí)間而定回窘。兩周內(nèi)如果平均10分鐘產(chǎn)生一個(gè)區(qū)塊的話晃跺,兩周會(huì)產(chǎn)生2016個(gè)區(qū)塊,軟件會(huì)計(jì)算最新的2016個(gè)區(qū)塊生成的時(shí)間毫玖,然后做對(duì)比掀虎,隨之調(diào)整難度,使得接下來(lái)產(chǎn)生的區(qū)塊的預(yù)期時(shí)間保持在10分鐘左右付枫。因?yàn)樽罱?016個(gè)區(qū)塊已經(jīng)確定烹玉,所以這個(gè)數(shù)字也是確定的。
隨機(jī)數(shù)nonce
這個(gè)就是挖礦的目標(biāo)了阐滩。這是一個(gè)32位的數(shù)字二打。
隨機(jī)數(shù)可以變化,而且要從0試到最大值2^32掂榔。直到最后出現(xiàn)的hash結(jié)果继效,其數(shù)字低于難度目標(biāo)值症杏。不過(guò)以現(xiàn)在的計(jì)算機(jī)算力,一臺(tái)礦機(jī)用不了一秒就把全部的變化可能計(jì)算完了瑞信,所以還需要改變區(qū)塊內(nèi)部的創(chuàng)幣交易中的附帶消息厉颤,這樣就讓merkle root也發(fā)生了變化,從而有更多的可能去找到符合要求的nonce凡简。
block_header = version + previous_block_hash + merkle_root + time + target_bits + nonce
for i in range(0, 2**32):
if sha256(sha256(block_header)) < target_bits:
break
else:
continue
比特幣的交易如何確認(rèn)
先講一個(gè)概念:UTXO逼友,指未花費(fèi)的交易輸出
比特幣的記賬模式跟傳統(tǒng)的中心化記賬模式有一個(gè)比較難理解的區(qū)別:比特幣沒(méi)有賬戶的概念。
具體來(lái)說(shuō)秤涩,比特幣的記賬系統(tǒng)帜乞,是通過(guò)記錄和確認(rèn)每一筆交易本身來(lái)記賬,是交易本身筐眷,是交易的行為本身黎烈,也就是A向B轉(zhuǎn)賬這個(gè)過(guò)程,而不是記錄A和B的余額變動(dòng)匀谣,而A及B的最終余額是通過(guò)掃描交易數(shù)據(jù)計(jì)算出來(lái)的照棋。
而傳統(tǒng)的記賬系統(tǒng)(銀行),是通過(guò)記錄和保存每個(gè)賬戶的余額變動(dòng)數(shù)據(jù)來(lái)驗(yàn)證交易的振定,也就是說(shuō),每一次交易由中心記賬系統(tǒng)把不同賬戶(一般是2個(gè))肉拓,的余額進(jìn)行相應(yīng)的調(diào)整并保存后频,完成了一個(gè)交易的記錄。A向B轉(zhuǎn)100萬(wàn)暖途,那么先把A的余額減少100萬(wàn)卑惜,同時(shí)把B的余額增加100萬(wàn),會(huì)計(jì)上說(shuō)的驻售,有借必有貸露久,借貸必相等。
為什么會(huì)這樣欺栗?為什么比特幣系統(tǒng)毫痕,不采取實(shí)時(shí)更新賬戶余額的方式來(lái)記賬?主要有兩個(gè)原因:
1.節(jié)省算力和儲(chǔ)存空間迟几。因?yàn)槿绻扇∮囝~模式消请,為了避免雙重支付,即使你的賬戶沒(méi)有發(fā)生變化类腮,比特幣系統(tǒng)里任何一個(gè)客戶端(錢包)發(fā)生一筆交易和變動(dòng)臊泰,所有的客戶端都有同步數(shù)據(jù),否則蚜枢,若B沒(méi)有同步更新整個(gè)系統(tǒng)中的所有賬戶余額信息缸逃,在A給B轉(zhuǎn)賬時(shí)针饥,B無(wú)法知道A的賬上是否有足夠的余額,甚至有可能需频,A把同一個(gè)比特幣同時(shí)轉(zhuǎn)給了B和C丁眼,而B和C由于都沒(méi)有更新A的余額信息,都不知道A的賬上其實(shí)沒(méi)有那么多錢贺辰。
而傳統(tǒng)的支付系統(tǒng)不一樣户盯,每一次交易,只有付款方和收款方的余額變動(dòng)饲化,頂多再加上中心化的服務(wù)器數(shù)據(jù)發(fā)生變動(dòng)莽鸭,所以只要同步很少的數(shù)據(jù)(這個(gè)是相對(duì)于區(qū)塊鏈來(lái)說(shuō)),事實(shí)上由于所有記賬都是中心服務(wù)器來(lái)完成吃靠,其實(shí)不需要額外同步硫眨,只需要在完成記錄的同時(shí)儲(chǔ)存數(shù)據(jù)就可以了。所以在數(shù)據(jù)儲(chǔ)存上中心化的系統(tǒng)是有優(yōu)勢(shì)的巢块,如果比特幣也采用這種余額思路礁阁,那么必定會(huì)失敗(雖然現(xiàn)在也還不好說(shuō)一定能成功)族奢。
2.如果采取記錄賬戶余額的方式姥闭,那么在不同節(jié)點(diǎn)更新存在時(shí)間差的時(shí)候,很容易出現(xiàn)雙重支付越走,簡(jiǎn)單來(lái)說(shuō)棚品,A把同1各比特幣轉(zhuǎn)給B和C,由于BC的地理位置不同廊敌,他們附近的節(jié)點(diǎn)不同铜跑,有可能都確認(rèn)為交易,雖然隨著時(shí)間的推移骡澈,比特幣系統(tǒng)會(huì)達(dá)成競(jìng)爭(zhēng)共識(shí)锅纺,只確認(rèn)一個(gè)交易,但肋殴,BC兩人都提供了商品給A囤锉,最后,肯定有一個(gè)人蒙受損失护锤。
那比特幣系統(tǒng)是怎么做的呢:那就是只確認(rèn)交易本身嚼锄,直記錄交易輸入和輸出:每筆比特幣交易都有輸入和輸出,別人付給你的錢是“交易輸入”(對(duì)你來(lái)說(shuō))蔽豺,你收到的錢如果被你支付出去了区丑,叫做“交易輸出”,你收到但是還沒(méi)有支付出去的錢叫做“未花費(fèi)交易輸出”(UTXO),這是一種待支付的狀態(tài)沧侥。
礦工們把每一次交易本身的數(shù)據(jù)(輸入和輸出)打包到區(qū)塊之中可霎,通過(guò)競(jìng)爭(zhēng)計(jì)算,確保不可串改宴杀,實(shí)際上如果得到6個(gè)區(qū)塊的確認(rèn)癣朗,那么全球的算力加起來(lái)都沒(méi)法串改。
如果需要確認(rèn)余額旺罢,那么就用客戶端(錢包)掃描某一個(gè)賬戶的輸入旷余、輸出數(shù)據(jù),就可以算出這個(gè)賬戶的余額扁达,相比更新所有賬戶的余額數(shù)據(jù)來(lái)說(shuō)正卧,簡(jiǎn)直太輕松,不到1秒鐘就可以搞定跪解。
說(shuō)完了比特幣系統(tǒng)記賬的方式炉旷,下面講講具體支付過(guò)程中,雙方如何確認(rèn)交易已經(jīng)完成了叉讥?還是先講一個(gè)關(guān)鍵概念:
SPV:簡(jiǎn)單支付驗(yàn)證窘行。我們?cè)谟帽忍貛沤灰椎臅r(shí)候,必須確定交易成功图仓,才會(huì)提供相應(yīng)的服務(wù)或者商品罐盔,也就是一手交錢一手交貨,確認(rèn)收到錢救崔,才交貨惶看。為什么說(shuō)是“簡(jiǎn)單驗(yàn)證”呢?因?yàn)檫@種驗(yàn)證方法帚豪,不需要下載所有的交易數(shù)據(jù)碳竟,只需要下載區(qū)塊頭數(shù)據(jù)就可以驗(yàn)證草丧。
那什么是區(qū)塊頭呢狸臣?
簡(jiǎn)單回顧一下,區(qū)塊鏈對(duì)交易的記錄昌执,是把一段時(shí)間內(nèi)的交易數(shù)據(jù)烛亦,打包到一個(gè)區(qū)塊中,然后隨著時(shí)間的推移懂拾,區(qū)塊不斷累積疊加煤禽,環(huán)環(huán)相扣,形成區(qū)塊鏈岖赋,區(qū)塊鏈越長(zhǎng)檬果,越難修改,一般來(lái)說(shuō)經(jīng)過(guò)6個(gè)區(qū)塊以后,全球的計(jì)算機(jī)加起來(lái)都無(wú)法修改选脊。
每個(gè)區(qū)塊頭信息代表著一個(gè)區(qū)塊杭抠,就像是區(qū)塊的身份證一樣,你看到我的身份證就知道我是誰(shuí)恳啥,就可以在腦海中浮現(xiàn)出我的身高偏灿、樣貌,甚至職業(yè)钝的、愛(ài)好等信息翁垂,在區(qū)塊鏈?zhǔn)澜缋铮到y(tǒng)通過(guò)區(qū)塊頭硝桩,可以識(shí)別出區(qū)塊信息的方方面面沿猜。