以下為金馬老師《精通比特幣》解讀的文稿整理。
第一章? 介紹
1.1? 什么是比特幣
(1)比特幣是一個(gè)區(qū)塊鏈實(shí)現(xiàn)
(2)比特幣是一種數(shù)字貨幣
1.2? 挖礦
不同于央行統(tǒng)一發(fā)行的人民幣,比特幣是通過挖礦產(chǎn)生的。挖礦其實(shí)就是解決一個(gè)數(shù)學(xué)問題,算得快的人得到新幣作為獎(jiǎng)勵(lì)。在這個(gè)過程中,每個(gè)曠工都用他的算力在驗(yàn)證和記錄交易。相當(dāng)于將央行貨幣發(fā)行和結(jié)算的任務(wù)分配給了每一個(gè)參加挖礦比賽的人,這就是“分布式”計(jì)算。
1.3 通貨緊縮貨幣
通貨膨脹的產(chǎn)生原因之一是政府超量地發(fā)行貨幣,這讓我們每個(gè)人手里的錢都會(huì)越來越不值錢。而比特幣的協(xié)議規(guī)定,新幣的開采速度每隔四年就會(huì)減半,總的來說比特幣總量不會(huì)超過2100萬枚,并將在2140年左右達(dá)到。比特幣的總量變化曲線如下圖:
所以,從長期來看,比特幣是通貨緊縮貨幣。持有比特幣是規(guī)避通貨膨脹的手段之一。我們看到越往后能挖出的比特幣會(huì)越少,挖礦成本越高。
1.4 去中心化
傳統(tǒng)貨幣系統(tǒng)的操作是“中心化”的,買賣東西總是通過銀行或大公司來收錢或付錢,否則就沒辦法建立信任。例如:我們?cè)谔詫毶腺I東西,需要先把錢付給阿里巴巴,等確認(rèn)收貨了,阿里巴巴再把錢給到商家。
比特幣的創(chuàng)新之處就在于完全去“中心化”,不依賴阿里巴巴這樣的中央權(quán)威。我可以直接把錢打給你,但也不怕你抵賴。因?yàn)樵诮灰装l(fā)生的時(shí)候,全網(wǎng)無數(shù)的賬本都會(huì)共同記錄下這筆交易,而這個(gè)同步的記錄過程就是分布式、去中心化的。
1.5 比特幣的四個(gè)創(chuàng)新點(diǎn)
(1)一個(gè)去中心化的點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò):我可以直接向你發(fā)錢,不用通過銀行或阿里巴巴等大公司。
(2)一個(gè)公共的交易賬本:所有的交易都被記錄在了全網(wǎng)共同維護(hù)的大漲本中,也就是大名鼎鼎的“區(qū)塊鏈”技術(shù)。
(3)一個(gè)去中心化的數(shù)學(xué)的和確定性的貨幣發(fā)行:世界各地的礦工們都在比賽解答數(shù)學(xué)題找?guī)牛瑤懦霈F(xiàn)的速度會(huì)越來越慢,總量是確定的。
(4)一個(gè)去中心化的交易驗(yàn)證系統(tǒng):不需要權(quán)威機(jī)構(gòu)就能互相“驗(yàn)明正身”。紙幣可能出現(xiàn)“造假”的情況,一張錢出現(xiàn)在不同的兩個(gè)地方。但比特幣通過數(shù)學(xué)驗(yàn)證機(jī)制,保證了不會(huì)出現(xiàn)這樣的“雙重支付“。
1.6 比特幣的客戶端
參與比特幣交易有兩種方式,一種是維護(hù)一個(gè)”完整客戶端“,自己保存所有的比特幣整個(gè)交易歷史,不依賴于其他的服務(wù)器和第三方服務(wù)。另外一種是普通用戶常用的"輕量級(jí)客戶端", 不保存完整歷史,而通過信賴的第三方服務(wù)器來獲取交易信息。大家通過okcoin、云幣網(wǎng)購買BTC就是這種形式。由于第三方介入是有風(fēng)險(xiǎn)的,即使比特幣的交易賬本是全網(wǎng)公開透明的,若選擇了不可靠的在線錢包服務(wù),可能會(huì)存在丟幣。所以大家一定要選擇有信用的靠譜的第三方交易客戶端。
1.7 使用比特幣客戶端
比特幣客戶端通常由一個(gè)錢包和多個(gè)比特幣地址組成。比特幣地址是可以公開的,任何人都可以通過這些地址轉(zhuǎn)錢到你的錢包。
地址地址大概長成這樣:1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK,或者是一個(gè)二維碼。發(fā)行比特幣只需要輸入地址和金額,收到的人會(huì)用私鑰(以下會(huì)介紹)簽名這筆交易,這就公告了全網(wǎng):比特幣從一個(gè)地址轉(zhuǎn)移到了另外一個(gè)地址。從交易完成到"確認(rèn)"大概需要10分鐘。因?yàn)榻灰醉氂蓵绻ら_采打包成區(qū)塊,這樣才會(huì)被全網(wǎng)接受為"已確認(rèn)"。
第二章? 比特幣的原理
2.1? 私鑰
比特幣的地址相當(dāng)于帶鎖的信箱,私鑰就好比這個(gè)鎖唯一的鑰匙。比特幣地址是公開的,每個(gè)人都可以往這個(gè)地址發(fā)錢,但只有握有“私鑰”的人才能打開用這個(gè)地址上鎖的比特幣。因?yàn)橹灰浪借€就可以取走你的比特幣,所以私鑰一定要好好保管。
2.2 比特幣交易過程
A給B付款0.1BTC的過程是這樣的:A將要付B的0.1BTC用B的”專屬地址“鎖起來,然后向全網(wǎng)發(fā)送,相當(dāng)于向所有人吼了一聲:“我向能打開這把鎖的人發(fā)送了0.1BTC”。B在網(wǎng)絡(luò)中會(huì)馬上收到這條信息,于是拿出私鑰試試能不能打開這把鎖。因?yàn)橹挥蠦錢包里的私鑰才可以匹配這個(gè)地址,所以只有B能兌換這筆錢。
2.3 將交易記錄在總賬本中
交易信息必須要被傳送到比特幣網(wǎng)絡(luò)中,成為總賬本的一部分,這個(gè)賬本叫做區(qū)塊鏈。一個(gè)“區(qū)塊”里面記錄了一段時(shí)間內(nèi)的所有交易信息,“鏈”則是因?yàn)樗袣v史數(shù)據(jù)塊會(huì)一個(gè)個(gè)串聯(lián)起來。
(1) 全網(wǎng)傳播
比特幣的賬本是分布式的,網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)都在幫助記賬。A給B付款0.1BTC的時(shí)候,只需要向身邊的節(jié)點(diǎn)大吼一聲,收到信息的節(jié)點(diǎn)又迅速向自己的鄰居發(fā)送這個(gè)消息。一傳十十傳百,只要幾秒鐘就能傳遍整個(gè)網(wǎng)絡(luò)。現(xiàn)在,所有人都知道“A給B付款0.1BTC”。
(2)挖礦驗(yàn)證
這個(gè)交易在比特幣網(wǎng)絡(luò)上傳播開來,但只有被曠工們“挖礦”驗(yàn)證并加到一個(gè)新區(qū)塊里,這個(gè)交易才會(huì)成為總賬本的一部分。
2.4 挖礦
挖礦的過程是將過去一段時(shí)間的交易記錄打包成一個(gè)區(qū)塊,這個(gè)過程也會(huì)創(chuàng)造新比特幣。
挖礦其實(shí)可以想象成很多人一起來找“數(shù)獨(dú)”游戲的解(9x9的數(shù)獨(dú)就是要求每行每列每個(gè)對(duì)角線都有1-9),礦工們解題的辦法就是笨笨地不斷去試,沒有更快的方法,只能比誰試得更快運(yùn)氣更好。數(shù)獨(dú)游戲的難度可以通過改變行列大小來調(diào)整。想象一下求解一個(gè)幾千乘幾千的數(shù)獨(dú),確實(shí)有難度。但是,如果給你一個(gè)已經(jīng)填好的數(shù)獨(dú),你就可以很快驗(yàn)證這個(gè)解是否有效(檢查每行每列有沒有重復(fù)的數(shù))。“解起來困難而驗(yàn)證容易”就是比特幣解謎游戲的最大特點(diǎn)。當(dāng)然,真實(shí)的比特幣謎題其實(shí)是基于哈希加密算法,我們以后還會(huì)更詳細(xì)地談到。一筆交易需要通過解題構(gòu)建區(qū)塊來證明它有效,礦工們都在齊心協(xié)力地為這個(gè)區(qū)塊貢獻(xiàn)計(jì)算量。計(jì)算量越多意味著更多的人信任這筆交易是有效的。
2.5 礦池
礦池就是曠工們組隊(duì)解題,贏了就按工作量分配收貨的比特幣。在這個(gè)時(shí)代,單打獨(dú)斗已經(jīng)很難做成一件事了,挖礦也一樣。
2.6 區(qū)塊鏈
區(qū)塊鏈就是一個(gè)個(gè)區(qū)塊鏈起來。區(qū)塊一個(gè)接一個(gè)產(chǎn)生,當(dāng)前區(qū)塊的產(chǎn)生基于前一個(gè)區(qū)塊,所以每次解當(dāng)前的區(qū)塊都會(huì)為之前的交易增加一次證明,也就在網(wǎng)絡(luò)中得到了更多的信任。隨著鏈的增長,計(jì)算復(fù)雜度不斷增加,以往的區(qū)塊也就越來越難以刪改(一個(gè)區(qū)塊獲得6次以上證明就基本不可能撤銷了)。所以驗(yàn)證一個(gè)交易簡單有效的手段就是確定這個(gè)交易在區(qū)塊鏈中,后面有幾個(gè)新的區(qū)塊。此外我們可以通過區(qū)塊鏈順藤摸瓜追溯每一筆歷史交易,這就保證了比特幣的來源都是清晰有記錄的。
第三章? 比特幣客戶端
3.1? 完整客戶端
自己維護(hù)一個(gè)全節(jié)點(diǎn)客戶端的成本比較高,但是可以保證你的錢包是安全的。如果你有幾千個(gè)甚至幾萬個(gè)比特幣,可以考慮用這種方式來實(shí)現(xiàn)安全存儲(chǔ)。從bitcoin.org下載的客戶端包含了比特幣系統(tǒng)的所有方面,是一個(gè)獨(dú)立的完整節(jié)點(diǎn)。但是正因?yàn)榘怂袣v史數(shù)據(jù),下載整個(gè)區(qū)塊鏈可能就需要好幾天,請(qǐng)確保你有足夠的容量的硬盤、帶寬和時(shí)間。
3.2 編譯比特幣源碼
對(duì)于開發(fā)者,可以從GitHub上的比特幣頁面 https://github.com/bitcoin/bitcoin 下載代碼自行編譯,從終端運(yùn)行bitcoind,也需要下載所有區(qū)塊。在書里面一步步教授了比特幣核心的JSON_RPC API接口的使用,包括以下技能點(diǎn):
(1) 獲取比特幣核心客戶端狀態(tài)信息
(2) 錢包設(shè)置及加密
(3) 錢包備份、純文本導(dǎo)出和恢復(fù)
(4) 錢包地址及接收交易
(5) 查看區(qū)塊信息
(6) 基于UTXO(未花費(fèi)的交易輸出)的建立、簽名與提交
第四章? 密鑰、地址、錢包
4.1? 密鑰
比特幣交易需要用有效的“數(shù)字密鑰”產(chǎn)生的簽名認(rèn)證。密鑰是成對(duì)出現(xiàn)的,由一個(gè)“私鑰”和一個(gè)“公鑰”所組成。公鑰就像銀行的帳號(hào),而私鑰就像控制賬戶的PIN碼或支票的簽名。公鑰用來接收比特幣,私鑰用來對(duì)收到的比特幣進(jìn)行簽名。公鑰可以由私鑰唯一產(chǎn)生,但是知道公鑰卻不能反向推導(dǎo)出私鑰,這就保證了比特幣的安全性。 如果你知道一點(diǎn)密碼學(xué)的知識(shí),這就是非對(duì)稱加密。
4.2? 地址
比特幣的地址是通過賬戶主人的公鑰產(chǎn)生的,只需要把比特幣地址告訴其他人,別人就可以給你轉(zhuǎn)賬。
4.3 私鑰、公鑰、比特幣地址之間的關(guān)系
從私鑰可以唯一生成公鑰,公鑰可以生成比特幣地址。但反向都是解不出來。私鑰必須始終保持機(jī)密,丟了私鑰就相當(dāng)于丟了比特幣。
4.4? 錢包和助記詞
由于完全無規(guī)律的密鑰對(duì)不便于維護(hù)和記憶,現(xiàn)在的錢包多是從一個(gè)“種子”出發(fā)生成許多關(guān)鍵的鑰匙。如圖所示,子子孫孫地繁衍出新的密鑰。種子可以是隨機(jī)生成的數(shù)字,也可以用助記詞來生成。單詞的順序就是錢包的備份,可以用來恢復(fù)或重新創(chuàng)造新的錢包的鑰匙。助記詞可以讓人們更容易抄寫和儲(chǔ)存。這里要提醒的是,由于知道了助記詞就能重新創(chuàng)建種子恢復(fù)錢包,助記詞一定要妥善保管。不少人使用imtoken的時(shí)候給助記詞截了圖,導(dǎo)致錢包信息泄露。切記切記不要截圖,最好是抄寫下來。
4.5? 橢圓曲線加密(從私鑰到公鑰)
通過橢圓曲線加密算法,可以從私鑰計(jì)算得到公鑰,這是不可逆轉(zhuǎn)的過程:K = k * G 。其中k是私鑰,G是被稱為生成點(diǎn)的常數(shù)點(diǎn),而K是所得公鑰。我們用一個(gè)例子來理解橢圓曲線加密:
小明就讀于小學(xué)二年級(jí),會(huì)計(jì)算加法,但是不會(huì)計(jì)算除法。
你:“小明小明,過來,叔叔問你,1+1等于幾?”
明:“等于2。”
你:“那考你個(gè)難的,7+7等于幾?”
明:“切,等于14唄。”
你:“行,那叔叔再問你,幾個(gè)7相加等于56?”
明:“……”,默默掏出草稿紙、鉛筆、手指頭、腳趾頭,進(jìn)行了10分鐘的深度計(jì)算:2個(gè)7等于14,3個(gè)7等于21,4個(gè)7等于28……。“叔叔,我算出來了,是8個(gè),對(duì)不對(duì)?”
你:“好小子,叔叔就不信考不倒你。幾個(gè)7相加等于8***92?” 你心中默念,以小明的計(jì)算能力,要算到這個(gè)數(shù)恐怕得一年半載的。
明:“叔叔好厲害呀,我算不出來。”
對(duì)于橢圓曲線密碼來說,固定的生成點(diǎn)G就是例子里面的7;私鑰k就是例子里面的8,也就是對(duì)G進(jìn)行加法的次數(shù)(G+G+...+G = k*G);公鑰K是得到的結(jié)果(56和8**-*92)
和上面的例子不同的是,橢圓曲線密碼中的“加法”是建立在“有限域上的二元三次曲線的點(diǎn)”上的。具體的說,這個(gè)加法可以表現(xiàn)為以下兩個(gè)圖。將兩個(gè)點(diǎn)連線之后求曲線交點(diǎn)關(guān)于x軸的對(duì)稱點(diǎn)。圖a是兩個(gè)不同的點(diǎn)相加,圖b是兩個(gè)相同的點(diǎn)相加。
這個(gè)加法有兩個(gè)很重要的特點(diǎn):
(1)正向計(jì)算(從私鑰計(jì)算公鑰)很簡單。
(2)逆向計(jì)算(從公鑰反推私鑰)很困難。從公鑰反推私鑰只能像例子中的小明一樣用傻瓜窮舉法,以目前的計(jì)算能力,攻破橢圓曲
線是不現(xiàn)實(shí)的。
看個(gè)例子理解一下為什么正推容易,反推難:
橢圓曲線加密公式:K=k*G。
正推:已知k,G,求k*G。
反推:已知K,G,求k。
先看反推,反推只能用最傻瓜的窮舉法,比如k=10。
G==K?[No]
G+G=2G==K?[No]
2G+G=3G==K?[No]
3G+G=4G==K?[No]
4G+G=5G==K?[No]
5G+G=6G==K?[No]
6G+G=7G==K?[No]
7G+G=8G==K?[No]
8G+G=9G==K?[No]
9G+G=10G==K?[Yes]
花了10步找到答案, k=10。
再看正推。
已經(jīng)知道k=10。
G+G=2G
2G+2G=4G
4G+4G=8G
8G+2G=10G=K
四步就找到答案。
4.6? 哈希函數(shù)(從公鑰到比特幣地址)
比特幣地址是由公鑰經(jīng)過單向的哈希函數(shù)生成的。哈希(Hash)是一種數(shù)據(jù)編碼方式,將大尺寸的數(shù)據(jù)(如一句話,一張圖片,一段音樂、一個(gè)視頻等)濃縮到一個(gè)數(shù)字中,從而方便地實(shí)現(xiàn)數(shù)據(jù)匹配、查找的功能。
比如這里有一萬首歌,給你一首新的歌X,要求你確認(rèn)X是否在那一萬首歌之內(nèi)。將一萬首歌每一個(gè)音符和X比對(duì)非常慢。那么,我們可以將每一首的數(shù)據(jù)濃縮到一個(gè)數(shù)字指紋上(稱為哈希碼),得到一萬個(gè)數(shù)字,再將X的數(shù)字指紋和這一萬個(gè)數(shù)字比對(duì),就能知道X是否在那一萬首歌中。顯然,有可能多首歌的哈希碼是同一個(gè)。好的哈希算法會(huì)盡量減少這種沖突,讓不同的歌有不同的哈希碼。就算真有極小概率出現(xiàn)不同的歌有相同的哈希碼,那也只有寥寥幾首歌,此時(shí)再一首首比對(duì)即可。
作為例子,如果要你要哈希那一萬首歌,一個(gè)簡單算法就是讓歌曲所占硬盤的字節(jié)數(shù)作為哈希碼。這樣的話,你可以讓一萬首歌“按照大小排序”,然后遇到一首新的歌,只要看看新的歌的字節(jié)數(shù)是否和已有的一萬首歌中的某一首的字節(jié)數(shù)相同,就知道新的歌是否在那一萬首歌之內(nèi)了。
再說一個(gè)題外話,我是一名程序員,我?guī)状蚊嬖嚩贾兴惴}都被考到了 Hash 的實(shí)現(xiàn)。所以,如果你也是一名程序員,一定要了解 Hash。
第五章? ? 交易
5.1? 比特幣交易的生命周期
5.2 交易在全網(wǎng)的傳播
每個(gè)比特幣節(jié)點(diǎn)都和一些其他節(jié)點(diǎn)相連,形成一個(gè)巨大的網(wǎng)狀結(jié)構(gòu)。每個(gè)節(jié)點(diǎn)收到交易之后都會(huì)進(jìn)行驗(yàn)證,如果有效就傳播到其他節(jié)點(diǎn),如果無效就拒絕并返回。一筆有效的交易在幾秒鐘能就會(huì)傳遍全網(wǎng)。
比特幣網(wǎng)絡(luò)有以下特點(diǎn):
(1)沒有中心,所有節(jié)點(diǎn)的地位都是同等的
(2)傳播靈活高效,能夠抵御攻擊。
(3)每個(gè)節(jié)點(diǎn)在傳播交易之前都會(huì)獨(dú)立驗(yàn)證,增加可靠性
5.3? UTXO
這個(gè)概念很重要,對(duì)你的理解很有幫助,要認(rèn)真理解。比特幣交易的基本單位是UTXO(未花費(fèi)過的一個(gè)交易輸出)。在比特幣的世界里既沒有賬戶,也沒有余額,只有分散到區(qū)塊鏈里的UTXO。
要理解UTXO,我們假設(shè)一個(gè)這樣的場景:張三挖到12.5 枚比特幣。過了幾天,他把其中 2.5 枚支付給李四。又過了幾天,他和李四各出資 2.5 比特幣湊成 5 比特幣付給王五。如果是基于賬戶的設(shè)計(jì),張、李、王三人在數(shù)據(jù)庫中各有一個(gè)賬戶,則他們?nèi)说馁~戶變化如下圖所示:
我們正常理解,應(yīng)該是按照上面的圖。但在比特幣中,這個(gè)過程是通過UTXO實(shí)現(xiàn)的,圖示如下:
看圖你會(huì)發(fā)現(xiàn),上一筆交易的輸出是下一筆交易的輸入,形成一條交易鏈。在一筆交易中,被交易消耗的UTXO被稱為交易輸入,由交易創(chuàng)建的UTXO被稱為交易輸出。比特幣錢包通過掃描區(qū)塊鏈并聚合所有屬于該用戶的UTXO來計(jì)算該用戶的余額。當(dāng)用戶付款時(shí),他的錢包通過選擇可用的UTXO來構(gòu)造一筆交易。一旦UTXO被選中,錢包會(huì)為它生成包含簽名的解鎖腳本,相當(dāng)于把錢柜打開取錢出來支付。
5.4? 交易費(fèi)
大多數(shù)交易都需要支付交易費(fèi),作為對(duì)辛勤工作的比特幣礦工們的勞動(dòng)費(fèi)。交易費(fèi)可當(dāng)做礦工們確認(rèn)區(qū)塊的獎(jiǎng)勵(lì),交易費(fèi)的多少會(huì)影響處理的優(yōu)先級(jí),有足夠費(fèi)用的交易會(huì)更早被包含在下一個(gè)挖出的區(qū)塊中,也就更早得到確認(rèn)和驗(yàn)證。交易費(fèi)大多數(shù)情況下都是由錢包程序替你自動(dòng)計(jì)算出來的。
5.5 交易驗(yàn)證:UTXO的鎖定與解鎖
比特幣的交易驗(yàn)證引擎依賴于兩類腳本來驗(yàn)證比特幣交易:一個(gè)鎖定腳本和一個(gè)解鎖腳本。
(1)鎖定腳本:A給B的比特幣地址付款時(shí),A會(huì)輸出一個(gè)UTXO,用含有B地址的鎖定腳本給這個(gè)輸出的UTXO上鎖,相當(dāng)于告訴大
家:花這筆錢的條件是能打開這個(gè)鎖。
(2)解鎖腳本:B要使用UTXO來付款時(shí),需要用解鎖腳本證明自己能把之前A上的鎖打開,說明自己滿足花這筆錢的條件。解鎖腳本
包含一個(gè)用B的私鑰生成的有效簽名。
(3)交易驗(yàn)證:每一個(gè)比特幣客戶端都會(huì)同時(shí)執(zhí)行鎖定腳本和解鎖腳本來驗(yàn)證這一筆交易。只有一筆有效的交易才會(huì)導(dǎo)致UTXO被標(biāo)記為“已使用”,然后從有效的(未使用)UTXO集中所移除。
以上,是前五章的關(guān)鍵知識(shí)點(diǎn)。
第六章: 比特幣網(wǎng)絡(luò)
最少必要知識(shí): 協(xié)議、節(jié)點(diǎn)。
協(xié)議:協(xié)議是計(jì)算機(jī)領(lǐng)域的專業(yè)術(shù)語,英文單詞是:protocol。 計(jì)算機(jī)領(lǐng)域有很多協(xié)議,比如最常見的網(wǎng)絡(luò)協(xié)議:http協(xié)議。我們可以把協(xié)議理解為大家一起制定的并且共同承認(rèn)、共同遵守的文件。也可以看成是我們生活中常見的合同或者協(xié)議。協(xié)議的內(nèi)容是可以擴(kuò)展的,只要遵守協(xié)議的人都認(rèn)可添加的協(xié)議內(nèi)容就好。
節(jié)點(diǎn):節(jié)點(diǎn)一般是指計(jì)算機(jī)網(wǎng)絡(luò)里面的單個(gè)計(jì)算機(jī)或者網(wǎng)絡(luò)設(shè)備。每個(gè)節(jié)點(diǎn)的功能可能各不相同,但在網(wǎng)絡(luò)中是一個(gè)一個(gè)獨(dú)立且相互連接的個(gè)體。在比特幣網(wǎng)絡(luò)里面,我們常常說的節(jié)點(diǎn),往往是帶有比特幣客戶端的計(jì)算機(jī)或者網(wǎng)絡(luò)設(shè)備。
6.1 P2P網(wǎng)絡(luò)架構(gòu)
看到P2P,不知道你是不是想到了金融界的P2P貸款和放貸。P2P的英文全稱是:peer to peer。翻譯過來就是:點(diǎn)對(duì)點(diǎn)。所以任何點(diǎn)對(duì)點(diǎn)的關(guān)系,都可以使用P2P這個(gè)概念。
比特幣網(wǎng)絡(luò)的結(jié)構(gòu)使用的就是:P2P網(wǎng)絡(luò)架構(gòu)。P2P的含義是指:位于比特幣網(wǎng)絡(luò)中的每一臺(tái)計(jì)算機(jī)都彼此對(duì)等,每個(gè)節(jié)點(diǎn)共同提供網(wǎng)絡(luò)服務(wù),不存在任何“特殊”節(jié)點(diǎn)。重點(diǎn)在于,每個(gè)節(jié)點(diǎn)都是完全平等的。每個(gè)節(jié)點(diǎn)對(duì)外提供服務(wù),同時(shí)使用其他節(jié)點(diǎn)提供的服務(wù)。如果說人人生而平等是一件需要努力的事情,比特幣網(wǎng)絡(luò)上的節(jié)點(diǎn),天生就是點(diǎn)點(diǎn)生而平等而不需要努力的。
比特幣網(wǎng)絡(luò)就是指按照比特幣P2P協(xié)議運(yùn)行的一些列節(jié)點(diǎn)的集合。下圖,可以清晰的表示每臺(tái)計(jì)算機(jī)節(jié)點(diǎn)的對(duì)等關(guān)系:
6.2? 節(jié)點(diǎn)類型及分工
盡管每個(gè)節(jié)點(diǎn)的價(jià)值或者說地位是完全平等的,但是他們的功能確實(shí)有差異的,每種節(jié)點(diǎn)擁有不同的分工。一個(gè)全節(jié)點(diǎn)包括四個(gè)功能:
“每個(gè)節(jié)點(diǎn)都參與全網(wǎng)絡(luò)的路由功能,同時(shí)也可能包含其他功能。每個(gè)節(jié)點(diǎn)都參與驗(yàn)證并傳播交易及區(qū)塊信息,發(fā)現(xiàn)并維持與對(duì)等網(wǎng)絡(luò)的連接。”這里說的路由功能,其實(shí)就是指,每個(gè)節(jié)點(diǎn)都會(huì)主動(dòng)連接各自的令居節(jié)點(diǎn),從而為整個(gè)網(wǎng)絡(luò)服務(wù)。四個(gè)功能任意組合,就會(huì)出現(xiàn)不同的節(jié)點(diǎn)。也就是說,很多節(jié)點(diǎn)并不是全節(jié)點(diǎn),比如我們常說的錢包,就不具備全節(jié)點(diǎn)的所有功能。
6.3 擴(kuò)展比特幣網(wǎng)絡(luò)
比特幣網(wǎng)絡(luò),本身是遵守比特幣協(xié)議的各個(gè)節(jié)點(diǎn)的組合。但是比特幣協(xié)議本身有些功能是無法實(shí)現(xiàn)的,比如,挖礦和錢包功能。需要實(shí)現(xiàn)功能的話就需要去擴(kuò)展比特幣的網(wǎng)絡(luò)協(xié)議了。比如:許多連接到比特幣網(wǎng)絡(luò)的大型公司運(yùn)行著基于Bitcoin核心客戶端的全節(jié)點(diǎn)客戶端,它們具有區(qū)塊鏈的完整拷貝及網(wǎng)絡(luò)節(jié)點(diǎn),但不具備挖礦及錢包功能。這些網(wǎng)絡(luò)公司為了擁有這些功能,會(huì)在原有的比特幣網(wǎng)絡(luò)協(xié)議上,增加一些用于增加上述功能的特殊協(xié)議。擴(kuò)展之后的比特幣網(wǎng)絡(luò),它包括了多種類型的節(jié)點(diǎn)、網(wǎng)關(guān)服務(wù)器、邊緣路由器、錢包客戶端以及它們相互連接所需的各類協(xié)議。這些擴(kuò)展協(xié)議的存在,使得整個(gè)比特幣網(wǎng)絡(luò)擁有了更多的功能。
6.4 網(wǎng)絡(luò)發(fā)現(xiàn)
比特幣網(wǎng)絡(luò)里面的節(jié)點(diǎn)是存在于復(fù)雜的網(wǎng)絡(luò)之中的。每一個(gè)新的節(jié)點(diǎn)出現(xiàn)之后,為了可以和整個(gè)區(qū)塊鏈網(wǎng)絡(luò)里面的節(jié)點(diǎn)進(jìn)行協(xié)作,這個(gè)節(jié)點(diǎn)就必須主動(dòng)去和已經(jīng)存在的節(jié)點(diǎn)產(chǎn)生聯(lián)系。這樣才能加入到比特幣網(wǎng)絡(luò)的大家庭里面。這個(gè)新節(jié)點(diǎn)與已有節(jié)點(diǎn)建立聯(lián)系的過程,稱作:網(wǎng)絡(luò)發(fā)現(xiàn)。這個(gè)發(fā)現(xiàn)的目的是:找到自己的對(duì)等節(jié)點(diǎn)。網(wǎng)絡(luò)發(fā)現(xiàn)的過程,我們可以類比成:搬家之后找鄰居。(家庭住址就是IP地址)。下面我們就看看,新節(jié)點(diǎn)到底是如何找到自己的對(duì)應(yīng)節(jié)點(diǎn)并產(chǎn)生聯(lián)系的。
區(qū)塊鏈里面網(wǎng)絡(luò)節(jié)點(diǎn)眾多,新節(jié)點(diǎn)剛開始找鄰居的時(shí)候,是很難一下子就找到自己的對(duì)等節(jié)點(diǎn)的。為了提高網(wǎng)絡(luò)發(fā)現(xiàn)的效率,在整個(gè)網(wǎng)絡(luò)里面存在一類特殊的節(jié)點(diǎn),這類節(jié)點(diǎn)稱作:種子節(jié)點(diǎn)。如果把新節(jié)點(diǎn)找到對(duì)應(yīng)節(jié)點(diǎn)的過程是搬家找鄰居,那么種子節(jié)點(diǎn)就是你要去的那個(gè)小區(qū)的居委會(huì)大媽。作為居委會(huì)大媽的種子節(jié)點(diǎn)的手里,擁有大把的小區(qū)鄰居的信息。作為新節(jié)點(diǎn)的你把你的基本信息給了種子節(jié)點(diǎn),作為居委會(huì)大媽的種子節(jié)點(diǎn)會(huì)努力的幫你尋找可以與你對(duì)應(yīng)的鄰居節(jié)點(diǎn)。當(dāng)你找到了對(duì)應(yīng)的鄰居節(jié)點(diǎn)的時(shí)候,大媽就不會(huì)管你了。
下一步就是你自己和鄰居產(chǎn)生更深的聯(lián)系。你會(huì)把自己的地址信息(也就是IP地址)主動(dòng)發(fā)送給鄰居節(jié)點(diǎn)。你的鄰居節(jié)點(diǎn)又是一個(gè)熱心腸的好心人,他會(huì)主動(dòng)把你的地址信息,分享給他的鄰居節(jié)點(diǎn)。你鄰居的鄰居,也會(huì)是一個(gè)好心人,會(huì)主動(dòng)幫你把你的地址信息再次傳遞給他的鄰居。這樣的過程循環(huán)往復(fù)。最終整個(gè)小區(qū)的人都會(huì)知道你的地址信息,找到你就會(huì)很容易。另外,你還可以向你的鄰居節(jié)點(diǎn)發(fā)送請(qǐng)求,獲取你鄰居所知道的其他鄰居節(jié)點(diǎn)的地址信息。這樣一來,作為新節(jié)點(diǎn)的你,全網(wǎng)的節(jié)點(diǎn)都會(huì)知道你的地址,你也知道了全網(wǎng)每個(gè)節(jié)點(diǎn)的地址。到這里,你完全可以找到與你對(duì)等的節(jié)點(diǎn)了,完成網(wǎng)絡(luò)發(fā)現(xiàn)的目標(biāo)。
最后會(huì)有一種特殊情況,那就是:節(jié)點(diǎn)和整個(gè)比特幣網(wǎng)絡(luò)失去聯(lián)系,也就是離開了網(wǎng)絡(luò)。比如,你做一段時(shí)間曠工,突然不想做了,也就是離開了整個(gè)比特幣網(wǎng)絡(luò)。每個(gè)節(jié)點(diǎn)都有隨時(shí)加入和離開網(wǎng)絡(luò)的自由,就好像你在一個(gè)小區(qū)居住,只要你是想搬家,隨時(shí)都是可以搬家的。在這種情況下,節(jié)點(diǎn)之間的通訊地址通常是不可靠。所以,比特幣網(wǎng)絡(luò)發(fā)明自己的一套機(jī)制來處理這種情況。比特幣網(wǎng)絡(luò)里面每個(gè)節(jié)點(diǎn)必須不斷地做兩件事:在失去已有的鄰居節(jié)點(diǎn)的時(shí)候發(fā)現(xiàn)新的鄰居節(jié)點(diǎn),找到新的鄰居節(jié)點(diǎn)的時(shí)候主動(dòng)提供幫助。
注意:上面的網(wǎng)絡(luò)發(fā)現(xiàn)其實(shí)就是節(jié)點(diǎn)之間主動(dòng)幫忙的結(jié)果。
下面要講講節(jié)點(diǎn)是怎么知道自己的鄰居節(jié)點(diǎn)是否搬家的。
原來,在節(jié)點(diǎn)與節(jié)點(diǎn)之間是需要定期發(fā)送信息來維持連接的。和人類似,如果長期不給一個(gè)朋友打電話或者網(wǎng)絡(luò)聊天,你會(huì)覺得這個(gè)朋友已經(jīng)離開了你的朋友圈。節(jié)點(diǎn)之間,也是如此。如果兩個(gè)節(jié)點(diǎn)之間持續(xù)90分鐘,沒有發(fā)送消息了,節(jié)點(diǎn)的任何一方都可以認(rèn)定自己的鄰居節(jié)點(diǎn)已經(jīng)從網(wǎng)絡(luò)里面斷開了,這個(gè)時(shí)候,就可以去尋找新的鄰居節(jié)點(diǎn)了。這樣的機(jī)制,保證了整個(gè)比特幣網(wǎng)絡(luò)可以自己動(dòng)態(tài)調(diào)整節(jié)點(diǎn)規(guī)模的增減。
6.5 全節(jié)點(diǎn)
保有一份完整的、最新的區(qū)塊鏈拷貝的節(jié)點(diǎn),我們把它稱作全節(jié)點(diǎn)。全節(jié)點(diǎn)可以獨(dú)立地進(jìn)行建立并校驗(yàn)整個(gè)區(qū)塊鏈,也就是從第一快創(chuàng)世區(qū)塊一直建立到網(wǎng)絡(luò)中最新的區(qū)塊的整個(gè)比特幣網(wǎng)絡(luò)。由于全節(jié)點(diǎn)擁有完整的拷貝,所以全節(jié)點(diǎn)“不需借助或信任其他系統(tǒng)即可獨(dú)立地對(duì)所有交易信息進(jìn)行驗(yàn)證”。由于全節(jié)點(diǎn)包含整個(gè)區(qū)塊鏈的完整信息。你的計(jì)算機(jī)上想擁有一個(gè)全節(jié)點(diǎn),你的硬盤至少需要20G的存儲(chǔ)空間。
6.6 交換“庫存清單”
庫存清單在這里其實(shí)是一個(gè)比喻的說法。意思是指,每個(gè)節(jié)點(diǎn)里面都會(huì)存儲(chǔ)一份與自己相連接的節(jié)點(diǎn)的名單。當(dāng)網(wǎng)絡(luò)里面的兩個(gè)節(jié)點(diǎn)需要建立連接的時(shí)候,這兩個(gè)節(jié)點(diǎn)會(huì)互相交換各自所存儲(chǔ)的節(jié)點(diǎn)清單信息,這樣可以保證,一個(gè)新的全節(jié)點(diǎn)可以構(gòu)建完整的區(qū)塊鏈信息。
其實(shí)你可以這樣理解:你是一個(gè)班級(jí)的班主任,你想快速認(rèn)識(shí)班上的所有新同學(xué),想要和所有新同學(xué)建立連接。與班主任最先建立聯(lián)系的往往會(huì)是班長,只要班長給你提供一份班級(jí)同學(xué)名單,你就自然和班上所有同學(xué)建立聯(lián)系。作為班主任的你,也可以把其他老師的名單給同學(xué)。這個(gè)過程其實(shí)就是交換庫存清單的過程。
6.7 SPV簡易支付驗(yàn)證節(jié)點(diǎn)
上門說過,只有全節(jié)點(diǎn)擁有完整的全網(wǎng)區(qū)塊鏈的拷貝,也只有全節(jié)點(diǎn)具備獨(dú)立驗(yàn)證的能力。很多節(jié)點(diǎn),是沒有全節(jié)點(diǎn)獨(dú)立驗(yàn)證的能力。所以會(huì)采用一種叫做 SPV的驗(yàn)證方式。采用SPV方式的節(jié)點(diǎn),叫做 SPV節(jié)點(diǎn)。SPV節(jié)點(diǎn),不會(huì)去下載所有的區(qū)塊鏈新,而只是去下載每個(gè)區(qū)塊的頭部信息。通俗的說,就是每個(gè)區(qū)塊之間的關(guān)聯(lián)信息(即區(qū)塊頭部的信息)。SPV的驗(yàn)證方式,是通過參考交易在區(qū)塊鏈的深度,而不是高度,來驗(yàn)證交易的。簡單來說,檢查一個(gè)區(qū)塊的上面是否疊加了6個(gè)區(qū)塊。如果有,證明這個(gè)交易是確實(shí)發(fā)生的。這里可能暫時(shí)不太好理解,在后面看完區(qū)塊鏈的具體結(jié)構(gòu)之后,你會(huì)更容易理解區(qū)塊鏈深度的含義。
第七章? 區(qū)塊鏈
最少必要知識(shí):區(qū)塊 + 鏈
區(qū)塊,是區(qū)塊鏈最基本的組成單位。每一個(gè)區(qū)塊里面包含著眾多的交易信息,也包含一些與相鄰區(qū)塊聯(lián)系的信息。你可以簡單的把區(qū)塊看做是一個(gè)賬本,這個(gè)賬本里包含著許多交易信息。
鏈,在區(qū)塊鏈里面是一個(gè)比喻的說法。鏈條關(guān)系是一種很穩(wěn)固的關(guān)系,表示前后十分緊密。在區(qū)塊鏈里面每個(gè)區(qū)塊都是前后連接的。
7.1 區(qū)塊鏈
區(qū)塊鏈的字面意思是:由包含信息的區(qū)塊從后向前有序鏈接起來的數(shù)據(jù)結(jié)構(gòu)。區(qū)塊鏈說起來是一個(gè)鏈條,但整個(gè)的區(qū)塊鏈網(wǎng)絡(luò),并不是一個(gè)首尾相連的環(huán)形鏈條,而是一條斷開的鏈條。為了更好的理解區(qū)塊鏈,我們可以把區(qū)塊鏈看成是一根垂直的鏈條。最低的區(qū)塊,稱作是創(chuàng)世區(qū)塊。區(qū)塊鏈里面的高度,指的就是頂部區(qū)塊與創(chuàng)世區(qū)塊之間的距離;頂部區(qū)塊,表示最新加入到區(qū)塊鏈的區(qū)塊,也就是離創(chuàng)世區(qū)塊最遠(yuǎn)的區(qū)塊。上面提到的SPV的驗(yàn)證方式,看的是區(qū)塊所在的深度。
其實(shí),就是從垂直的角度來看,這個(gè)區(qū)塊在從高到低的順序上有多少個(gè)區(qū)塊疊加在自己身上。只要自己的深度,超過6個(gè)(也就是在自己的上面疊加了6個(gè)區(qū)塊),就可以說明自己的所帶的交易信息是驗(yàn)證通過的。“從上往下看,超過六塊后,區(qū)塊在區(qū)塊鏈中的位置越深,被改變的可能性就越小。在100個(gè)區(qū)塊以后,區(qū)塊鏈已經(jīng)足夠穩(wěn)定,這時(shí)Coinbase交易(包含新挖出的比特幣的交易)可以被支付。幾千個(gè)區(qū)塊(一個(gè)月)后的區(qū)塊鏈將變成確定的歷史,永遠(yuǎn)不會(huì)改變。”
7.2 區(qū)塊結(jié)構(gòu)
單個(gè)區(qū)塊的具體結(jié)構(gòu),也就是單個(gè)賬本的內(nèi)部結(jié)構(gòu)。單個(gè)區(qū)塊是有兩個(gè)部分組成的:一個(gè)是區(qū)塊頭,一個(gè)是區(qū)塊主體。區(qū)塊頭里面由三組元數(shù)據(jù)組成:父區(qū)塊的哈希值、挖礦競爭相關(guān)數(shù)據(jù)、merkle 樹根(所有交易信息的數(shù)據(jù)結(jié)構(gòu))。
7.3 區(qū)塊頭標(biāo)識(shí)符
每一個(gè)區(qū)塊都有自己的標(biāo)識(shí)符,使自己易于查找和辨別。
第一種,識(shí)別方式是:區(qū)塊頭哈希值。
相當(dāng)于是每個(gè)區(qū)塊的唯一的:身份證號(hào)碼。通過SHA256 加密算法 對(duì)區(qū)塊頭里面的信息進(jìn)行計(jì)算,就可以得到一個(gè)區(qū)塊頭的唯一哈希值。整個(gè)比特幣網(wǎng)絡(luò)里面的區(qū)塊,都有自己唯一的哈希值。這個(gè)哈希值,自己的區(qū)塊是沒有存儲(chǔ)的。整個(gè)網(wǎng)絡(luò)會(huì)有專門的地方存儲(chǔ)。就好像,你雖然辦了身份證,但是身份證信息是放在派出所保管的。
第二種,識(shí)別方式是:區(qū)塊鏈的高度。
相當(dāng)于區(qū)塊所住的樓層高度。但與區(qū)塊頭哈希值不同的是,區(qū)塊的高度,不是一個(gè)區(qū)塊的唯一標(biāo)識(shí)符。因?yàn)榇嬖趨^(qū)塊鏈分叉(后面會(huì)有詳細(xì)解釋),你可以這樣理解:“兩個(gè)或兩個(gè)以上的區(qū)塊可能有相同的區(qū)塊高度,在區(qū)塊鏈里爭奪同一位置。”在整個(gè)區(qū)塊鏈網(wǎng)絡(luò)里面,每個(gè)礦工都在產(chǎn)生自己的區(qū)塊。在同一時(shí)刻,只能有一個(gè)區(qū)塊獲勝,最后被加入到區(qū)塊鏈中。所以,在區(qū)塊鏈的頂部位置,在某個(gè)時(shí)刻,可能有多個(gè)區(qū)塊擁有完全相同的區(qū)塊高度。此時(shí),即使你知道區(qū)塊的高度,但是就是無法確定到底具體是哪個(gè)區(qū)塊。所以說,高度不是區(qū)塊的唯一標(biāo)識(shí)。
你可以這樣理解:《軍師聯(lián)盟》里面,曹操的幾個(gè)兒子都想當(dāng)太子,就一定要爭取太子那個(gè)位置。你雖然知道,太子是一人之上,萬人之下的位置。但你就是無法確定,到底太子是曹丕還是曹植?
7.4 區(qū)塊的連接
前面說到過,區(qū)塊鏈有兩個(gè)部分:區(qū)塊 + 鏈。鏈指的就是區(qū)塊之間的聯(lián)系。每一個(gè)區(qū)塊的頭部區(qū)塊里,會(huì)存儲(chǔ)自己的“父區(qū)塊“的區(qū)塊頭哈希值。(再次提醒,區(qū)塊不會(huì)存儲(chǔ)自己的哈希值,存儲(chǔ)的是自己父親的哈希值。)父區(qū)塊指的是,當(dāng)前區(qū)塊的前一個(gè)區(qū)塊。從垂直的角度來看,就是壓在自己下面的最近的一個(gè)區(qū)塊。比如,當(dāng)前區(qū)塊是第3500個(gè)區(qū)塊,那么他的父區(qū)塊,就是第3499個(gè)區(qū)塊。以此類推,第2個(gè)區(qū)塊的父區(qū)塊就是創(chuàng)世區(qū)塊,也就是第一個(gè)區(qū)塊。這樣的機(jī)制,使得每個(gè)區(qū)塊都能根據(jù)自己父區(qū)塊的唯一標(biāo)識(shí)符,一路查找到創(chuàng)世區(qū)塊。這樣就形成了一個(gè)從不間斷的鏈條結(jié)構(gòu)。
7.5 Merkle樹
merkle 樹,是一種特定的數(shù)據(jù)結(jié)構(gòu)。這個(gè)結(jié)構(gòu)主要是用來表示每個(gè)區(qū)塊里面的所有交易記錄的。這個(gè)樹存在的意義,是為了快速驗(yàn)證交易是否存在。這里面涉及到二叉樹的算法,不是太好講清楚。大家可以簡單理解成是一種提高計(jì)算效率的數(shù)學(xué)公式即可。markle 樹形結(jié)構(gòu)的應(yīng)用,使得驗(yàn)證一條交易是否存在的時(shí)間復(fù)雜度大大降低。
"依表可得,當(dāng)區(qū)塊大小由16筆交易(4KB)急劇增加至65,535筆交易(16MB)時(shí),為證明交易存在的Merkle路徑長度增長極其緩慢,僅僅從128字節(jié)到512字節(jié)"。這樣的方式,使得我們前面所說的 SPV (簡單支付驗(yàn)證)有了可能。"SPV節(jié)點(diǎn)不保存所有交易也不會(huì)下載整個(gè)區(qū)塊,僅僅保存區(qū)塊頭。它們使用認(rèn)證路徑或者M(jìn)erkle路徑來驗(yàn)證交易存在于區(qū)塊中,而不必下載區(qū)塊中所有交易"。這樣,就可以做到節(jié)點(diǎn)存儲(chǔ)最少的信息,但是依然可以擁有整個(gè)區(qū)塊鏈的連接關(guān)系。
第八章? 挖礦與共識(shí)
8.1 比特幣是通貨緊縮的貨幣
比特幣的發(fā)行總量是固定的,到2140年左右,2100萬的比特幣會(huì)被全部生產(chǎn)出來。這里先講一個(gè)題外話,有同學(xué)問到:區(qū)塊鏈的區(qū)塊擴(kuò)容會(huì)不會(huì)導(dǎo)致比特幣數(shù)量增加?這里可以很明確的回答:不會(huì)。區(qū)塊的擴(kuò)容,從1M到2M或者更多,只是讓一個(gè)區(qū)塊能夠記錄更多的交易信息,僅此而已。不會(huì)影響2100萬的比特幣總量的。至于到底為什么比特幣的總量不會(huì)改變,學(xué)習(xí)完挖礦的知識(shí),你就會(huì)豁然開朗的。
每開采21萬個(gè)區(qū)塊大概耗費(fèi)4年,每過4年,貨幣發(fā)行的速度會(huì)降低50%。
第一個(gè)四年,大概是從2008年開始,每個(gè)區(qū)塊產(chǎn)生50個(gè)比特幣。
第二個(gè)四年,從2012年11月開始,每個(gè)區(qū)塊產(chǎn)生25個(gè)比特幣。
第三個(gè)四年,從2016年7月開始,每個(gè)區(qū)塊產(chǎn)生12.5個(gè)比特幣。
第四個(gè)四年,從2020年某個(gè)時(shí)刻開始,每個(gè)區(qū)塊產(chǎn)生6.25個(gè)比特幣。
。
。
直到2140年,2100萬的比特幣會(huì)全部產(chǎn)生。從上面的規(guī)則來看,區(qū)塊的產(chǎn)生和比特幣的產(chǎn)生是完全不同的兩回事。
區(qū)塊的產(chǎn)生是曠工用礦機(jī)挖出來的,而比特幣是每個(gè)區(qū)塊產(chǎn)生出來的,而且是區(qū)塊產(chǎn)生的比特幣會(huì)越來越少。簡單來說,區(qū)塊鏈的區(qū)塊數(shù)量幾乎是無限的,只要有曠工在挖礦,但比特幣總量是有限的。這樣使得比特幣是通貨緊縮的貨幣,不會(huì)像人民幣一樣具有通貨膨脹的風(fēng)險(xiǎn)。
8.2 挖礦的目的和動(dòng)力
挖礦是增加比特幣供應(yīng)的一個(gè)過程。同時(shí),挖礦也是在保護(hù)比特幣系統(tǒng)安全性最重要的一個(gè)步驟。
整個(gè)區(qū)塊鏈網(wǎng)絡(luò)里面的曠工之所以主動(dòng)積極的去挖礦,主要是曠工可以獲得獎(jiǎng)勵(lì)。獎(jiǎng)勵(lì)分為兩個(gè)部分:區(qū)塊里面相應(yīng)的比特幣獎(jiǎng)勵(lì)、這個(gè)區(qū)塊上所有交易記錄的交易費(fèi)用。那是否2100萬個(gè)比特幣被完全挖出來之后,曠工就不挖了嗎?不是的。2100萬個(gè)比特幣挖完,曠工的所有收入將會(huì)基本來自于交易費(fèi)用。只要有交易增加,區(qū)塊就會(huì)不斷增加,就不斷有交易費(fèi)用。
8.3? 去中心化共識(shí)
去中心化共識(shí),是整個(gè)區(qū)塊鏈網(wǎng)絡(luò)信任的基礎(chǔ)。去中心化共識(shí)是由所有網(wǎng)絡(luò)節(jié)點(diǎn)的相互作用產(chǎn)生的。主要有4種:
每個(gè)全節(jié)點(diǎn)依據(jù)綜合標(biāo)準(zhǔn)對(duì)每個(gè)交易進(jìn)行獨(dú)立驗(yàn)證;(章節(jié)8.3)
挖礦節(jié)點(diǎn)完成工作量證明的驗(yàn)算,將交易記錄獨(dú)立打包進(jìn)新區(qū)塊;(章節(jié)8.5、8.6、8.7、8.8)
每個(gè)節(jié)點(diǎn)獨(dú)立對(duì)新節(jié)點(diǎn)進(jìn)行校驗(yàn)并組裝進(jìn)區(qū)塊鏈;(章節(jié)8.9)
每個(gè)節(jié)點(diǎn)對(duì)區(qū)塊鏈進(jìn)行選擇,選擇工作量最大的區(qū)塊;(章節(jié)8.11)
8.3.1 交易的獨(dú)立驗(yàn)證
上一次課程,在講解網(wǎng)絡(luò)發(fā)現(xiàn)的時(shí)候,想大家詳細(xì)解釋了新節(jié)點(diǎn)加入?yún)^(qū)塊鏈網(wǎng)絡(luò)的過程。這個(gè)交易的獨(dú)立驗(yàn)證,其實(shí)就是發(fā)生在新節(jié)點(diǎn)尋找新的鄰居節(jié)點(diǎn)的過程之中的。這里的新節(jié)點(diǎn)一般是錢包節(jié)點(diǎn),因?yàn)檫@些節(jié)點(diǎn)需要傳遞的是:交易信息。
新節(jié)點(diǎn)把交易新傳遞給鄰居節(jié)點(diǎn)的時(shí)候,鄰居節(jié)點(diǎn)會(huì)主動(dòng)驗(yàn)證這些交易信息是否為有效交易。在確認(rèn)無誤之后,才會(huì)繼續(xù)進(jìn)行傳遞給自己的鄰居節(jié)點(diǎn)。這些校驗(yàn)的項(xiàng)目,是一個(gè)長長的列表,每個(gè)節(jié)點(diǎn)會(huì)逐個(gè)去驗(yàn)證每個(gè)需要驗(yàn)證的條目。你可以這樣想象,每個(gè)節(jié)點(diǎn)其實(shí)都是一個(gè)質(zhì)量檢查員,他們對(duì)于交易信息的質(zhì)量嚴(yán)格把關(guān)。在拿到大量交易信息的時(shí)候,他們會(huì)拿著一個(gè)長長的校驗(yàn)清單,一條一條的檢驗(yàn)。這個(gè)過程就是交易的獨(dú)立驗(yàn)證。
8.3.2 挖礦節(jié)點(diǎn)完成驗(yàn)算,打包交易記錄
在整個(gè)區(qū)塊鏈網(wǎng)路里,挖礦節(jié)點(diǎn)都是在同時(shí)做3件事:
監(jiān)聽網(wǎng)絡(luò)上的交易;(眼觀六路、耳聽八方)
監(jiān)聽其他節(jié)點(diǎn)發(fā)現(xiàn)的區(qū)塊;(隨時(shí)關(guān)注競爭對(duì)手的動(dòng)態(tài))
挖掘新的區(qū)塊;(其實(shí)就是尋找算法的解)
在獲得區(qū)塊之后,挖礦節(jié)點(diǎn)需要做的就是把交易記錄打包進(jìn)這個(gè)候選區(qū)塊。之所以說是候選區(qū)塊,是因?yàn)榫W(wǎng)絡(luò)里的曠工依然是競爭狀態(tài),整個(gè)網(wǎng)絡(luò)還沒有確定到底是哪個(gè)曠工挖出的區(qū)塊可以加入到區(qū)塊鏈中。
在上一步的交易驗(yàn)證之后,比特幣節(jié)點(diǎn)會(huì)把監(jiān)聽到的交易記錄暫時(shí)放到自己的內(nèi)存池(也叫做交易池)。你可以把交易池想象成一個(gè)臨時(shí)儲(chǔ)物間,這里面存儲(chǔ)的是已經(jīng)經(jīng)過驗(yàn)證但是還沒有打包進(jìn)區(qū)塊的交易記錄。(這些記錄目前還沒有得到交易確認(rèn),這是后面要談到的工作量證明)
挖礦節(jié)點(diǎn),一旦接收并驗(yàn)證了一個(gè)區(qū)塊A,那么這個(gè)節(jié)點(diǎn)就會(huì)去自己的臨時(shí)儲(chǔ)物間,檢查儲(chǔ)物間里面的所有交易記錄。從臨時(shí)儲(chǔ)物間里面把已經(jīng)出現(xiàn)在區(qū)塊A里面的交易記錄移除。剩下的記錄會(huì)被打包進(jìn)下次出現(xiàn)的新的區(qū)塊B。說的再清晰一點(diǎn)就是:A區(qū)塊把10分鐘以內(nèi)的交易記錄打包進(jìn)自己的區(qū)塊,10分鐘以外的交易記錄會(huì)留個(gè)下一個(gè)區(qū)塊B。因?yàn)槊?0分鐘只能有一個(gè)區(qū)塊產(chǎn)生。
#打包過程
下面要講的是,整個(gè)區(qū)塊的打包過程。
這里,你可以簡單把礦工想象成給快遞打包的工人。只不過,礦工打包的東西不是快遞,而是交易記錄。做任何事情都有一個(gè)輕重緩急,礦工打包交易記錄也是一樣。在區(qū)塊鏈里面的,交易記錄都是有自己的優(yōu)先級(jí)的,礦工會(huì)優(yōu)先打包那些優(yōu)先級(jí)別較高的交易記錄。那什么樣的是優(yōu)先級(jí)搞的交易記錄呢?手續(xù)費(fèi)高的交易記錄優(yōu)先級(jí)更高。
#構(gòu)造區(qū)塊頭
上一次分享里面講過,每個(gè)區(qū)塊都有一個(gè)區(qū)塊頭。里面有三類元數(shù)據(jù):父區(qū)塊的哈希值、挖礦競爭相關(guān)數(shù)據(jù)、merkle 樹根(所有交易信息的數(shù)據(jù)結(jié)構(gòu))。父區(qū)塊的哈希值和merkle 樹根,上一次課程都有講到。這里重點(diǎn)說一說挖礦競爭相關(guān)的數(shù)據(jù): 難度目標(biāo) 和 Nonce 。這兩個(gè)字段本質(zhì)上都是一個(gè)數(shù)字。 難度目標(biāo),指的是當(dāng)前區(qū)塊的工作量證明算法的難度目標(biāo)。實(shí)在理解不了,你就理解成這個(gè)目標(biāo)就是一個(gè)具體的數(shù)字。有點(diǎn)類似于:王健林的小目標(biāo),賺他一個(gè)億。僅僅只是一個(gè)數(shù)字目標(biāo)而已。不要被那些繞來繞去的名詞嚇到了。
難度目標(biāo)是可以動(dòng)態(tài)調(diào)整的,動(dòng)態(tài)調(diào)整的目的是為了:保證區(qū)塊產(chǎn)生的速度一直保持在每10分鐘一個(gè)區(qū)塊。(后面會(huì)具體談到)Nonce,主要是一個(gè)用于工作量證明算法的計(jì)數(shù)器。
#成功構(gòu)建新區(qū)塊
區(qū)塊頭里面三類元數(shù)據(jù),都是在構(gòu)建新區(qū)塊之前就預(yù)先確定好的。分別是下面6個(gè)字段:
有了上面的6個(gè)字段之后,礦工需要做的就是對(duì)這個(gè)候選區(qū)塊,進(jìn)行挖掘,也就是對(duì)工作量證明算法求解。求出解之后,這個(gè)區(qū)塊才能真正加入到區(qū)塊鏈里面。礦工挖礦的本質(zhì),其實(shí)就是在對(duì)一個(gè)復(fù)雜的方程,進(jìn)行大量的計(jì)算,最后得出這個(gè)方程正確解的過程。這個(gè)過程是一個(gè)隨機(jī)試驗(yàn)的過程。這里還要再補(bǔ)充說明的是:區(qū)塊頭里面的難度目標(biāo)其實(shí)是動(dòng)態(tài)變化的,是整個(gè)區(qū)塊鏈動(dòng)態(tài)調(diào)整的。
#難度目標(biāo)和難度調(diào)整
難度目標(biāo)決定了難度,進(jìn)而影響求解工作量證明算法所需要的時(shí)間。這個(gè)難度目標(biāo)值是可以調(diào)整的。比特幣的區(qū)塊平均每10分鐘生成一個(gè)。這個(gè)速度,不僅僅說的是短期,而是在未來的幾十年內(nèi)都要保持這個(gè)相同的速度的。為了保證這個(gè)平均速度,我們的難度目標(biāo)必須是動(dòng)態(tài)調(diào)整的。根據(jù)摩爾定律,計(jì)算機(jī)的計(jì)算性能在未來一定會(huì)飛速提升,而且,參與挖礦的礦工人數(shù)也會(huì)是不斷變化的,那么不同時(shí)期全網(wǎng)的算力就是會(huì)變動(dòng)的。為了保持區(qū)塊的生成速度不變,挖礦的難度必須依據(jù)變化做出調(diào)整。
這個(gè)難度目標(biāo)的調(diào)整是周期性的。大概規(guī)則是這樣的:
1、挖出一個(gè)區(qū)塊需要花費(fèi)整個(gè)網(wǎng)絡(luò)10分鐘。
2、每發(fā)現(xiàn)2016個(gè)區(qū)塊,整個(gè)區(qū)塊鏈網(wǎng)絡(luò)會(huì)根據(jù)2016個(gè)區(qū)塊完成的時(shí)間,來動(dòng)態(tài)調(diào)整后面2016個(gè)區(qū)塊的難度目標(biāo)。
8.3.3 校驗(yàn)新區(qū)快
這一步,就是交易記錄的驗(yàn)證。是區(qū)塊形成必不可少的步驟。“當(dāng)一個(gè)節(jié)點(diǎn)接收到一個(gè)新的區(qū)塊,它將對(duì)照一個(gè)長長的標(biāo)準(zhǔn)清單對(duì)該區(qū)塊進(jìn)行驗(yàn)證,若沒有通過驗(yàn)證,這個(gè)區(qū)塊將被拒絕。”
8.3.4 區(qū)塊鏈選擇
在驗(yàn)證新區(qū)塊的各項(xiàng)指標(biāo)之后,區(qū)塊還需要去尋找最大工作量證明的鏈條。區(qū)塊鏈的選擇里面涉及到一個(gè)重要概念:區(qū)塊鏈分叉。關(guān)于區(qū)塊鏈分叉,書中舉出的地圖還是比較形象化的。我在這里提供另外一個(gè)模型,供大家參考。大家記得和書里的例子對(duì)照理解。
區(qū)塊鏈分叉發(fā)生在兩名礦工在較短的時(shí)間內(nèi),各自都算得了工作量證明解的時(shí)候。也就是上圖的,礦工A 挖出了紅色區(qū)塊n+1,與此同時(shí)礦工B 挖出了綠色區(qū)塊n+1 。紅色區(qū)塊和綠色區(qū)塊,里面打包的交易記錄都是一樣的,父區(qū)塊都是區(qū)塊n.唯一的區(qū)別只是挖出區(qū)塊的礦工不同而已。此時(shí),整個(gè)區(qū)塊鏈就出現(xiàn)了分叉,有了兩條一樣的鏈條。這就是所謂的區(qū)塊鏈分叉。這個(gè)時(shí)候,分叉問題還無法解決。
那么,我們可以認(rèn)為區(qū)塊鏈全網(wǎng)的算力分成了兩個(gè)陣營:一個(gè)紅色陣營,一個(gè)綠色陣營。但是即便全網(wǎng)的算力在這兩個(gè)陣營中平均分配,也總有一個(gè)陣營搶在另一個(gè)陣營前發(fā)現(xiàn)工作量證明解,提前發(fā)現(xiàn)一個(gè)新的黃色區(qū)塊n+2。這樣一來,綠色陣營的鏈條就比紅色陣營的鏈條更長了。這樣也就意味著,綠色陣營的鏈條上,是目前全網(wǎng)工作量證明最大的鏈條。此時(shí),即使紅色陣營里的礦工挖出了新的區(qū)塊n+3,他也不會(huì)把新區(qū)塊放到紅色區(qū)塊后面的。因?yàn)椋械牡V工總是:選擇并嘗試延長代表累計(jì)了最大工作量證明的區(qū)塊鏈,也就是最長的或最大累計(jì)難度的鏈。此時(shí),區(qū)塊鏈分叉問題解決了。也就是說主區(qū)塊鏈已經(jīng)確定就是綠色區(qū)塊鏈了。
從理論上來說,區(qū)塊n+1的分叉也是有可能的。但是這種情況發(fā)生在因先前分叉而相互對(duì)立起來的礦工,又幾乎同時(shí)發(fā)現(xiàn)了兩個(gè)不同區(qū)塊的解。這種情況發(fā)生的幾率是很低的。單區(qū)塊分叉每周都會(huì)發(fā)生,而雙塊分叉則非常罕見。
8.4 共識(shí)攻擊
比特幣的共識(shí)機(jī)制依賴于這樣一個(gè)前提:絕大多數(shù)礦工,處于自己的利益最大化考慮,都會(huì)通過誠實(shí)地挖礦來維持整個(gè)比特幣系統(tǒng)。“理論上,一個(gè)區(qū)塊鏈分叉可以變得很長,但實(shí)際上,要想實(shí)現(xiàn)一個(gè)非常長的區(qū)塊鏈分叉需要的算力非常非常大,隨著整個(gè)比特幣區(qū)塊鏈逐漸增長,過去的區(qū)塊基本可以認(rèn)為是無法被分叉篡改的。”“一群礦工控制了整個(gè)比特幣網(wǎng)絡(luò)51%的算力,如果他們聯(lián)合起來,是可以攻擊整個(gè)比特幣系統(tǒng)。”但是隨著比特幣網(wǎng)絡(luò)的算力呈幾何級(jí)數(shù)快速增長,上述這些理論上可行的攻擊場景,實(shí)際操作起來已經(jīng)越來越困難。”理論上來說,比特幣是目前最安全的共識(shí)機(jī)制系統(tǒng)。
因?yàn)闀r(shí)間的緣故,第九章和第十章就不講解了,大家自己看書就可以,比較簡單。