當前位置:
首頁 > 最新 > 捋一捋比特幣的實現思路

捋一捋比特幣的實現思路

前言

比特幣的概念很多,每個理解起來都挺費勁。以至於比特幣科普牛人——湯強老師解釋其中的任何一個概念的時候都需要用一大篇文章來解釋。

但是好不容易單個概念弄懂了,又不明白中本聰為什麼要這麼設計。不識廬山真面目,只緣身在此山中。當我們鑽進細節中的時候,反倒迷糊了。

所以我們可以先知其所以然,然後再去探究細節本身的時候就會輕鬆很多了。下面我就嘗試忖度一下中本聰大神是如何一步一步設計出整個比特幣系統的。

由於本人水平有限,改了幾遍,發現還是有些地方說的不清楚,但是又不知道怎麼改更好,大家湊合讀吧。只希望給大家換個角度看問題,能有一些啟發。

實現思路

那我們就從中本聰要實現的目標出發。如比特幣白皮書的標題所示,比特幣的目標是:比特幣——一種點對點的電子現金系統

1

點對點,意味著不能有第三方機構來確認交易,那麼就需要有一個只能添加數據和查看數據的記賬系統(資料庫系統),添加完了以後就不能修改和刪除了。

2

為了實現這個目的,這個記賬系統需要是分散式的,這樣就沒有人可以一下子修改全部的節點上的數據了。

節點是分散式的,就需要用P2P技術進行數據的同步。而P2P技術的直觀感受就是——我們經常用種子下載電影的那種技術。

3

為了讓數據不能被修改,那麼需要把一段時間的交易數據放到一個盒子里,然後想辦法把這個盒子存起來,不讓人修改,這個盒子就是區塊(block)。

4

單個的放數據的區塊還是可以人為的修改,那麼就需要想辦法把單個區塊前後串起來,修改其中任何一個,後面的就連不上了,從而保證任何一個塊一旦放到鏈當中就不可修改了。

5

用於連接的這個鏈,就是在後一個區塊中保存前一個區塊的哈希值。這樣,改動了前一個區塊中的任何一個數據,它的哈希值都會發生巨大的變化,就會和後一個區塊中所保存哈希值不相等。

所以,鏈入區塊鏈中的區塊是無法修改的。

至此,區塊鏈的雛形已經出現了,下面要解決的是轉賬的問題了。

6

為了保證轉賬的可靠性,用非對稱加密的解決方案最好。首先在一個很大的範圍(0-2^256)設置一個私鑰,根據概率學的原理(在附錄中說明),不可能有兩個人會有相同的私鑰,然後用這個私鑰給交易簽名。查詢和確認交易的人只需要用私鑰對應的公鑰進行解密就可以了。

7

下面要解決的就是記賬的問題了。記賬雖然也是機器處理的,但是每個節點的機器背後還是一些活生生的人,要想讓他們不作弊,就需要給予誠實的記賬以獎勵,同時也保證了這個系統中的貨幣的供給。這就是比特幣節點挖礦獎勵比特幣的原因了。

一個節點取得了記賬權,如果他好好記賬,那麼就可以拿到獎勵,如果有了記賬權,卻故意記錯了賬,那麼這個獎勵就沒有了。

8

記賬有獎勵,那很好,人人都想記賬,所以得想個公平公正的法子去爭奪記賬權了。於是就需要設計一個「共識演算法」——讓所有節點都能達成共識,同意用這樣的方式來解決問題。

9

那就隨機唄,擲骰子。在加密的世界裡,哈希演算法就是很隨機的擲骰子的方式。賬記完了,那我們就用這個賬本的內容,加上一個隨記的數字,去擲骰子(哈希計算),保證他們合在一起的哈希值前面有幾個零,誰先找到這個哈希誰就有記賬權。這個很公平隨機,不過誰的電腦計算的快就能更大概率地找到這個隨機數,但是只要方法是公平公正的,硬體問題就需要記賬的人自己解決了。大家都升級硬體,只要每次獎勵的比特幣夠硬體升級的花費就行。

10

記完賬,問題又出現了。如果有人幾乎同一時間畫出兩筆BTC,而這個地址的餘額又不夠同時支付兩筆交易,怎麼辦?中本聰的辦法就是看交易的時間戳,哪個先發生就以哪個為合法的交易。

還有一個問題,如果由於網路問題,上面所說的兩筆交易被不同的礦工幾乎同時打包進區塊又怎麼解決呢?中本聰的辦法是隨它去,讓區塊自由生長,最終以增長快的鏈為準,廢棄短的鏈。

以上解決問題的辦法看似不怎麼負責,但是卻是解決問題最簡單有效的途徑。所以我們在轉賬最終到賬需要若干個區塊的確認。因為當出塊的數量達到一定數量的時候,即使有分叉的鏈也不會比當前的鏈長,會被廢棄掉,從而使當前最長鏈中保存的交易也就不可篡改了。

11

繼續看礦工的選擇。好不容易輪到一次記賬權,只要誠實記賬就有獎勵,誰也不會亂記賬。即使有位作惡的礦工亂記賬,但是如果他算力不夠大,不能保證一直在錯誤的鏈上記賬下去,把錯誤的鏈打造成最長的鏈,也不會作惡成功。最終不僅作惡失敗,還失去了記賬的獎勵,賠了夫人又折兵,正常人都不會去做的。

12

如此這般,比特幣的系統差不多設計完成了。但是還有一點漏洞,如果作惡的礦工不僅壞,還擁有了超過了51%強大的算力,為了謀取自己的私利,故意記錯賬,怎麼辦呢。這個時候,由於比特幣會選擇最長的一條鏈,擁有超過51%算力的礦工可以製造出一條錯誤的較長的鏈,雖然顛倒黑白了,但是別人拿他也沒有辦法了。這個時候,作惡的礦工雖然拿到了雙重支付的好處,但是卻破壞了系統,會導致幣價大跌,作弊弄來的比特幣也不值錢了,連手上花重金買來的礦機都成廢鐵了。

所以,即使擁有超過51%算力的礦工也不會做損人不利己的事情,放棄作惡的行為。所以至今為止都沒有出現擁有巨大算力而為所欲為的礦工,因為他被綁定在了比特幣系統了,只有整個系統好他才會受益。

小結

至此,整個比特幣系統的設計算是復盤完成,能順利實現一種點對點的電子現金系統的意圖了。其他的技術細節,如merkle樹,UTXO等,都是讓整個系統更巧妙的錦上添花的設計。

我們復盤一下都是如此艱難,真不到中本聰大神當年是怎麼想到把這麼多技術和思想雜糅到一起設計出這麼精妙的系統的。

想實現不可篡改的資料庫系統似乎沒有那麼複雜。但是要結合密碼學、經濟學等因素防止惡意破壞的交易者和礦工卻是花費了很多考慮。這也是比特幣能穩定運行這麼多年的關鍵——用代碼的規則去懲惡揚善。

附錄:概念簡單解釋

1.數據區塊:

比特幣的區塊鏈中記錄數據的單個區塊。

包含當前版本號(version)、前一區塊的哈希(pre-block)、時間戳(timestamp)、隨機數(nonce)、當前區塊的哈希值、merkle樹(merkle-root,類似紙牌屋)的根值。

2.挖礦:

找到隨機數(nonce)值,使得區塊高度+前一區塊的哈希值+時間戳+當前區塊的數據+nonce的哈希值滿足一定的規則,也就是區塊難度,哈希值的前面有若干個零。哈希不可預測,所以nonce只能一個個數字嘗試,直到找到為之。

3.時間戳:

時間戳是指從格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數。每個時間點是唯一值。防止雙重支付的時候就是根據這個時間戳判斷,時間靠前的交易生效,時間靠後的交易無效。

時間戳的值在世界各地的同一個時間都是相同的,與時區無關。每個時區的時間就是通過時間戳加上時區換算而成的。

4.分散式(Decentralized)資料庫:

每個挖礦的節點保留了所有的交易數據,當一個節點被破壞不影響整個資料庫的運行。

其中,英文原文為「decentralized」,翻譯為分散式,或者叫分散式,現在卻被翻譯成去中心化的,造成很多問題。

分散式的,可以有一個或多個中心節點,許可權比較大。去中心化,似乎就不能有中心了。目前比特幣礦池算力集中,不是很去中心化,但是還是分散式的。大家都在爭論的是否「去中心化」本身就是個翻譯的謬誤,失之毫釐,差之千里。

5.UTXO(unspent transaction output):

未花費交易輸出,計算某個地址的比特幣數量,只是統計這個地址匯入的,但是還沒有花出去的比特幣。如果一個地址有100條交易,需要記賬100次,但是記賬未花費的交易輸出就簡單了,搜索一下一個地址上的未花費的交易輸出就可以了。一個地址的總的UTXO可以理解為每次交易後餘額的匯總的值。

所以BTC轉賬的記錄的方式就比較奇怪了,每次轉賬都會把一個賬戶的UTXO收集起來。比如轉賬1BTC,可能會收集這個地址的1.1個BTC,轉1個BTC到目標賬戶,剩下的除去一部分曠工費,然後轉到自己的地址,也就是「找零」。

一開始我對「找零」這個說法感到特別奇怪,理解了UTXO後才明白比特幣為什麼會有「找零」。

總而言之,設計UTXO這個概念的目的是為了節省硬碟存儲——不需要記錄每一次轉賬的過程,只需要記錄轉賬的結果。

6.哈希:

SHA256演算法,任何數據都可以轉化為一個長度為256的二進位數字。這有點像數學中的求餘數,再大的數,除以一個2^256後的餘數一定是在0和2^256之間的數。不過哈希演算法要複雜很多,因為要盡量避免不同的內容計算出的哈希值重複。

7.merkle數:

一種數據結構。

有點像紙牌屋,最底下的牌代表了每一筆交易,上面紙牌是緊鄰的下一層的哈希值,最終只保存最上面一個點的哈希值。任何一筆交易數據的改動都會導致最上面的點的哈希值的改變。就像紙牌屋搭好了,不要妄想動任何一個最下面的紙牌,因為一動就全部倒了。

主要目的是為了保證數據的可靠性,順帶節省存儲空間。

8.雙重支付:

只記錄最早的交易。實際過程中需要考慮分叉、孤塊、確認等的問題,但是核心的原則只有一個——如果花費的錢超過地址上的餘額,只記錄最早發起的那一次交易

9.P2P網路:

這個概念很早就有了,迅雷等下載軟體用的就是P2P技術,網路中每個節點的地位相等,更新數據的時候從相鄰的電腦下載即可。這個技術保證了比特幣的賬本資源在每個用於挖礦或者是記賬的全節點中都是一樣的,同時任何一個節點被破壞了,也能從相鄰的節點重新下載賬本數據。

10.非對稱加密:

以往的加密方式,加密的密碼和解密的密碼是相同的。非對稱加密的特點就是加密和解密的密碼不同。用私鑰進行加密就只能用公鑰進行解密,用公鑰進行加密只能用私鑰進行解密。這就保證了用某個地址進行交易的時候只有私鑰的擁有者才能發起交易,而其他人用公鑰就能查看交易。公鑰和地址都是可以用私鑰計算而得出,反之卻無法計算出來。

私鑰是在一個很大的範圍(0-2^256)內隨機選擇的。而2^256是一個非常大的數,僅比整個宇宙的原子數量少幾個量級。這個範圍內遇到重複的私鑰的概率比這個概率還要小:一個不知道在宇宙的某個角落有個外星人,把一顆寫上他名字的玻璃珠隨手扔到太空中,然後我們地球上的人在茫茫宇宙中找到這顆玻璃球。

科技發展,這麼多年都沒有發現外星人,更別說找到那個特定的不知道在宇宙的某個角落的玻璃珠。所以這是不可能事情。所以地球上的人會遇到兩個同樣的私鑰的可能性比這件事的概率還要低。

11.數字簽名:

數字簽名就是用私鑰對發送的交易進行簽名加密,保證這個交易是由私鑰持有者發出的,礦工驗證的時候只需要用私鑰對應的公鑰進行解密就知道數字簽名是否有效。沒有用私鑰進行簽名的交易就沒有許可權花費這個私鑰對應的地址上的UTXO。

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

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


請您繼續閱讀更多來自 一個大於號 的精彩文章:

TAG:一個大於號 |