白話比特幣與區塊鏈

都 9102 年了,連大大都發話要大力發展區塊鏈技術,還不來趕緊了解下區塊鏈知識嗎。本篇文章主要是科普向,建立對比特幣和區塊鏈的基本認知。

一、比特幣誕生

2008 年在世界金融危機的大背景下,有一個化名爲中本聰的極客,在互聯網上發表了一篇名爲《Bitcoin: A Peer-to-Peer Electronic Cash System》 的文章。他在這篇文章中提出了設計一種去中心化的電子記賬系統的設想。

我們知道,在當今時代,進行支付最重要的一件事情就是記賬。所謂記賬,就是要有人記錄你的賬本的資金變動,例如使用銀行卡支付,實際是由銀行進行記賬。銀行的背後是中央政府,代表的是國家的信用,我們都信任他,這裏的銀行就是一個中心化的電子記賬系統

如果這個節點出現了問題,那麼我們的資金安全就受到了威脅。 還記得前幾天微信支付直接崩掉了,有用戶就反饋說付款後商家沒有收到,而餘額已經扣除的問題。

中本聰提出的觀點就是,我們其實並不需要這個中心化的節點,我們可以去中心化,每一個人的賬本都是公開,可被他人查閱的,這就是去中心化的電子記賬系統

舉個例子來說,假設存在用戶 A、B、C,他們之間進行互相支付。A付給B 10塊錢,A付款後,A將 A付給B 10塊錢這條賬單記在自己的賬本上,爲了讓其他人都知道,A 將這條賬單記告訴所有人,告訴B,又告訴了 C。過了一會B也要支付,它付給C 5塊錢,同時他又把這條賬單告訴給了A,告訴了C。

現在這三個用戶每個人都收到了兩條賬單記錄,我們會把這兩條賬單記錄進行打包,打包後形成一個塊,稱其爲區塊。當這個區塊被打包完成後,我們再把這個塊鏈接到以前的交易記錄上,鏈接成一條鏈,這條鏈就叫做區塊鏈

區塊鏈

以上大致就是中本聰所設計的系統,那麼這個系統存在幾個問題,比如:

  • 爲什麼要去記賬? 憑什麼你告訴我的賬單記錄,我要記錄下來,並且打包到鏈上去呢。
  • 賬單以誰爲準? 因爲每個人的賬單可能不一樣的,比如因爲網絡原因,剛剛的那兩條賬單記錄的先後順序可能不一樣。
  • 如何防僞? 收到的賬單記錄可能是僞造的,並不真實存在。
  • 如何防止雙重支付(雙花問題)? A只有10塊錢,但他同時分別轉賬給了兩個人10塊錢。
  • 如何進行保密? 既然賬單都是公開的,那麼其他人不就知道你的資產了嗎?

二、爲什麼要去記賬?

驅動用戶去記賬的原因是因爲記賬有收益,收益包括兩個方面:

(1)賬單的轉賬方多交的手續費

比如你正在打的包中,有一條賬單是A付給B 10塊錢,那麼A可能實際支付了 10.5 塊錢,多出來的 0.5 塊錢也就是給打包者的收益(通俗點說就是支付寶提現到銀行卡、銀行卡跨行轉賬時的手續費)。

(2)打包成功後的打包獎勵

中本聰在提出這個系統時,建立了一套打包獎勵方案。規定每十分鐘打出一個包,最初的一個包會獎勵給打包者 50 個比特幣,每過四年打包獎勵減半

那麼第一個四年的總獎勵就是 10512000 比特幣。

506243654=10512000 50 \ast 6 \ast 24 \ast 365 \ast 4 = 10512000

由於每過半年減半,那麼可以推算出總的比特幣個數約等於2100 萬個,比特幣就是通過打包獎勵這種方式向外擴散出去。

10512000(1+12+(12)2+(12)3++(12)n)2100 10512000 \ast (1 + \frac{1}{2} + {(\frac{1}{2})}^2 + {(\frac{1}{2})}^3 + … + {(\frac{1}{2})}^n) \approx 2100萬

三、賬單以誰爲準?

3.1 工作量證明

打包只能夠以一個人爲準,解決的辦法叫做工作量證明,所有想要參與打包的用戶(後文稱其爲礦工)都要去做一個非常複雜的數學運算,複雜到使用計算機都要運算非常久,誰最先計算出來誰就有權利去打包,也就能獲得手續費獎勵和打包獎勵。計算這個數學題的過程,就被稱爲挖礦

3.2 挖礦的具體原理

這個數學運算其實跟計算機中的 SHA256 哈希函數有關。哈希算法的特點,是正算容易、逆算困難,因此被廣泛用戶加密領域。而 SHA256 的特點是把任意大小的字符串參數,其哈希結果都是 256 位的二進制數,故得名 SHA256。

SHA256 算法

區塊鏈本質上就是一個線性鏈表數據結構。通俗點說就是鏈上包含了所有的賬單信息,這些賬單信息分佈在一個個區塊上,每一個區塊通過指針鏈接到它的前一個區塊上。

下面開始具體說下挖礦的原理了,如果我想要打包一個區塊,那麼我需要準備好以下信息:

  • 目前區塊鏈上最後一個區塊的頭部信息(便於鏈接)
  • 收集到的尚未被打包的賬單
  • 開始打包的時間戳
  • 一個隨機字符串 x

然後我們將以上的信息都拼接成一個字符串,對其連續做兩次 SHA256 運算,會得到一個字符串結果 y。系統會告訴我們如果當前想要成功的打包區塊,這個結果 y 需要滿足前 n 位必須爲 0。如果我們得到的這個結果 y 正好滿足這個要求,你將最後算出來的這個 x,作爲新塊的頭部,接到區塊鏈最後面去。那麼我們就打包成功了。

當然,想要滿足結果 y 前 n 位必須爲 0 的條件是異常苛刻的,在打包的區塊信息中,能改變的就是那個隨機字符串 x。通過讓計算機進行窮舉法去嘗試那個 x 的值,直到試出一個滿足條件的值。

另外,每個人在計算的時候的難度其實是不一樣的,因爲每個人打包的賬單不同,開始的打包時間也不同。所以可能存在有人運氣好,很快就算出結果,有人運氣差,怎麼都算不出來。

拋開運氣,想要比別人更快的算出結果,就只能提高計算機的算力(運算速度),也就是我們經常聽到的買礦機、買礦卡

礦機

3.3 難度設置

接上一節所說,計算成功的難度和 n 值是密切相關的。n 越小,難度也就越低,n 越大,難度也就越大。n 爲 1 挖到概率是 1/2,n 爲 2 挖到概率是 1/4,因此挖到的概率就是 (12)n{(\frac{1}{2})}^n

121212n2=(12)n \frac{1}{2} \ast \frac{1}{2} \ast \frac{1}{2} \ast … \frac{n}{2} = {(\frac{1}{2})}^n

那麼這個 n 是如何確定的呢?前面說到,打包獎勵方案中規定每十分鐘打出一個包,因此 n 會根據當前整個區塊鏈的全網算力來動態調整的。

假設目前全網有一萬臺礦機,每臺礦機的算力是 14T/s(每秒進行 14T 次哈希運算,1T=10121T = {10}^{12}),計算可得十分鐘全網能算 8.410198.4 \ast {10}^{19} 次。

1.41013100006010=8.41019 1.4 \ast {10}^{13} \ast 10000 \ast 60 \ast 10 = 8.4 \ast {10}^{19}

又因爲計算成功的概率是 (12)n{(\frac{1}{2})}^n,也就是說平均的計算的次數要是 2n2^n。那麼 8.410198.4 \ast {10}^{19} 相當於 2 的多少次冪呢。

8.41019266 8.4 \ast {10}^{19} \approx 2 ^ {66}

計算結果大致是 66,也就是說系統會將 n 的值設置爲 66,第一個計算出結果前 66 位都爲 0 的礦工,就有資格進行打包,俗稱挖礦成功。

閒扯下,如果你想更快的挖到礦,不考慮運氣的話,你只能不停地買礦機提高算力。而其他礦工也是這樣想的,導致全網算力提高,挖礦難度也隨之增大,就是一個輪迴啊。AMD 和 Nvidia 表示很開心。

四、如何防僞?

如何保證比特幣的交易記錄是真實的,比特幣是如何進行身份認證的?傳統的身份認證方式包括:刷臉、簽名、指紋等等。但是這些方式在電子支付系統中都不能實現,因爲利用計算機系統都可以進行拷貝。比如拷貝下你的簽名,然後添加到我僞造的記錄上。

因此必須對傳統的身份認證方式進行更改,比特幣採用的身份認證方式叫做電子簽名

用戶在創建比特幣錢包時候,會生成一個隨機數,根據這個隨機數,會產生一個名爲私鑰的字符串。根據私鑰字符串,又可以產生一個名爲公鑰的字符串,根據公鑰產生你的比特幣錢包地址。

私鑰和公鑰採用的是非對稱加密方式,即通過私鑰能夠計算出公鑰,但是通過公鑰無法計算出私鑰。私鑰的作用是可以對一個字符串進行加密,而公鑰的作用是可以對加密的字符串進行解密。 私鑰私有,只有你能夠加密。公鑰公開,所有人都可以解密你加密後的信息。

私鑰是十分重要的,如果私鑰丟失或泄露,那麼你錢包中的比特幣就都丟了。公鑰和地址都是對外公開的,當他人向你轉賬時,你需要提供地址即可;當你向他人轉賬時,需要提供公鑰和地址。

假設A付給B 5 個比特幣,首先A寫一條 “A付給B 5 個比特幣”這條記錄,寫完這條記錄後,A將這條記錄,利用 SHA256 算法進行哈希運算,得到一個字符串(稱作數字摘要)。隨後A利用自己的私鑰對這個字符串進行加密,得到一個密文。

隨後A對全網進行廣播,告訴全網 “A付給B 5 個比特幣”這條記錄,然後將自己的公鑰和加密後的密文一起廣播出去。

其他人接收到這條廣播後,需要驗證這條消息的真實性。首先將 “A付給B 5 個比特幣”這條記錄進行SHA256 哈希運算,得到一個摘要1(這裏的摘要1應該是和A自己計算的摘要是一致的),然後利用廣播中的公鑰將廣播中的密文進行解密,得到摘要2。

前文說過,公鑰作用是可以將私鑰加密的字符串進行解密。因此如果消息真實,那麼摘要1就會等於摘要2。如果計算結果不相等,那麼就認爲這條消息是僞造的,所有礦工都會拒絕這條記錄。

五、如何防止雙重支付?

5.1 餘額檢查

比特幣進行餘額檢查最簡單的方式是追溯,前面說過所有用戶的比特幣支付信息都會被記錄在區塊鏈上,那麼當我接收到A的轉出5個比特幣的消息,就會順着區塊鏈的末端,向前一個區塊一個區塊的去查找你是否有足夠多的餘額去支付。

比如向前查找到你通過挖礦賺了6個比特幣,那麼就認爲餘額足夠;如果不滿足條件就繼續向前找,直到滿足條件,或者找到開頭仍不滿足。

其實目前已經不再採用這種方式進行餘額檢查,但那已經不在本文的探討範圍。

5.2 雙重支付

如果用戶A只有5個比特幣,但他同時向全網廣播了“支付給B 5 個比特幣”、“支付給C 5 個比特幣”這兩條記錄。那麼到底轉賬給誰成功了了?如何防止這種雙重支付問題呢?

前面說到,由於網絡原因,每個礦工接受到的賬單先後順序是不同的。那麼有些礦工可能先收到“支付給B 5 個比特幣”,有些礦工先收到“支付給C 5 個比特幣”,有些礦工可能同時收到這兩條記錄。

如果同時收到這兩條記錄的話,餘額檢查這一步就通過不了,記錄會被拒絕。

如果只收到一條記錄的話,首先餘額檢查通過,然後開始打包,進行挖礦。注意由於收到的順序的不同,有的礦工打包的內容是“支付給B 5 個比特幣”,有的礦工打包的是“支付給C 5 個比特幣”。這都沒有關係,因爲只要沒有人挖礦成功,這些區塊都只存在本地,不會真的生效。

直到某個礦工打包成功了,他所打的區塊被鏈接到區塊鏈中,那麼其他的打包者發現自己打的包中的記錄已經被別人打到了區塊鏈中,他就會主動放棄自己打的包。

也就是說,雙重支付情況下,哪條支付記錄先被打到區塊鏈上,哪條支付就會生效,另一條支付就會因爲餘額不足而失效。

六、如何防止篡改?

6.1 最長鏈原則

前文說到,礦工將自己的收到的賬單打包成區塊後,開始挖礦。誰先挖到,誰就獲得獎勵,那麼另外一個人其實就沒有必要再挖了。但是有一些礦工就表示,我不管,我就要接着我的挖,我纔不管你先挖到,最後還真讓他給挖出來了,然後這個礦工也把他自己挖到的塊鏈接到區塊鏈上。那麼此時的區塊鏈就出現了分叉了,從一條鏈分叉成了兩條鏈。其他的礦工就懵逼了,我現在打的包該鏈在誰的後面啊。

爲了解決這個問題,區塊鏈給出的原則是哪一條鏈最長,就以哪一條鏈爲準,即最長鏈原則

接着上面的例子,此時這兩條分叉的鏈一樣長,那麼礦工就會隨便選一條在後面挖礦。直到某個分叉上的礦工先挖出來了礦,那麼此時分叉的鏈就不一樣長了。此時另一個分叉的礦工們都會一溜煙的跑去最長的那個分叉上。

那一條短的分叉就被拋棄了,其上的所有區塊的交易也都無效了。

最長鏈原則

6.2 51% 攻擊

前文在說“如何防僞”的時候說過,所有對外廣播出去的賬單記錄,都會附帶廣播者的公鑰和密文,來確保賬單記錄的真實。因此除非你擁有廣播者的私鑰,才能篡改其他廣播者的賬單記錄。如果私鑰丟失了,就沒有必要去篡改了,畢竟整個錢包都能讓你操作了。

既然不能篡改賬單記錄,那我能直接刪掉記錄嗎?理論上是可以的,依據最長鏈原則

比如我支付給某人5個比特幣,這條記錄廣播出去,且被正式鏈到了區塊鏈上,成爲了最後一個區塊。現在我想篡改掉,直接刪除掉這條轉賬記錄,如果真的讓我刪除成功了,我的餘額就不變了。

由於這條記錄已經被打包成了區塊,記錄到了區塊鏈上,那麼其他的礦工自然會在這個區塊後面繼續挖礦。而你由於想要篡改掉這條轉賬記錄,你就必須把這個區塊裏的自己的轉賬記錄刪除掉,並重新打包區塊,鏈接到最後一個區塊的前一個,構造出一個分叉出來。

而在你刪除記錄、重新打包、挖礦、鏈接到最後一個區塊的前一個區塊的過程中。世界上除你以外的其他所有礦工,都在原本的鏈上繼續往後挖。

依據最長鏈原則,你必須使得自己構造的分叉比原有鏈還要長,纔會讓其他礦工都到你構造的分叉鏈上來挖。如果你真的成功了,你也就篡改成功了。

51% 攻擊

區塊鏈之所以這樣設計,就是它相信,不懷好意者終究只是少數。除非你的算力超過世界上所有人,你纔有希望使得你構造的分叉鏈超過原有鏈。

這也被稱爲51% 攻擊,即發動全網 51% 的算力,去構造出一條分叉鏈,使得原有鏈分叉區塊以後的交易全部失效。因此,如果掌握 51% 的算力,這條鏈也就被你所掌握了。

七、區塊鏈發展史

  • 2008 年
    • 中本聰(Satoshi Nakamoto)是個人或團體的化名,他出版了“ 比特幣:點對點電子現金系統”。
  • 2009 年
    • 首次成功的比特幣(BTC)交易發生在計算機科學家 Hal Finney 和神祕的中本聰之間。
  • 2010 年
    • 佛羅里達州程序員 Laszlo Hanycez 完成了有史以來第一次使用比特幣的交易——兩份 Papa John’s 披薩。Hanycez 轉移了 10,000 個BTC,當時價值約 60 美元,被稱爲史上最貴的披薩。
    • 比特幣的市值正式超過100萬美元。
  • 2011 年
    • 1 BTC = 1 USD,給予與美元的加密貨幣平價。
    • 電子前沿基金會,維基解密和其他組織開始接受比特幣作爲捐贈。
  • 2012 年
    • 在諸如《老婆婆》等熱門電視節目中提到了區塊鏈和加密貨幣,將區塊鏈注入了流行文化。
    • 早期比特幣開發商 Vitalik Buterin 發行《比特幣雜誌》。
  • 2013 年
    • BTC市值超過 10 億美元。
    • 比特幣首次達到 100$ / BTC。
    • Buterin發表“ 以太坊項目 ”論文,暗示區塊鏈除比特幣外還有其他可能性(例如,智能合約)。
  • 2014 年
    • 遊戲公司 Zynga,The D Las Vegas Hotel 和 Overstock.com 都開始接受比特幣付款。
    • Buterin 的以太坊項目通過首次代幣發行(ICO)進行衆籌,籌集了超過1800萬美元的BTC資金,併爲區塊鏈開闢了新途徑。
    • R3 由200多家區塊鏈公司組成,旨在發現可以在技術中實施區塊鏈的新方法。
    • PayPal 宣佈整合比特幣。
  • 2015 年
    • 接受 BTC 的商戶數量超過 100,000。
    • 納斯達克和舊金山區塊鏈公司 Chain 聯手測試該技術以交易私人公司的股份。
  • 2016 年
    • 科技巨頭 IBM 宣佈了基於雲的業務解決方案的區塊鏈戰略。
    • 日本政府認識到區塊鏈和加密貨幣的合法性。
  • 2017 年
    • 比特幣首次達到 1,000$ / BTC。
    • 加密貨幣市值達到 1500 億美元。
    • 摩根大通(JP Morgan)首席執行官傑米·戴蒙(Jamie Dimon)說,他相信區塊鏈是一種未來技術,這使分類賬系統獲得了華爾街的信任。
    • 比特幣達到歷史新高的 19,783.21$ / BTC。
    • 迪拜宣佈其政府將在2020年之前採用區塊鏈技術。
  • 2018 年
    • Facebook 致力於建立一個區塊鏈組織,並暗示可能創建自己的加密貨幣。
    • IBM 開發了一個基於區塊鏈的銀行平臺,並與 Citi 和 Barclays 等大型銀行簽約。
  • 2019 年
    • 央行表示將發行數字貨幣 DCEP,1 DCEP = 1 RMB。
    • Facebook 發行 Libra,遭遇國會質詢,合規之路曲折。
    • 中央表示要大力發展區塊鏈技術,國家電網等區塊鏈“國家隊”進場。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章