首先中本聰在摘要中就指明瞭要創建的是一個去中心化的p2p支付系統,而且不引入第三方來解決雙重支付(double-spending)問題。而且提出瞭解決方案思路,說起時間戳(Timestamps)、工做量證實(Proof-of-Work)等技術要點。算法
接下來看正文內容……服務器
當前互聯網上的金融貿易,無不都藉助於可信賴的第三方,如國家強制性機構(銀行),超大企業(支付寶、微信)等,是一種「基於信用的模式(trust based model)」,不是說當下模式很差用,只是既然基於信用,則須要持續不斷的維護信用,其成本很是巨大。微信
因此比特幣出現了,它再也不基於信用而是基於密碼學原理,使得虛擬交易能夠在雙方達成一致,直接支付,不須要第三方參與。網絡
因爲直接支付,確認後沒法更改,因此是對賣家的一種保護,而對買家的保護,中本聰則提出「在此環境下一般設立第三方擔保機制也可謂輕鬆加愉快」。其實說白了,比特幣系統在設計上對交易雙方是不平等的,天平更傾向於賣家,就像淘寶上買東西,杜絕了買家買貨後給差評拒不付款的狀況。但同時因爲比特幣交易確認後沒法更改,也從另外一個方面致使買家付了款而賣家據不發貨的漏洞。electron
這就是比特幣給咱們的另外一個注意點,比特幣網絡實際上是替代的中心化的信用機構,並不能保證交易雙方的信用。就像上面說的買家拒不付款、賣家拒不發貨此類狀況,都是屬於交易雙方出現了信用問題,而因爲此時沒有第三方信用系統介入(淘寶、京東等),交易沒法撤銷,損失了就是損失了,這是比特幣的優勢也是它的痛點。區塊鏈
交易成功後沒法更改實際上是有條件的,就是俗稱的51%攻擊。原文中有寫到「除非從新完成所有的工做量證實,造成的記錄將不可更改」,比特幣採用的是複雜的工做量證實機制,更改交易區塊,須要從該區塊以及以後全部區塊都從新計算,須要大量運算,很是耗時,因此在客觀上是造成不可更改的目的。加密
可是,試想,若是賣家買家達成一致,或者根據「多數人即正義」原則,有絕大數人贊成修改呢?這是的的確確存在的比特幣的缺陷,而且這個缺陷也給濫用留了空子。至今還記憶猶新的全球勒索病毒的爆發,勒索掉大量的比特幣,這在全球絕大多數人眼裏非正義行爲,就能夠在比特幣的規則下,冠冕堂皇的鑽空子,而咱們卻無力回滾其交易,由於比特幣交易存在這客觀不可更改。spa
Transaction這一塊內容是中本聰設計最核心也是最精妙的部分,讓人讚歎。先奉上原圖,注意是英文原版白皮書原圖,不是網上流行的中文翻譯版的圖,中文圖是錯誤的,整整誤導了我好久。翻譯
首先搞懂白皮書裏給出的coin的定義:」一枚電子貨幣(an electronic coin)是這樣的一串數字簽名「。首先比特幣這個概念就很繞,即不跟現實貨幣相同,也和相似Q幣這樣的不一樣。Q幣能夠理解爲線上流通的實體貨幣的代幣,也會記錄擁有者姓名、數量等信息。而比特幣實際上根本不記錄都有誰誰誰,誰擁有多少幣,也沒有戶頭概念,全部的這些都是經過交易記錄反推得來。設計
例如,Q幣的記錄方式是A有100個Q幣,B有50個Q幣,A轉給B10個Q幣,則A戶頭上-10Q幣,B戶頭上+10Q幣,這是中心化的運做方式,包括銀行都是這樣。而比特幣的記錄可能就是一條「A給B10個比特幣」,無數個這樣的交易記錄組成交易鏈,就造成來一個去中心化的,公開透明的公共帳本。若是A想要知道本身有多少比特幣,那麼就援引全部他參與過的交易來反推出數量。
明白了這個原理,咱們來看如何將比特幣從一我的發給另外一我的。
好比說一筆交易記錄:張三發給李四5個比特幣。
發送者(張三)要作的事情是:把這條交易信息和目標地址(李四的公鑰)作個HSAH,而後用本身的私鑰進行數字簽名(即用張三的私鑰加密這個哈希值),同時將這個數字簽名附到這筆Tx(交易)裏,而後經過p2p技術發送給李四。
李四收到這條消息後怎麼作:拿着這筆交易裏公佈的張三的公鑰來驗證數據(公鑰解密)獲得哈希值x,同時,用本身的公鑰和交易信息作哈希獲得hash(data),而後對比x=hash(data),則能夠判斷出這筆交易來自於張三。由於公鑰驗證出的哈希值只有私鑰才能生成,而拿張三的公鑰驗證的,必然是張三的私鑰,私鑰只會存在張三那裏,抵賴是抵賴不掉的。這裏就用到來非對稱加密,私鑰數字簽名,公鑰驗證數據。公鑰肯定錢包地址,私鑰肯定全部權。
知識點一:非對稱加密
公鑰能夠加密數據或驗證數據,私鑰能夠解密數據或對數據簽名。 公鑰加密數據,只能用私鑰解密。 私鑰加密數據(這個過程叫數據簽名),只能用公鑰解密(驗證數據)。 區塊鏈在設計交易(Transaction)的時候,就是用不對稱加密算法(SHA-256)。
既然是支付系統,逃不開的就是雙花(double-spending)問題。
知識點二:雙重花費問題
若是同一筆錢,被重複支付兩次,這就是雙花問題。
現實世界中你僞造一塊黃金拿去交易,很容易被證僞,而虛擬世界中的物品被複制太容易了,一前一後用同一筆錢發起兩筆交易,看似都沒有任何問題,但這就存在雙花問題。
中心化的支付系統(支付寶、銀行等)並非不存在雙花問題,只是更好解決而已。例如銀行轉帳,A戶頭轉帳100元到B戶頭,銀行會開啓事務,A戶頭-100,B戶頭+100。這個過程類比鑄幣廠來講,銀行會先做廢掉A戶頭的100,而後從新發行新的100給B戶頭。因爲A戶頭上的100元被做廢掉了,因此就解決了雙花問題。
那麼,比特幣是怎麼解決雙花問題的呢?老樣子,多數即正義。首先是要求全部交易對全網公開,全部人均可以追溯每一筆交易的前因後果,沒法造假。二來每筆交易都有個時間戳,這樣就能肯定前後順序,造成時間序列交易鏈。三是絕大多數的節點認可交易是首次出現的。這裏就引出了下一章節的概念:時間戳服務器。
時間戳服務器經過對區塊加蓋時間戳,則能證實某些數據在某些特定時間是確實存在的。每一個時間戳都會有前一個時間戳的信息,這樣時間戳也造成一個鏈條,後一個時間戳就是對前一個的加強。這樣就算有人想篡改某一個時間戳,則須要把其以後的全部時間戳都改掉,這個過程是有工做量證實的,將會大量耗時和算力,從而保證不可被篡改。
如今又出現思考,比特幣不是說去中心化的麼,怎麼又出來個時間戳服務器,有服務器不就又成了中心化的。其實不是這樣的,此服務器非彼服務器,仍是那句話,多數即正義,時間取自於其餘至少5個節點的時間的中位數,而且中位數跟本地時間相差不能超過70分鐘。
知識點三:中位數
一個數學概念,統計學中的專有名詞,表明一個樣本、種羣或機率分佈中的一個數值,其可將數值集劃分爲相等的上下兩個部分。
中位數是以它在全部標誌值中所處的位置肯定的全體單位標誌值的表明值,不受分佈數列的極大或極小值影響,從而在必定程度上提升了中位數對分佈數列的表明性。
因此說中位數比平均數更不受極端值的影響,更能表明分佈數列的中間值。
時間戳的運行機制就是兩個區塊產生間隔中全部交易進行Hash運算,加蓋時間戳,咱們就獲得了一個按時間序列產生的交易記錄了,這就是區塊鏈。
工做量證實,就是俗稱的「挖礦」。一來浪費電力,二來浪費算力,而且比特幣並非挖礦挖出來的貨幣,那麼爲何還須要挖礦呢?
試想,有一筆交易產生了,並廣播給全網,如今A、B、C三我的都收到了這個交易信息,均可以對交易進行加蓋時間戳,而後打包區塊到鏈上去。可是每一個人接受到的交易信息不同,而且接受的時間也不同,那麼產生的區塊hash就千差萬別。因此此時須要一個共識機制,在全網達成共識,就須要引入競爭機制。就如同長跑同樣,誰第一個撞線,就給誰記帳(加蓋時間戳、打包區塊)的權利。那怎麼樣製造一個全部人都參與長跑的場景呢,工做量證實(Proof-of-Work)機制就來了。
白皮書裏定義瞭如何工做量證實,即借用CPU的算力進行窮舉法,有機率性的碰撞出所須要的值,好比一串開頭有N個0的hash值。這個過程是須要付出算力且耗時的,CPU算力的不一樣,A、B、C三人就有前後順序了,第一個知足要求的人擁有下一個區塊的記帳權,這樣就達成了共識。
此時再試想,若是A、B、C中三人B經過工做量證實脫穎而出,拿到了記帳權,若是他這時篡改交易記錄或者惡意構造交易實現雙花怎麼辦?
因爲有POW機制的存在,B拿到了記帳權,同時他付出了電力成本、CPU算力成本,而且篡改比特幣的某一筆交易,須要連帶修改以後全部交易,其帶來更大成本支出。看成惡成本遠遠大於篡改記錄所得的利益時,就如同花100塊錢的成本爲了賺1塊錢,他還會選擇做惡麼?
工做量證實機制簡單來說就是提高了做惡的成本,讓做惡的投入產出比低於作誠實節點的投入產出比,這就是中本聰運用博弈論的點睛之筆。
另外一個點,工做量證實的難度是隨着時間而變化的,若是區塊的產生速度過快,難度就會提高,從最初的CPU到GPU到礦池,挖礦成本一直在增長,難度是愈來愈大。因此日漸突出的一個問題就是,愈來愈多的普通CPU用戶成爲吃瓜羣衆,超大算力的CPU被礦池佔據,難免讓人擔憂純POW的共識機制還可否繼續完美保證比特幣系統運行下去。因此後來也出現了像股權證實機制(POS)等新的共識機制來避免算力集中。
前面幾章依次講述了比特幣系統的交易、時間戳、工做量證實,到這裏就講述,比特幣系統網絡是怎麼運行的,交易在網絡中是怎麼流轉並打包成區塊,並造成鏈的。
前面的步驟其實很好理解,繼續順着工做量證實以後往下說,打包成區塊後,向全網廣播,不是說這個區塊在記帳完成就是有效的,仍是要通過「多數人即正義」的驗證的,當且僅當包含在該區塊中的全部交易都是有效的且以前未存在過的,其餘節點才認同該區塊的有效性。「全部交易都有效」,「以前未存在過」這兩點就是指全網節點驗證交易和驗證時間戳,佔據絕大多數都驗證經過後,這個區塊方可被認可。
全網接受了這個區塊以後,接受的方法就是在這個區塊末尾製造新區塊,用以延長該區塊。這個設計也很巧妙,目的就是促使生成一條最長鏈,而且最誠實,最正義,由於只有接受度最高的區塊鏈纔會被延長。
前面一直說工做量證實,直到這裏才真正說明工做量證實的刺激點,你們夥爲何拼了命的耗電耗時耗算力地去作呢?由於有激勵機制,只有在去中心化的系統有提供激勵機制,才能保證長久運行下去,所謂「從激情開始,用利益維持」說的就是這個。
比特幣系統裏的激勵有兩種。一是在「每一個區塊的第一筆交易進行特殊化處理,該交易產生一枚由該區塊創造者擁有的新的電子貨幣」,這是用來補貼用於工做量證實的成本;二是交易費,「若是某筆交易的輸出值小於輸入值,那麼差額就是交易費,該交易費將被增長到該區塊的激勵中」,這是用來補貼用於交易確認所產生的成本。
這個解決的是存儲問題,因爲處於比特幣網絡中的每一個節點都會同步所有的交易記錄,這個體積是在不斷膨脹的。白皮書提出的解決方案是,使用Merkel Hash Tree方式存儲被消費過的交易信息,只把這個Tree的Root節點保存進區塊。而Merkel Hash Tree則由一些IPFS、公共節點、信任度高的節點來保存。同時若是想回溯交易,只需去對於的Tree裏下載回全部交易記錄便可。
這實際上是回收硬盤空間所帶出來的問題,當鏈上的節點保存的再也不是完整的交易鏈信息時,必需要走一個簡化的支付認證,這算是折衷方案。
當某個存儲Merkel Hash Tree節點遭受攻擊或發現異常,系統會提示用戶下載這個節點存儲的數據來保證整條鏈上的交易數據是不被篡改的。同時一些金融機構或着對所有交易數據敏感的節點會一直保存下全部的交易記錄,而不進行回收硬盤空間的折衷。
這一塊內容又是對交易的一個補充,同時它灌輸了一種觀念,比特幣跟現實貨幣是徹底不同的,沒有單位換算,只有差額,價值的組合和分割徹底能夠用加減法來實現。
最重要的一點是,明確來一個交易(Tx)包含多個Input和多個Output。
因爲比特幣系統不記戶頭賬,只記錄交易信息,因此每一個人的持有貨幣數量都是由交易反推的。同理,當進行一筆交易時,你須要援引一條甚至多條交易記錄來湊出你的電子貨幣,因此由多條輸入(Input)。
比特幣系統交易還有一個特色,每次交易都把錢花光,意思就是Inputs=Outputs,因此輸出一個是目標錢包的交易數量,另外一個就是找零,找零所有返回付款方。
這個實際上是大衆很關心的問題,一方面比特幣網絡說是去中心化的,交易全透明的,另外一方面又說比特幣是匿名交易、不互信的,究竟是怎麼回事呢?
其實很簡單,比特幣網絡裏沒有戶頭概念,只有錢包地址,錢包地址是由公鑰hash得來,在這個環節上錢包公開,公鑰匿名。公衆能夠看到有一個錢包地址發送一筆數目給另外一個錢包地址,可是沒有信息能把錢包地址於某我的聯繫在一塊兒,這樣就保證了用戶的隱私。這就是隻看到有交易在發生,可是不知道是誰在交易。
中本聰 《Bitcoin: A Peer-to-Peer Electronic Cash System》大聖2017《(大魚)精讀比特幣白皮書系列(1-6)》godsex 《解密比特幣白皮書(3) — 當你發送比特幣,你在發送什麼?》金曉 《比特幣白皮書 我的翻譯+註解》蔣宏偉 《比特幣的交易-數字簽名(一)》aisen 《什麼是「雙重支付」問題,怎樣解決?》百度百科 《中位數》