區塊鏈原理傻瓜入門

說小青、小紅、小皂和小白共同租了一個房子。他們彼此之間,偶爾會存在資金的流動,例如,小紅和小青一起外出,吃了一頓飯,一共花了100雲,AA制,但是由小紅付的錢,小青因為當時沒錢,就跟小紅說月底還給她。為了記賬他們在客廳的白板上記錄每一筆交易,例如,小青在客廳的黑板上寫下了“小青需要付50元給小紅”。同樣的,這個月出現了幾次類似的情況。

區塊鏈原理傻瓜入門

現在黑板上寫有:

區塊鏈原理傻瓜入門

但是,有一天,小白的朋友惡作劇,在白板上無故的加了一條,小紅需要付小青50元。幸虧後來發現這是一條虛假的記錄,否則,月底小紅需要多支付50元給小青。為了防止類似的情況再次發生,記賬的時候需要記錄的人簽名表示認可。例如,下圖:

區塊鏈原理傻瓜入門

但是,後來記錄太多,白板上寫不下,他們改成在計算機上記賬,

區塊鏈原理傻瓜入門

但是,在計算機上就不能使用手寫簽名,一個原因是計算機上不方便手寫進行簽名,更主要的原因是手寫的簽名在計算機上會輕易地被複制。例如,小白的朋友又來惡作劇,把最後一個記錄和簽名複製了一下:

區塊鏈原理傻瓜入門

如果沒人發現的話,月底小紅無緣無故地需要向小白多支付50元。

所以,在計算機上的簽名應該是針對計算機的數字簽名。數字簽名和手寫簽名一樣要滿足對應性的要求。也就是說別的地方的數字簽名,無法用於這些記錄的數字簽名。而且每個簽名只能用於與其對應的記錄,無法用於其他的記錄,例如,下圖“數字簽名1”就不能作為“小青需要支付50元給小皂”的數字簽名,雖然兩條記錄的付款人都是小青,但是付款的記錄不一樣。數字簽名必須與記錄內容嚴格對應,如果記錄改變,那麼原來的數字簽名會失效。

區塊鏈原理傻瓜入門

製作數字簽名通常採用哈希(hash)算法,這裡選用了最先進的SHA-256哈希算法,因為到目前為止,還沒有公開的資料表示SHA-256有缺陷。SHA表示Secure Hash Algorirhm,安全哈希算法;256表示不論輸入什麼值,結果都是256位的二進制數。

例如,我們把第一條記錄“小青需要付50元給小紅”輸入SHA-256函數【網上有現成的SHA-256在線計算工具】,會得到如下的結果:

區塊鏈原理傻瓜入門

再輸入第二條記錄,如下圖,兩條記錄只差了一個字,但是計算的結果區別很大。不僅是多一個字計算結果不同,即使是多一個點或多一個空格,計算結果都會完全不同。所以,即便記錄發生了微小的改變,SHA-256的結果應該發生變化,而且變化毫無規律可言。但是,值得注意的是,只要這條記錄的內容不變,SHA-256的結果總是相同的。

區塊鏈原理傻瓜入門

所以,使用SHA-256作為數字簽名,可以保證記錄內容和SHA-256結果完全一一對應。

區塊鏈原理傻瓜入門

但是,這個還不夠,因為數字簽名和手寫簽名一樣,不僅需要滿足對應性這個要求,還需要滿足可鑑別這個要求。可鑑別是指,比如,對於任何一個簽名,例如,對於最後一條記錄,我們必須能夠判斷出,這是小紅的簽名,而不是別人的簽名。但是SHA-256函數是一個公開的函數,無論誰輸入“小紅需要付50元給小白”,都可以得到一模一樣的結果。如何讓這個簽名體現出是小紅的簽名,而不是別人的簽名呢?他們想出了一個辦法,就是使用非對稱加密法對記錄的簽名加密。把加密的結果作為真正的簽名。

下面解釋什麼是加密,什麼是對稱加密,什麼是非對稱加密,以及如何用非對稱加密讓簽名達到可鑑別:

很多人喜歡用“5201314”表達“我愛你一生一世”,將“5201314”的每個數字加上2,得到“7423536”。一般人就看不出含義了,而把“5201314”的每個數字加上2的過程稱為加密,這是一種最簡單的加密方法。而解密是與加密相反的過程,加密是加2,而解密是減2。加密時,使用的“2”就是密鑰。可以把加密過程理解為一個算法,密鑰是輸入的一個參數,加密時,算法需要輸入需要加密的數字和參數,得到加密的結果。如果加密的是文字,則可以先把文字轉化成數字,解密的時候,再把數字轉化成文字。這裡,因為加密和解密使用的是相同的密鑰,所以這個加密方法稱為對稱加密法。

區塊鏈原理傻瓜入門

而在非對稱加密時,加密和解密使用不同的密鑰,加密時的密鑰稱為私鑰,私鑰不能公開,只能加密的人自己知道,解密時,使用的密鑰稱為公鑰,公鑰需要公開,其目的是讓別人通過公鑰進行機密。例如,下圖所示的那樣。

區塊鏈原理傻瓜入門

公鑰是通過私鑰進過某個算式算出來的,但是無法從公鑰計算出私鑰。

區塊鏈原理傻瓜入門

好了,下面我們來介紹如何用非對稱加密讓簽名達到可鑑別:

小紅將“小紅需要付50元給小白”輸入SHA-256函數,我們將小紅輸入的記錄稱為原始記錄,得到的結果我們簡稱哈希值。小紅用自己的私鑰對哈希值進行加密,獲得加密後的哈希值,私鑰是可以包含256位的二進制數,在計算機中,對這個哈希值進行加密可以理解為將私鑰和這個哈希值輸入某個函數進行很複雜的計算,獲得一個數值。這個數值就是加密後的哈希值。加密後的哈希值就是小紅對這條記錄的簽名。

區塊鏈原理傻瓜入門

小紅將這條記錄、自己的簽名和自己的公鑰公佈出來,這樣任何人都能通過小紅的公鑰對小紅的簽名進行驗證。例如,小白利用小紅的公鑰對簽名進行解密,獲得解密後的哈希值,稱為哈希值1,小白再把記錄“小紅需要付50元給小白”輸入SHA-256函數獲得哈希值,稱為哈希值2,如果,哈希值1和哈希值2相等,那麼說明:1.這個簽名是針對這條記錄的 (如果小紅髮出的簽名不是針對這條記錄的,則哈希值1不等於哈希值2)2.這個簽名是小紅的簽名(如果不是小紅的簽名,那麼將無法解密得到哈希值1)3.接收到的記錄和原始記錄相同為被篡改

區塊鏈原理傻瓜入門


類似的,付款發將各自的記錄輸入SHA-256函數獲得哈希值,然後用自己的私鑰對哈希值進行加密獲得對應的數字簽名

區塊鏈原理傻瓜入門

其他人根據記錄的內容,付款方的公鑰就可以判斷出這個簽名是否對應於記錄內容,是否是付款方的簽名,從而這個記賬系統開始正常的運作起來。但是這個記賬系統太原始,還有很多的漏洞,只適合小範圍的使用。

2008年11月,出現了一個叫中本聰(satoshi nakamoto)的天才,他在網上發表了一篇論文,這篇文章介紹瞭如何使用對等網絡來構建一個分佈式的記賬系統。peer-to-peer表示網絡中所有的節點的地位都是對等的,可以履行相同的職責,不存在誰管理誰。

區塊鏈原理傻瓜入門

然後,2009年1月,比特幣上線,還出現了比特幣錢包的客戶端軟件,人們可以利用比特幣錢包來接受和支付比特幣。這時,我們需要對上述的記賬系統做若干改進,就可以得到中本聰設計的比特幣系統。下面,我們對它一步一步地改進,從而瞭解比特幣的基本工作原理。

第一個改進把記錄中的元改成比特幣(BTC),比特幣系統中的交易單位為比特幣

區塊鏈原理傻瓜入門

第二步改進的是,把“需要付”改成“支付”,只要小青發出這個支付消息,則小青的賬戶上要減少50比特幣,小紅的賬戶上增加50比特幣。這樣可以避免月底找不到人。

區塊鏈原理傻瓜入門

第三步:需要有一種方法能夠確認付款方是否有足量的比特幣進行支付,付款方有足夠的比特幣,才能認可這次交易。銀行等金融機構可以通過賬戶餘額非常方便地進行確認

但是,中本聰發明比特幣的其中一個目的就是消除銀行等第三方的依賴。那如何確認付款方有足夠的比特幣呢?

比特幣系統的方案是,每筆交易都必須把之前的交易作為基礎,而不是以餘額為基礎,例如,“小紅支付50BTC元給小白”,這筆交易的前提是在這筆交易之前,必須有人向小紅支付了X個比特幣,而且X必須大於等於50。且這個X個比特幣沒有被使用過。這裡,因為“小青支付50BTC給小紅”,50>=50,所以符合要求。但是,這裡需要修改一下:

區塊鏈原理傻瓜入門

區塊鏈原理傻瓜入門

小白收到消息後需要進行檢查:

區塊鏈原理傻瓜入門

但是,讓我考慮如下的一個情況,這裡消息可以看出,小青支付的50BTC並不夠支付給小白60BTC。

區塊鏈原理傻瓜入門

所以,小紅還需要以前的一條記錄的交易來填補,例如,之前,小皂轉過10BTC給小白,那麼就可以改成:

區塊鏈原理傻瓜入門

但是,如果小皂轉了20BTC給小紅,也就是50+20>60,這個如何處理?

區塊鏈原理傻瓜入門

比特幣系統的解決方案是,將多餘的金額作為找零支付給自己,就變成了

區塊鏈原理傻瓜入門

第四個改進的地方:

將交易的名字改為賬號,支付交易裡不能再是小紅、小白...了,世界上重名的人太多,支付的名字應該改為全球唯一的賬號,賬號一般是一個包含34個字符的字符串。例如:

區塊鏈原理傻瓜入門

真實的比特幣交易的記錄如下:

區塊鏈原理傻瓜入門

第五個改進的地方:轉賬記錄的存儲和維護

記錄不能存儲在一個電腦上,應該存儲在多臺電腦上,這些記錄是系統運行的基礎,如果只存放在一臺電腦上,電腦出現故障,則整個系統就崩潰了,所以在存放在多臺電腦上,這些存放的記錄的電腦由誰來維護呢,交給某個值得信任的人或專業公司進行管理和維護?誰能保證這個人或公司在巨大的誘惑下或者巨大的威脅下不對記錄進行篡改?

比特幣系統的方案是,比特幣的每條交易記錄都需要發佈到網絡上,讓所有運行比特幣客戶端的計算機存儲所有的比特幣轉賬記錄,這樣每一條記錄都有很多計算機存儲,不用擔心記錄缺失。但是這樣會出現3個一致性的問題:

1.如何進行同步,有的計算機可能沒有運行比特幣客戶端,有的沒有聯網,有的甚至處於關機狀態。他們就沒有收到比特幣的交易記錄。這樣計算機上的記錄不一致,到底以誰為準?如何讓他們相互進行同步,從而存儲相同的記錄?

區塊鏈原理傻瓜入門

2.如何防止記錄被篡改?有些計算機受黑客控制,讓記錄和真實記錄不一致,甚至存在矛盾。導致整個比特幣網絡無法運行。如何防止黑客篡改記錄呢?

區塊鏈原理傻瓜入門

3.如何防止同一筆比特幣收入被重複使用。例如,小紅一共只收到過一筆轉賬,小紅支付給小白後,馬上又支付給了小皂。也就是說,小紅幾乎同時發送了兩條支付記錄。

區塊鏈原理傻瓜入門

因為在網絡上,消息的傳播進過的路線可能不同,就導致有的計算機先收到信息1,有的計算機先收到消息2.

區塊鏈原理傻瓜入門

比特幣利用區塊鏈來解決這3個問題。

區塊鏈有區塊串聯而成,區塊中存儲的是進過檢查的交易記錄。比特幣網絡僅僅認可和維護同一條區塊鏈。也就是說,區塊鏈網絡中的每個節點都存儲著相同區塊鏈,當新生成的交易記錄被放入新的區塊,而且這個新生成的區塊被添加到區塊鏈上後,這個新的交易記錄才算得到比特幣網絡的確認。新區塊由網絡上被稱為曠工的節點生成,曠工接收到網絡上的各個比特幣交易記錄,逐個檢查這些交易是否符合要求,例如,檢查每條記錄是否有正確的數字簽名,每條記錄的輸入值是否使用過,每條記錄的輸入值是否大於輸出值等等,然後將符合要求的比特幣交易記錄添加到自己正在製作的新區塊中。

區塊鏈原理傻瓜入門

當礦工成功地製作好這個新的區塊,就將這個新區塊發送個網絡上的各個節點,網絡上的節點接收到這個新區塊,檢查這個新區塊是否符合要求,就將這個新區塊添加到自己區塊鏈的末尾,

區塊鏈原理傻瓜入門

那麼,問題來了,比特幣網絡上有許許多多的礦工,每個礦工都可以生成新區塊,網絡中可能會生成許許多多新區塊,比如,同時生成100個新區塊,雖然這100新區塊的內容大致相同,但是檢查好的近期的交易記錄,但是,每個區塊具體包含哪些交易記錄可能略有區別,也就是說這100個新區塊各不相同,而比特幣網絡僅僅任何和維護同一條區塊鏈,比特幣網絡上的每一個節點都必須選擇同一個新區塊添加到現有的區塊鏈末尾,但是,很難確定一個選擇的標準,至少不能按照到達的時間的先後順序進行選擇,因為節點分佈於世界各地,每個節點接收到的第一個新區塊一般不同。

區塊鏈原理傻瓜入門

比特幣網絡的解決方案是,採用一個巧妙的方法限制單位時間內同時生成的新區塊的數量,如果每隔十分鐘左右的時間,整個比特幣網絡只有一個礦工能將自己做好的一個新區塊發佈到網絡上,則不需要進行選擇,所有的節點將這個唯一的區塊放到區塊鏈上,這樣可以保證所有節點保存的區塊鏈始終相同。

這個巧妙的方法就是,當礦工將檢查好的交易記錄填入新區塊之後,還需要礦工做一個額外的工作,礦工額外地完成這個工作後才能把生成的新區塊發佈到網上去,這個額外的工作,整個比特幣網絡一般只有一個礦工能在10分鐘左右的時間成功完成。所以,每個10分鐘左右的時間,只有一個礦工能將自己做好的一個新區塊發佈到網絡上。

這個額外的工作分為兩步:

第一步:將新制作的區塊所包含的內容(前一個區塊的SHA-256函數值+這個新區塊的基本信息+這個新區塊所包含的所有交易記錄)組成一個字符串。這裡的前一個區塊的SHA-256函數值是指前一個區塊的所有內容輸入SHA-256函數得到的哈希值。每一個區塊和他自己的SHA-256哈希值一一對應。如下圖所示,如果第B個區塊中,包含第X個區塊的SHA-256哈希值,那個表示第B個區塊的前一個區塊是第X個區塊。

區塊鏈原理傻瓜入門

那麼第1個區塊呢,第一個區塊中包含第0個區塊的所有內容的SHA-256哈希值。

區塊鏈就是依靠各個區塊的SHA-256函數值將這些區塊有序地串聯起來。

第二步:找一個隨機數。在上面的字符串後面加上這個隨機數,組成新的字符串,將這個新的字符串輸入到SHA-256函數,如果找到了這個隨機數能使得這個256的二進制數的前72位都為0,才算完成這個額外的工作。

區塊鏈原理傻瓜入門

這個額外的工作的難度非常的高,高到這個比特幣網絡只有一個礦工能夠在10分鐘左右的時間成功地找到這個隨機數,原因在於SHA-256函數的特點是:雖然每個輸入值對應一個輸出值,而且每個輸出值都是一個256位的二進制數,但是每次運算的輸出值具體是什麼完全是隨機的,而且無法預測,找到符合要求的隨機數的唯一方法就是以最快的速度輸入不同的隨機數,不停地試,SHA-256函數的輸出結果是這樣的一個256位的二進制數,前72位全為0的概率為1/2^72

區塊鏈原理傻瓜入門

也就是說平均要試2的72次方個不同的隨機數,才能找到一個符合要求的隨機數,也就是平均要進行2的72次方次SHA-256函數計算,才能找到一個符合要求的隨機數。整個比特幣網絡上的所有礦工節點的所有計算設備一起運算,平均每10分鐘才能做2的72次方SHA-256函數計算,也就是說,整個比特幣網絡所有的礦工節點上所有計算機設備一起這個隨機數,平均每10分鐘才能找到一個滿足要求的隨機數。因為找到這個隨機數完全靠運氣,有時運氣好一些3、4分鐘就可以找到這個隨機數,有時運氣差一些,可能要10幾分鐘才能找到這個隨機數,但一般平均10分鐘才能找到一個滿足要求的隨機數,因為完全靠運氣,所以到底是哪個礦工的計算設備找到這個數也是隨機的,有點類似於買彩票,中獎號碼是隨機的,中獎者是隨機的,當某個礦工找到符合要求的隨機數後,馬上把這個隨機數添加到新區塊中,馬上把這個新區塊發佈到網絡上,網絡上的節點收到這個新區塊後,將這個區塊的所有內容,也就是前一個區域的SHA-256函數值+這個新區塊的基本信息+這個新區塊所包含的所有交易記錄+找到的隨機數組合成字符串,並將這個字符串,輸入SHA-256函數,如果計算結果是符合要求的二進制數,即前72個數字都為0,則說明製作這個區塊的礦工確實成功完成了這個額外的工作。然後,在檢查區塊的其他方面是否符合要求,以及區塊中的記錄是否符合要求,一切都沒有問題的話,就把這個區塊添加到自己的區塊鏈的末尾,網絡上接受到這個新區塊的所有節點都做相同的操作:檢查區塊,符合要求就添加到自己區塊的末尾,因為只有一個新區塊,從而避免了從很多區塊中進行選擇。

區塊鏈原理傻瓜入門

找到這個隨機數完全靠運氣,但是礦工的計算能力越強,則運氣會越好。礦工的運算能力越強,則進行SHA-256函數運算的速度越快,單位時間內能試的隨機數就越多,也就越可能最快地找到這個隨機數,這個尋找符合要求的隨機數的過程稱為挖礦。

挖礦拼的是運算速度,拼運算速度就是拼運算設備的運算速度。為了提高速度,礦工們不斷提高自己的挖礦設備。普通計算機每秒只能夠進行60萬次SHA-256函數計算,配備了好的顯卡的計算機可以每秒進行幾億次的SHA-256函數計算。因為顯卡運算的速度比cpu快的多。為什麼礦工會樂此不疲地做這樣的工作,而且不斷地去升級自己的設備?

因為礦工每找到一個隨機數,礦工將獲得12.5個比特幣(2017年)作為獎勵,除此之外,這個這個新區塊的所有比特幣交易的交易費也歸這個礦工所有,平均是2個比特幣。為此,一般平均可以獲得14.5個比特幣作為獎勵,在2017年,大約價值26萬美元,即170萬人民幣。

巨大的經濟利益驅使了挖礦設備的升級,導致整個網絡的計算能力提高。原來整個網絡大約需要10分鐘就能找到一個符合要求的隨機數,現在可能大約只要5分鐘。

比特幣網絡為了維持平均10分生成一個區塊的速度,每兩個星期調整一次工作的難度。例如,要求前73位全是0。

區塊鏈原理傻瓜入門

因為找到隨機數完全靠運氣,那麼有沒有可能兩個礦工同時找到,並各自制作了一個新區塊,有這個可能,也經常發生,那如何處理呢?

當網絡節點幾乎同時接收到2個都符合要求的新區塊,我們用紫色區塊和綠色區塊來表示兩個新區塊:

區塊鏈原理傻瓜入門

網絡節點不知道比特幣網絡最終會採納哪一個區塊,就暫時把兩個區塊都保留下來,並把這2個區塊都添加都新區塊的後面,從而區塊鍊形成了2個支鏈,礦工也會保留這兩個新區塊。

區塊鏈原理傻瓜入門

但是,製作下一個新區塊時,每個礦工都是在自己先接收到的按個區塊的基礎上,創建新區塊。一般情況下,在下一個10分鐘,不會那麼湊巧又幾乎同時產生2個新區塊,一般只產生一個新區塊,如果只產生一個新區塊,如果這個新區塊是在紫色區塊的基礎上創建的,則接受到這個區塊的節點將它添加在紫色區塊的後面,同時放棄綠色的區塊。

區塊鏈原理傻瓜入門

同理,

區塊鏈原理傻瓜入門

也就是說,如果存在分叉的情況,網絡上只認可最長的那個支鏈,這樣保證了區塊鏈的唯一性。如果非常非常偶然地,又同時產生兩個新區塊,如果是在紫色區塊上繼續的,那個把個區塊都添加到紫色區塊的後面:

區塊鏈原理傻瓜入門

同理,這裡省略綠色的節點。

被放棄的支鏈上的區塊中的記錄如果沒有被添加到主鏈上,則會被確認為未確認交易。等待被加入新的區塊中,這裡大家要注意的是,進行比特幣轉賬交易時,交易記錄雖然被髮在區塊中,但是這個區塊可能是支鏈上的區塊,如果這個支鏈不能成為主鏈的話,交易很有可能重新變成未被確認的交易,重新等待確認,所以保險起見,當交易記錄所在的區塊後面又添加了若干新區塊後,才可以穩妥地認為自己的交易記錄真正地得到比特幣網絡的確認。那若干個到底是幾個?對於小額交易,一般是1到2個,對於大額交易,為了更穩妥,一般是3-6個。

現在我們來看看區塊鏈如何解決3個一致性方面的問題:

1.如何進行同步?

因為比特幣網絡僅僅維護唯一一個區塊鏈,所以大家都以這個區塊鏈為準進行同步,無論是第一次安裝比特幣客戶端軟件,還是中途有很長時間未聯網,比特幣客戶端軟件連接到網絡上後,會自動想周圍的網絡節點請求自己沒有的區塊,檢查無誤後逐一添加到自己存儲的區塊鏈上,請注意是檢查無誤後,才逐一添加到自己的區塊鏈上。包括檢查區塊中的每一筆交易記錄是否符合要求,檢查區塊是否符合要求

區塊鏈原理傻瓜入門

2.如何防止篡改?

當交易記錄被輸入到區塊鏈中,而且區塊被加入到區塊鏈中,則區塊中的任何記錄都不能進行修改,即使是微小的改變也是不允許的,對區塊的任何修改,都會改變這個區塊的SHA-256函數值,導致後面一個區塊所包含的SHA-256函數值與這個區塊修改後的SHA-256函數值不相同,從而導致這個鏈斷裂,那這條鏈就不是網絡中最長的區塊鏈,而比特幣網絡只認可和維護最長的一條區塊鏈。那麼篡改者有沒有可能自己不斷製造新區塊,並添加在這個斷裂的區塊鏈的後面,讓這個斷裂的區塊鏈生長為最長的區塊鏈?因為製造新區塊需要完成難度很高的額外工作,

只有篡改者所擁有的計算能力超過整個網絡中其他所有節點的計算能力總和時,篡改者所製作的區塊鏈的生長速度才有可能超過現有的完整的區塊鏈的生長速度,篡改者製作的區塊鏈才有可能成長為最長的區塊鏈。但是,經過比特幣網絡8年的發展,這種可能性微乎其微。

3.如何防止同一筆比特幣收入被重複使用

礦工在製作新區塊時,會檢查放入新區塊的每個交易記錄中的輸入值是否在前面的區塊所包含的交易記錄中使用過,如果被使用過,則認為這個交易無效,不會被放入新區塊中,如果在製作新區塊時,發現有兩個交易記錄的輸入值中出現相同的先前交易,則礦工則只認可其中一個交易記錄有效,並只將其加入到新區塊中,而只有被放入區塊的交易記錄才是比特幣網絡認可的交易記錄,才是被認為是成功的交易記錄,從而防止同一筆比特幣收入被重複轉賬給別人。

最後,還有幾個關鍵的問題。

1.比特幣是怎麼發行的?

區塊鏈原理傻瓜入門

2.比特幣存在什麼地方?

區塊鏈原理傻瓜入門

3.剛才說總量是2100萬,如果有人把數據文件弄丟了,是不是總量就減少了?

是的。

4.比特幣轉賬和支付寶轉賬有什麼區別?

區塊鏈原理傻瓜入門

區塊鏈原理傻瓜入門


分享到:


相關文章: