小白也能懂的比特幣及區(qū)塊鏈原理
文中盡量以大白話講解比特幣及區(qū)塊鏈的基本原理藕溅,一步一步的畫出區(qū)塊鏈的鳥瞰圖棚壁。
1亍!袖外!相關(guān)概念描述并不嚴謹史隆,僅是面向于小白的小白化說明。
初探
比特幣
一種加密數(shù)字貨幣(也叫加密貨幣)在刺。
什么是數(shù)字貨幣逆害?比如:Q幣、游戲幣.....蚣驼。哦魄幕,原來這么簡單,那加密貨幣就是加密了的數(shù)字貨幣颖杏,這有什么好玩的纯陨?嗯......,咱們繼續(xù)看......
區(qū)塊鏈
......留储,這個名詞翼抠,看起來很深奧,先繞過......
比特幣和區(qū)塊鏈的關(guān)系
先講個故事
某宿舍有六個人获讳,大家經(jīng)常出去吃喝玩耍阴颖,每次吃喝玩耍結(jié)束都需要付款,每次都AA很麻煩丐膝,所以約定大家輪流付款并記賬量愧,每月月底按賬本結(jié)算平攤钾菊。
這個賬本使用先進的防篡改技術(shù)(比如花色底紋:-) ),由專人記賬偎肃。在每筆付款記錄之后都有一個簽名欄煞烫,由付款人簽名確認。這個賬本裝訂良好累颂,每一頁都有先后順序滞详,任何人都無法抽取替換其中任何一頁來作假。
你可能會說紊馏,不能篡改料饥,那另做一個賬本,把原來那個賬本替換掉不就可以了瘦棋。好吧稀火,你很聰明,為了防止這種居心不良的人赌朋,咱們建立六個內(nèi)容相同的賬本,每人都保存一個篇裁,這叫分布式保存沛慢,哈哈!-
再看比特幣和區(qū)塊鏈
比特幣和區(qū)塊鏈類似于上面故事中的付款記錄和賬本达布,故事中的賬本對應區(qū)塊鏈团甲,如下圖:
賬本中的每一頁對應區(qū)塊鏈中的一個區(qū)塊(區(qū)塊,就是記錄了很多條比特幣交易記錄的數(shù)據(jù)塊)黍聂,賬本中的付款記錄對應區(qū)塊中交易記錄:
故事中我們?yōu)榱税踩?建立了六個相同的賬本躺苦,每人保管一份:
而區(qū)塊鏈中,每一份完整的區(qū)塊鏈數(shù)據(jù)分布保存在世界各地的計算機中产还,這些計算機通過通信網(wǎng)絡(luò)相連接匹厘,每臺計算機都被稱為網(wǎng)絡(luò)中的一個節(jié)點:
區(qū)塊鏈的安全性遠比賬本要高:賬本中的簽名是可以模仿的;有六個帳本也可能被全部替換掉脐区。而在比特幣的運行機制中這種情況幾乎不可能發(fā)生愈诚,而這個[幾乎不可能]基本等于[不可能]。為什么這么說牛隅,咱們繼續(xù)分解......
數(shù)字簽名
在前面故事中炕柔,每個付款人都要對自己的付款記錄進行簽字,以確認這條付款記錄是正確的媒佣,并且這筆錢是自己付的匕累。比特幣在交易過程中也會產(chǎn)生很多交易記錄,而這些記錄都是通過數(shù)字簽名來確認的默伍。
數(shù)字簽名廣泛應用于電子商務欢嘿、在線支付等業(yè)務場景中,由一個私鑰和一個公鑰組成授霸。
- 私鑰
其實就是一個隨機數(shù),通過一定的算法际插,使得每次產(chǎn)生的這個隨機數(shù)不同碘耳。 - 公鑰
是通過私鑰推算(橢圓曲線算法)出來的。但是框弛,不能通過公鑰反推出私鑰辛辨。 - 用法
使用私鑰對某個信息簽名,將得到的數(shù)字簽名瑟枫、公鑰斗搞、信息發(fā)送給其他人,那么其他人就可以通過公鑰和數(shù)字簽名就能驗證信息慷妙,確認信息是否正確僻焚。如果信息在傳輸過程被修改過,那怕是被修改過一個標點符號膝擂,或添加了一個空格虑啤,對信息的驗證都會失敗。- 簽名函數(shù)(交易記錄架馋,私鑰)=>數(shù)字簽名
- 驗證函數(shù)(交易記錄狞山,公鑰,數(shù)字簽名)=>驗證通過
數(shù)字簽名是無法偽造的叉寂,一個私鑰對一個消息只能的產(chǎn)生一個數(shù)字簽名萍启。在比特幣交易中,有兩個地方使用了數(shù)字簽名:
- 對交易記錄簽名
交易付款人付款時屏鳍,會用付款人的私鑰對交易記錄簽名勘纯,以證明這筆錢是付款人支付的。 - 證明對比特幣的所有權(quán)
付款人通過數(shù)字簽名钓瞭,證明支出的這些比特幣是他自己的(通過解鎖腳本驳遵,欲了解詳情,請參考本文后附的鏈接)降淮。
數(shù)據(jù)特征碼
比特幣是通過哈希算法(SHA-256和RipeMD160)計算數(shù)據(jù)的哈希值的超埋,哈希值有什么用呢?我們可以理解為哈希值是數(shù)據(jù)特征碼佳鳖,這個特征碼能夠唯一代表這塊數(shù)據(jù)霍殴。數(shù)據(jù)不同產(chǎn)生的特征碼不同,對數(shù)據(jù)的任何細小改動系吩,都會使得最終得到的數(shù)據(jù)特征碼不同来庭。
那么,這個特征碼有什么用呢?
先看看區(qū)塊的結(jié)構(gòu):
從上圖中我們看到區(qū)塊有兩部分組成穿挨,hash值組成的區(qū)塊頭和交易記錄組成的區(qū)塊體(為了便于理解此處區(qū)塊頭和交易記錄都做了簡化)月弛。
-
區(qū)塊頭
區(qū)塊頭中有兩個Hash值肴盏,分別是父區(qū)塊Hash和Merkle Hash。-
父區(qū)塊Hash
父區(qū)塊Hash保存的是上一個區(qū)塊的特征碼帽衙。
區(qū)塊鏈中就是通過在子區(qū)塊中保存父區(qū)塊特征碼菜皂,使得子區(qū)塊與父區(qū)塊建立連接,最終建立一個完整區(qū)塊鏈條厉萝。在比特幣中這個鏈條就是比特幣賬本恍飘。
說到這里,我們就需要修正之前一個的“錯誤”:那個“賬本對應區(qū)塊鏈”的描述是不準確的谴垫,現(xiàn)修改如下:
-
Merkle Hash
Merkle Hash是對區(qū)塊中所有交易記錄計算出的一個總的特征碼章母。
這個特征碼是怎么算出來的?
我們以一個區(qū)塊中有四筆交易記錄為例:
- 分別算出交易記錄1和交易記錄2的特征碼(特征碼1和特征碼2)翩剪,將特征碼2接到特征碼1的后面組成一個新的數(shù)據(jù)乳怎,算出這個新數(shù)據(jù)的特征碼A;
- 分別算出交易記錄3和交易記錄4的特征碼(特征碼3和特征碼4),將特征碼4接到特征碼3的后面組成一個新的數(shù)據(jù)前弯,以新數(shù)據(jù)算出特征碼B;
- 將特征碼B接到特征碼A后面蚪缀,算出所有交易記錄的總特征碼,即Merkle Hash
對上面的步驟我們做進一步的整理:
-
除了交易記錄博杖,其他都是對特征碼進行計算,即下面圈出的部分:
圈出的這部分像一棵倒置的樹椿胯,專業(yè)叫法是Merkle樹(Merkle Tree)
生成總特征碼的基本規(guī)則:兩個特征碼按生成的先后順序連接到一起組成新數(shù)據(jù),來生成新特征碼
總特征碼位于樹的根部剃根,也就是樹的根節(jié)點,因而總特征碼的專業(yè)叫法是Merkle根
如此算出來的總特征碼才能代表區(qū)塊中的所有交易記錄前方,區(qū)塊中的任何信息包括交易記錄的先后順序都不能變動狈醉,只要有變動就無法對應上已經(jīng)算出來的總特征碼,說明數(shù)據(jù)被改動過惠险。
區(qū)塊Hash
對區(qū)塊頭計算Hash得到的特征碼即區(qū)塊Hash苗傅。因為區(qū)塊頭中包含了代表所有交易記錄Merke Hash,所以僅對區(qū)塊頭計算出的特征碼就可以代表整個區(qū)塊班巩。
需要注意的是渣慕,區(qū)塊中并不會保存區(qū)塊自己的區(qū)塊Hash,而是在子區(qū)塊保存“父區(qū)塊的Hash”。
有人說偶數(shù)條記錄可能兩兩組合生成逐級生成特征碼抱慌,那我有奇數(shù)條記錄怎么辦呢逊桦?有了前面的知識,再參考下圖應該就能明白了抑进,這里就不多做解釋了强经。
-
不可篡改
讀到這里細心的你可能已經(jīng)對區(qū)塊鏈的不可篡改原理有了一些了解:對區(qū)塊中的任意交易記錄任何修改都會引起數(shù)據(jù)驗證無法通過。
引申一下前面的內(nèi)容
如果你想修改一條了交易記錄寺渗,為了這條修改后的記錄合法匿情,你需要:
- 修改區(qū)塊
計算這條記錄在Merkle樹上所經(jīng)路徑的所有特征碼兰迫,以5條記錄中第1條記錄被修改為例:
上圖中紅色字體部分是修改【交易記錄1】而引起重算的所有特征碼。這里只是以5條記錄為例炬称,實際上汁果,目前一個區(qū)塊(1M)中依交易記錄大小的不同有可能會存放3000~4000條記錄。
-
修改鏈
上面只是區(qū)塊內(nèi)的變化玲躯,由于總特征碼(Merkle Hash)變了据德,這會使得區(qū)塊Hash變化,而區(qū)塊Hash變化府蔗,意味著子區(qū)塊中的“父區(qū)塊Hash”的值變化晋控,導致子區(qū)塊的區(qū)塊Hash變化,如此產(chǎn)生級聯(lián)效應姓赤,引起這條鏈上被修改區(qū)塊之后的所有區(qū)塊Hash都需要重算并改寫:
全網(wǎng)認可
前面的修改成本就已經(jīng)很大了赡译,但是想要你的修改被全網(wǎng)認可,那么你需要擁有全網(wǎng)51%以上的算力才可能實現(xiàn)不铆。
挖礦
挖礦蝌焚,這個名詞用在軟件系統(tǒng)中似乎讓人有些摸不著頭腦。其實它是指按照比特幣特定規(guī)則計算出指定區(qū)塊的區(qū)塊Hash的過程誓斥,新的區(qū)塊只有在計算出區(qū)塊Hash才能放上鏈并被全網(wǎng)認可只洒。但是,這個過程跟挖礦有什么關(guān)系呢劳坑?為什么會被稱為“挖礦”呢毕谴?這得從區(qū)塊Hash的計算過程說起。
- 區(qū)塊頭結(jié)構(gòu)
之前為了便于理解距芬,區(qū)塊頭我只給出了[父區(qū)塊Hash]和[Merkle Hash],下面我們看一下完整的區(qū)塊頭結(jié)構(gòu):
-
難度目標和Nonce
我們已經(jīng)知道涝开,區(qū)塊Hash就是計算出的區(qū)塊頭的Hash。但是在比特幣的設(shè)計中人為的為區(qū)塊Hash的計算設(shè)置了難度框仔,使得區(qū)塊Hash必須通過千百萬次的反復計算才能得到舀武。只有了解了這個計算過程,才會對比特幣的不可篡改性有更清楚的了解离斩。-
難度目標银舱,其實是一個數(shù)值,把它轉(zhuǎn)換為16進制時跛梗,應該像下面這樣:
00000000000000000285ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
而我們計算出的區(qū)塊Hash往往是這樣:
c91c008c26e50763e9f548bb8b2fc323735f73577effbc55502c51eb4cc7cf2e
注意:這兩個數(shù)值長度相同寻馏,而難度目標是以17個0開始的,意味著它遠比前面這個區(qū)塊Hash要小茄袖,而難度目標的意思是操软,你算出的區(qū)塊Hash值必須小于難度目標。區(qū)塊頭中的各項數(shù)據(jù)的值都是固定的(除了Nonce)宪祥,而相同的數(shù)據(jù)只能得到同一個Hash,那么聰明的你可能已經(jīng)意識到聂薪,要使得區(qū)塊Hash變化家乘,就需要改變Nonce的值。 - Nonce藏澳,是一個計數(shù)器仁锯。我們不斷的變化Nonce,使得計算出的區(qū)塊Hash不斷變化翔悠,直到有一個區(qū)塊Hash小于難度目標业崖。想要得到一個以17個0開始的Hash值可能需要千萬次甚至億萬次的試錯,而要得到小于難度目標的值更是難上加難蓄愁。這就好像挖金礦一樣双炕,不斷挖不斷挖,直到挖出你想要的那粒金子來撮抓。
難度目標也不是一塵不變的妇斤,它會根據(jù)全網(wǎng)算力,將算出一個區(qū)塊Hash的平均時間控制在10分鐘左右丹拯。隨著時間推移站超,挖礦人數(shù)和計算機性能都會不斷的提高,為了把新區(qū)塊的產(chǎn)生時間控制在10分鐘左右乖酬,相應的挖礦難度也會不斷增加死相,也就是不斷減小難度目標,增加難度目標前面的0咬像。
-
難度目標银舱,其實是一個數(shù)值,把它轉(zhuǎn)換為16進制時跛梗,應該像下面這樣:
修改交易記錄的巨大成本+挖礦難度的限制算撮,想要篡改數(shù)據(jù)?呵呵县昂,你試試看……钮惠,:-)
礦工、挖礦獎勵及交易費
- 礦工
在區(qū)塊鏈中挖礦確實是會挖到“金子”的七芭,這“金子”就是挖礦獎勵和交易費。所以才會有那么那么多人爭先恐后的在區(qū)塊鏈上挖礦蔑赘,這些探礦的人被稱為礦工狸驳。
礦工工作是驗證每一筆新創(chuàng)建的交易記錄,并把它們打包進區(qū)塊缩赛,然后計算出符合難度目標的區(qū)塊Hash值耙箍。這個過程有所有礦工在同時進行的,第一個計算出區(qū)塊Hash礦工會將新區(qū)塊添加到區(qū)塊鏈上并全網(wǎng)廣播酥馍,同時也將獲得挖礦獎勵和交易費辩昆。 - 挖礦獎勵
系統(tǒng)獎勵給礦工的比特幣,這也是比特幣產(chǎn)生的來源旨袒,比特幣就是通過挖礦獎勵進入比特幣市場流通的汁针。
比特幣總量被限制為約2100萬個比特幣术辐,初始挖礦獎勵為每個區(qū)塊50個比特幣,以后每4年減半,現(xiàn)在(2018年施无,自2016始)挖礦獎勵為每個區(qū)塊12.5個比特幣辉词。最終所有比特幣發(fā)完后,礦工將只能通過交易費獲取收益猾骡。 - 交易費
相當于比特幣交易者給礦工的小費瑞躺,交易費高的交易記錄往往會被礦工優(yōu)先打包進區(qū)塊。交易費低的或者沒有交易費的會被推遲打包兴想,甚至有可能不會被打包幢哨,交易信息也就不會得到確認,也就意味著這筆交易不被認可嫂便。
重申
本文僅是面向于小白的對比特幣和區(qū)塊鏈基本概念和原理的小白化說明捞镰,很多描述并不嚴謹,如果你想了解更專業(yè)的相關(guān)知識顽悼,可以參考精通比特幣這本書曼振。