當前位置:
首頁 > 最新 > 比特幣的原理

比特幣的原理

簡介

本篇文章試圖讓你明白什麼比特幣?以及讓你明白賬本、數字簽名、加密散列函數、區塊鏈、挖礦等含義。

我不會做一些淺顯的類比來進行說明,如通過現實中礦工挖礦來講比特幣,因為這失去了很多細節,讓人懵懵懂懂,我嘗試講解你在使用比特幣時,計算機究竟發生了什麼?當然不會涉及太多技術細節。

先下個定調:加密貨幣是一套基於密碼學的去中心化、互不信任的交易驗證體

賬本

首先要弄明白加密貨幣中賬本的概念。

你ayu,在生活中有3個朋友,分別是小呂、小林、小廖,你們很要好,經常一起玩耍,玩耍當然要花錢,吃吃喝喝,但是這顯得比較麻煩,比如ayu和小呂出去吃東西,你倆AA,一人付一半,你和小林出去玩也AA,每次都要算錢,朋友之間很尷尬,但是不算又不行,畢竟是錢,那將這些交易都記錄在一個賬本上,每個人都可以往賬本上添加交易記錄,月尾4個人一起結算一下不就好了

賬本如下:

到了月尾,大家一起來計算一個賬本中的數據,如果有人有盈餘,就將盈餘取走,如果有人在賬本中欠了錢,就補回來,每月一次,方便了很多,因為每個人都可以往賬本上添加交易記錄,那麼如果有人偷偷添加了一條交易記錄怎麼辦?朋友之間很難說的嘛ㄟ( ▔, ▔ )ㄏ,將問題轉換一下就是我們為什麼要相信賬本上的所有記錄都是對的?沒人動過手腳?這就需要動用電子簽名技術了

數字簽名

為了讓賬本中的交易記錄可信,最直接的方法就是讓交易人本身在這條交易記錄後面簽上你獨一無二不可被複制的簽名,但無論你的書法多麼精妙,在電腦上只需要簡單的複製粘貼就可以了,所以「獨一無二不可被複制」的簽名感覺做不到啊,根本擋不住ctrl+c/v,其實我們可以使用非對稱加密演算法來解決這個問題,非對稱加密演算法有兩個秘鑰,一個是公鑰(Public Key),另一個是私鑰(Secret Key),公鑰你可以外放出去,交給他人,比如給你的3位朋友,但是私鑰只能你自己知道,要妥善保管,此時你就可以使用你自己的私鑰加密你的交易記錄生成一個長為256bit的數字簽名,所有人都可以這樣做,那麼賬本就會是下面的樣子

其他人可以通過你的公鑰來驗證你的簽名,如果使用公鑰解開你的加密簽名獲得其中的內容與交易記錄的內容一致就說明這確實是你簽的名,公鑰和私鑰都是互相對應的,單純的拿到公鑰和私鑰加密後的內容是無法破解私鑰的,準確說,除了使用窮舉法,沒有什麼更好的方法得到私鑰,而私鑰的長度為256bit,也就有2的256次方的可能,比天文數字還要大,可以去知乎上看看這個問題對2的256次方法有直觀的認識2的100次方到底有多大?

可以說有了簽名,其他人就不能偷偷往賬本上寫交易記錄了,雖然他不能寫,但是他可以複製啊,連同你的簽名一起複制,這樣你就無緣無故多付了幾倍的錢,果然是好朋友啊,這個問題很好解決,每條交易記錄都加上唯一的編號,這樣通過秘鑰加密時,因為有了編號,要加密內容就不同了,得到的簽名會完全不同。

順帶提一下,非對稱加密演算法還常於信息安全中,如加密傳輸的信息,與上面的用法有點不同,使用公鑰加密要傳輸的信息,只有擁有私鑰的人才能解密其中的信息

通過上面的努力,建立了一本大家都可以信任的賬本,但是它還是需要一個中心的機構,比如政府、銀行,因為朋友可以在月尾結算時跑路,而他卻在賬本里卻欠了很多錢,只有通過中心機構才能讓他還錢,為了避免這種友誼破碎的情況,我們4人可以一開始先支出100元到賬本里,然後再使用賬本,這樣每個月月尾也不用結算了,如果發現一條交易記錄他的交易人沒有那麼多錢,就拒絕記錄這條交易,賬本如下

你可以發現,現在使用這個賬本,你完全不再需要現金,也就說它與現金脫鉤了,同時它可以拒絕非法交易(餘額不足等情況的交易),這也意味著賬本在記錄交易前要檢查前面的所有交易

而Bitcoin(比特幣)就是一個賬本,它表示所有的歷史總和就是當下的貨幣。

分散式賬本

因為賬本具有人人都可以修改的特性,那麼這個賬本放哪才能讓人人都可以修改?放在一個公共場所?放在一個人人都可以訪問的網站上?如果這樣會造成中心化,如誰有權管理這個地方?誰有權管理這個網站?誰來控制賬本的添加規則?

那人人都有一本賬本不就可以了?沒錯,這就是分散式賬本,人人都有一本賬本,人人都可以在自己的賬本上記錄交易。將賬本分布到每個人上,那麼每有一筆交易,交易人不僅要在自己的賬本上記錄上這條交易,還要將這條交易廣播出去,告訴所有其他擁有賬本的人,讓他們也記錄這條交易

這個想法雖然簡單,但是卻會帶來很多嚴重的問題,如下:

1.如何確保全部所有人手上的賬本都是正確的?如記錄順序無誤?沒有漏記?

2.ayu收到一個廣播,說「小林支付給小廖100元」,ayu使用公鑰驗證了這條交易記錄沒問題後,他如何確保其他人也收到了這條交易記錄呢?讓他可以放心與其他人交易?

3.你如果收到了多個交易廣播,怎麼才能確保其他人跟你以相同的順序收到交易廣播呢?

想出一個可靠的方法來接收或拒絕收到的信息,而且確保其他人在這個方法下能以同樣的順序得到交易信息,最終生成同樣的賬本就是關鍵,這也是中本聰在比特幣創世論文中詳細討論的部分。(至今沒人知道中本聰這位神人是誰?中本聰只是一個ID,他創造了比特幣,最先提出區塊鏈的想法。)

長話短說,Bitcoin的解決方法是選擇信任消耗最多計算資源的那份賬本,如果將計算資源的消耗作為信任的基石,那麼偽造或修改交易記錄就需要不可能達到的計算能力,暫時不理解這句話沒關係,因為涉及到了加密散列函數、區塊鏈等概念,先來講講加密散列函數

加密散列函數

散列函數,或者叫哈希函數,這個函數可以將輸入的任何內容都輸出成具有相同長度的內容,最常見就是MD5,而這裡使用的是SHA256,它會將輸入的內容加密成256bit長度的哈希,這個過程是不可逆的,也就是告訴你一個加密好的256bit的哈希,你無法逆推出加密的內容是什麼,散列函數都具有正向計算簡單,逆向計算幾乎無解的特性,所以除了用窮舉法,你沒有什麼特別好的方法來破解,窮舉嘛,你就需要體會2的256次方的恐懼。

你可能會想,去深入了解散列函數的細節與作用原理,再通過結果一步步逆推不行嗎?目前沒有人做到,而且有趣的是,目前數學上也沒有嚴格的證明說逆向計算是困難的。

可以去這個網站體會SHA256是如何加密的,SHA256加密

回到剛才的那句話,Bitcoin選擇信任消耗最多計算資源的那份賬本,問題是如何證明賬本消耗了計算資源呢?可以用加密散列函數來證明,這也是Bitcoin的核心,工作量證明Proof Of Work,簡稱PoW

Proof Of Work

有一天,小呂跑過了跟你說,她找到一個有意思的數,5201314,這個數和當前的賬本作為內容輸入給SHA256函數可以獲得一個長度為256bit的哈希

SAH256(賬本內容+5201314)=00000000000000000000000000000000000000000000000000

00000000001011101001011011010111010010001001.....(256位)

有趣的是這個哈希開頭是60個0,要得到哈希前60位都為0的概率是2的60次方,大約是十億億分之一,而SHA256函數又是不可逆推的,所以小呂要得到這個數只能去窮舉,最壞的情況就是計算十億億次才能得到5201314,有沒有突然覺得這個數字很沉重,其實5201314就是一個賬本的工作量證明,通過花費大量算力去窮舉出某個數,讓該數與賬本內容的哈希值其前60位為0,這個數就能用來證明你花費了很多計算資源,它就是工作量證明PoW,如果有人稍微修改賬本中的內容,那麼通過SHA256函數計算出的結果就全變了,為了再次獲得前60位為0的哈希,你只能再次去窮舉計算

有了工作量證明的賬本我們一般不稱它為賬本,而稱它為區塊

還有一點需要知道的就是,PoW要求計算出的特殊哈希值,如前60位為0,這些0的個數是有規律變化的,比如過段時間PoW要求計算前62位為0的特殊哈希,其目的是為了確保平均每10分鐘會建立一個區塊,平均這個詞很重要

區塊鏈

從上面的描述可以知道,區塊就是有工作量證明的賬本,大概的樣子如下

我們已經知道,這個區塊通過加密散列函數,如SHA256計算後就可以獲得前60位都是0的特殊哈希,這個特殊的哈希值其實也唯一的表示了這個區塊,我們會將這個哈希存到下一個區塊的頭部,將多個區塊通過區塊哈希串聯起來獲得一個鏈狀數據結構就是區塊鏈,如下圖,圖中的256bit的二進位哈希轉成了十六進位的(該哈希的具體內容是對女朋友的一句情話:-D)

這裡需要提一下,SHA256是對整塊區塊進行哈希計算,其中包括區塊的頭部,這點讓區塊鏈具有不可修改的特性,以及記錄在區塊上的內容是也是無法修改的,如果你修改了一個區塊中的內容,比如該了賬本中的交易記錄,那麼該區塊通過SHA256計算出來的哈希就完全變了,你要重新計算你修改內容後的區塊的哈希,讓該哈希前60位為0,獲得工作量證明數,但你發現下一塊區塊頭部存儲的哈希也要改變,這又導致該區塊的哈希改變,你又需要獲得新的工作量證明數。也就是說修改一個區塊,該區塊後的所有區塊都需要重新做PoW和修改,這需要巨大的算力支撐。

你可能會想,修改最後一塊區塊就好,就沒有所謂的連鎖反應?這個放到文章後面討論。

區塊鏈是一個鏈狀數據結構,那第一個區塊它的區塊頭部存了什麼?因為它本身開頭,所以沒有上一塊了,那頭部記錄上一塊的地方存了什麼?你好不好奇我不知道,反正我學的時候很好奇,所以我就去找了,第0個區塊

從圖中可以發現,創世區塊(第0個區塊)中本該存上一塊區塊哈希的地方存的都是0

挖礦與礦工

任何人都可以成為區塊的建立者。

成為建立者意味著你將要收聽網路中的交易廣播,將這些交易信息整理成一個賬本然後通過巨大的算力去計算獲得工作量證明(PoW),將獲得的PoW和賬本內容整理成一塊區塊廣播出去,可以看出要建立區塊需要花費算力,簡單說就是水電費、設備折舊費等,這些都是成本費用,所以為了鼓勵建立區塊的人,系統會獎勵區塊建立者的算力付出,當他建立一個區塊時,系統規定他可以將一筆特殊的錢記錄到區塊的賬本開頭,這叫做區塊獎勵,這也就是我們接受或拒絕交易信息規則的一個例外情況,它不來自任何人,不需要數字簽名。

通常我們將區塊的建立者稱為礦工,將建立區塊這個過程稱為挖礦,很形象。

總結一下,礦工要做的事情就是,收聽交易信息、建立區塊、廣播區塊、獲得區塊獎勵。

在Bitcoin中,區塊獎勵一開始是50個比特幣,每4年減少一半,比特幣在2009年1月3日出現,所以到現在區塊獎勵是12.5個比特幣,其實也就可以計算出比特幣的總量是2100萬枚。礦工挖礦獲得的區塊獎勵為整個比特幣體系引入了新的比特幣。

如果你只是用比特幣進行交易,那麼你只需要收聽礦工發出的區塊廣播,然後更新自己那一份區塊鏈就好了,建立區塊的事情交給礦工,同時為了感謝礦工將你的交易記錄寫到區塊賬本上,你還需要給礦工一些手續費,這也是礦工另外一個收入來源,這筆交易同樣會記錄到區塊賬本中,這是在進行PoW前就記錄好的,如果你產生的區塊被添加到大家的區塊鏈中並被認可了,自然就獲得這份小費了。

還有一點,在Proof Of Work小節中提到,PoW特殊哈希前n位的0是有規律變化的,確保平均每10分鐘會建立一個區塊。那麼當越來越多人加入礦工的挖礦隊伍時,算力資源的加大會讓區塊產生的速度越來越快,為了確保平均每10分鐘才創建區塊,計算出特殊哈希的難度也會越來越高,現在不是定製的礦機幾乎計算不出特殊哈希(就是挖不出礦)

比特幣體系安全問題

現在你已經弄明白了比特幣和區塊鏈了,雖然還有很多技術細節沒有弄清楚,但是已經對比特幣有了一個大體的把握了,那麼一個隨之而來的問題時就是比特幣體系安全可靠嗎?具體會有下面幾個問題

如果你同時收到兩份不同的區塊鏈怎麼辦?

我們選擇更長的那一份區塊鏈,因為更長的區塊鏈消耗了跟多的計算資源,如果你收到的兩份不同的區塊鏈長度相同,那你等待下一個區塊廣播,直到可以選出更長的那一份區塊鏈,總有一份會成為最長區塊鏈,這也意味著,每個人都需要維護更新自己那份區塊鏈。如果每個都信任最長的那份區塊鏈(消耗最多算力),我們就可以構成一個去中心化的組織

如果有人惡意修改了區塊鏈中某一個區塊的信息怎麼辦?

修改了區塊中的信息就需要重新進行PoW,而且這個區塊的哈希也發生了改變,因為該塊哈希變了,那麼下一塊區塊頭部存儲的哈希也要改變,頭部存儲的哈希一變,又需要重新計算PoW,這是個重複的過程,直到區塊鏈中最後一塊區塊,就算你經過不懈的努力做到了,成功的修改了某個區塊中的哈希,並獲得了一個新的區塊鏈,但是你在運算PoW的時候,其他礦工依舊在挖礦,也就說,此前的那份區塊鏈變得更長了,你計算出來的區塊鏈將不會被接受,除非你擁有超過全網51%的算力,你才有能力修改區塊中的內容,生成新區塊鏈,並且慢慢追上其他礦工的挖礦速度,讓自己的區塊鏈最長,這也就是著名的51%攻擊,要用於51%的算力非常困難

如果有人修改最後一個區塊呢?或者直接發送偽造的區塊廣播?

跟上一個回答類似,修改最後一個區塊或直接發送偽造區塊廣播,因為是區塊鏈中最後一個區塊,所以只需要計算當前區塊的PoW就好了,但是為了讓網路上所有人的信任它這份區塊,偽造者就需要像礦工一樣多創建幾個區塊並廣播出去,因為我們在接收到區塊廣播時通常會等待一段時間用於接收更多的區塊廣播,然後選擇最長的區塊鏈,確保自己收到的區塊都是可信的,所以偽裝者必須創建多幾個區塊,這相當於跟全世界的礦工競爭,除非你擁有超過全網51%的算力,不然你很難創造出最長的區塊鏈

結尾

上面的內容只是比特幣的基本知識,還有很多內容沒有涉及,比如空區塊?為什麼規定成10分鐘而不是5分鐘或其他時間?區塊鏈的分散式在工程上還要考慮什麼等等?當然上面的內容也希望你辯證的去看,個人能力有限,可能對某些概念的理解有偏差,而且我是喝著啤酒寫下這篇文章的:-D

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 懶寫作 的精彩文章:

TAG:懶寫作 |