1. 程式人生 > >【區塊鏈】比特幣白皮書《比特幣一種點對點的電子現金系統》個人解讀

【區塊鏈】比特幣白皮書《比特幣一種點對點的電子現金系統》個人解讀

比特幣系統是一種完全通過點對點技術實現的電子現金系統,即它使得線上支付能直接從一方發起並直接支付給另外一方,中間不需要任何的金融機構。數字簽名(digital signatures)解決了所有權的問題,但是並不能解決雙重支付問題,於是中本聰提出了一種解決方案,通隨機雜湊(hashing)對全部的交易加上時間戳,把他們合併入一個只增不減的基於隨機雜湊的工作量證明(proof of work)的鏈條中,作為全網的交易記錄。只要不是全網51%以上的節點都是不誠實的攻擊節點,那麼誠實節點生成的鏈條最長,是全網所有交易的證明也被看做是來自cpu計算能力最大的池。節點可以隨時離開和重新加入比特幣網路。  

1.比特幣的提出背景

   網際網路上的交易,幾乎都需要可信賴的第三方來處理電子支付資訊,這是基於“信任模式”的電子交易系統。由於金融中介的存在,使線上交易有著人們無法完全實現不可逆的交易,還會增加交易的成本,限制了最小交易規模,索取不必要的個人資訊之類的弊端。

   所以中本聰提出了比特幣系統,它基於密碼學原理而不基於信用,任何達成一致的雙方都可以直接支付。但是比特幣系統,代替的是中心化的中介的信用,並不能保證交易雙方的信用。

2.比特幣系統上的交易

   說白了,一枚比特幣就是數字簽名。交易就是一串加密過的資料。

   比如有一個交易是A要給B 兩個BTC。則這個交易資料裡包括是上一次交易的雜湊值(A是怎麼得到這些比特幣的)和B的公鑰(這次交易要付給誰,就需要誰的公鑰。公鑰就是地址。一個公鑰代表一個人,不需要現實生活中的任何個人資訊,從一定程度上講比特幣保證了交易人的安全。通過非對稱加密技術生成)的隨機雜湊。並在這個隨機雜湊後附加上交易發起者的數字簽名。

   非對稱加密演算法:

   (sk,pk) := generateKeys(keysize) generatekeys方法根據keysize來產生一對公鑰和私鑰。私鑰被安全儲存,用來簽名一段訊息;公鑰是人人都能找到的,用來驗證你的簽名。

   還是用上面A要給B 兩個BTC這個例子。

這個交易就是一個數據結構:

A的數字簽名:證明這條記錄是由A建立的

一個付給B的公鑰(地址)的指令:寫了一些交易的具體資訊,並用B的公鑰進行了交易,只有用B的私鑰才能解開這個,即B擁有了這條記錄。

一個雜湊指標(指向先前的一筆交易的輸出): 表示A之前收到並現在要消費這個比特幣

   數字簽名技術解決了交易所有權的問題,但是它是不完善的。該過程的問題在於收款人

B沒辦法知道A是不是對這枚電子貨幣進行了雙重支付。通常的解決辦法就是引入第三方權威機構,對每一筆交易進行檢驗,防止雙重支付。在每筆交易結束後,這枚電子貨幣都要被造幣廠回收,而造幣廠將發行一枚新的貨幣,只有造幣廠直接發行的貨幣才有效,這樣能防止雙重支付。在比特幣系統中,沒有中心化機構,我們只需要確保之前的所有者A沒有對更早發生的交易實施簽名。也就是說A給B的兩個比特幣,他並沒有付給別人。所以,我們只需要關注在A與B的交易之前的交易。為了確保某一次交易是不存在的,那麼唯一的方法就是查詢到之前發生過的所有的交易。所以,在沒有第三方中介機構的比特幣系統裡,交易資訊應該被全部公開,而且每一個交易都有唯一的交易序列。收款人要確保全網大多數的節點都認為這個交易是首次出現的。(也就是說超過51%的節點認為A之前沒有用掉這筆錢,這個交易完全合法)。

3.時間戳伺服器

   時間戳伺服器通過對以區塊形式存在的一組資料實施隨機雜湊而加上時間戳,並將該隨機雜湊進行廣播。

   時間戳:能夠證實特定資料在某個特定的時間是確實存在的。

   如何獲得去中心化的時間:來自於連線的其他節點時間的中位數,要求連線的節點數至少為5個,中位數和本地系統時間差別不超過70分鐘,否則會提醒你更新本機的時間。同時,在接收到新的區塊時會拒絕與自己相差+2小時和-(前11個區塊時間中位數)的區塊。

   多筆交易打包成一個區塊,並把這個區塊加蓋上時間戳並做hash。

   這個圖說明了時間和區塊掛鉤,區塊和hash掛鉤,因為區塊鏈的性質,之前掛鉤的時間戳是不可被篡改的。

Hash:標識著時間,和當時時間聯絡在一起。

   這些區塊形成鏈條,區塊的增長是cpu算力的證明。因為鏈上一個新的區塊需要消耗cpu,那麼之前的hash就一定是正確的。(可信度不斷被增強)

4.工作量證明

   我們還需要一個類似亞當伯克的雜湊現金的工作量證明機制,來實現構建一組分散化的時間戳伺服器。比特幣系統是用雜湊函式解謎來證明工作量的。

   比特幣系統中的任何一個節點,想生成一個新的區塊並寫入區塊鏈,必須解出比特幣網路出的工作量證明的謎題。

   解謎題的三要素:工作量證明函式,區塊及難度值

   工作量證明:這道題的計算方法

   區塊:決定了這道題的輸入資料

   難度值:決定了解這道題所需要的計算量

比特幣系統中的工作量證明函式是SHA256

區塊由區塊頭及該區塊所包含的交易列表組成

區塊頭的大小是80位元組:包含4位元組的版本號,32位元組的上一區塊的雜湊值,32位元組的merkle root hash ,4位元組的時間戳,4位元組的當前難度值,4位元組的隨機數。

區塊包含的交易列表附加在區塊頭後面,其中一筆交易是coinbase交易,為了讓礦工獲得獎勵及手續費的特殊交易。

Merkle tree是一顆雜湊值構成的二叉樹,每個指標不僅告訴我們去哪裡指到一個資訊,而且還告訴我這個資訊的雜湊值。

5. 網路

新的交易向全網進行廣播

每個節點對接收到的新交易進行核驗:

①針對每個前序交易的輸出執行核驗指令碼

②檢查是否有雙重支付的問題

③檢查這筆交易是否被本節點接受

④只接受白名單上的指令碼

節點始終都在最長的鏈條視為正確的鏈條。如果同時有兩個節點同時廣播不同版本的新區塊,因為其他節點收到該區塊的時間上存在先後差別。那麼在率先收到的區塊繼續工作,但也會保留另外一條鏈,防止後者變成最長的鏈。

6. 激勵

每個區塊的第一筆交易是產生由該區塊創造者擁有的新的電子貨幣。

另一個激勵來自於交易費,每筆交易的輸出值小於輸入值,那麼差額就是交易費。

7. 回收硬碟空間

已經被納入足夠多的區塊中的交易,丟棄掉該交易之前的資料,以回收硬碟。

交易資訊被隨機雜湊時,被構成merkle tree的形態,只有根被納入了區塊的隨機雜湊值。通過剪紙的方法,壓縮老區塊。

8. 簡化的支付確認

一個使用者需要保留最長的工作量證明鏈條的區塊頭的拷貝,它可以不斷先向網路發起詢問,知道它取芯自己擁有最長的鏈條,並通過merkle的分支通向它被加上時間戳並納入區塊的那次交易。

9. 價值的組合與分割

每次交易都有多個輸入和兩個輸出

一般而言是某次價值較大的前次交易構成的單一輸入,或者由某個幾個價值較小的前次交易共同構成的並行輸入,但是輸出最多隻有兩個:一個用於支付,一個用於找零。

10. 隱私

公鑰可以保持匿名,但由於並行輸入的存在 ,一定程度的追溯不可避免。

11. 計算

攻擊成功的概率隨區塊數的增長而呈指數化下降 ,比特幣是至少在6個區塊後交易成功(大概一小時),以太坊是至少15個區塊(大概三分鐘)