比特幣——點對點電子現金系統

1.比特幣介紹

       2008年爆發全球金融危機,2008年11月1日,一個自稱中本聰(Satoshi Nakamoto)的人在P2P foundation網站上發佈了比特幣白皮書《比特幣:一種點對點的電子現金系統》  ,陳述了他對電子貨幣的新設想——比特幣就此面世。2009年1月3日,比特幣創世區塊誕生。算法

比特幣

 

       咱們現現在使用的現金系統都是由銀行來進行貨幣發行和交易記錄,而比特幣沒有一個集中的發行方,而是由網絡節點的計算生成,誰都有可能參與製造比特幣,並且能夠全世界流通,能夠在任意一臺接入互聯網的電腦上買賣,無論身處何方,任何人均可以挖掘、購買、出售或收取比特幣,而且在交易過程當中外人沒法辨認用戶身份信息。2009年1月5日,不受央行和任何金融機構控制的比特幣誕生。比特幣是一種數字貨幣,由計算機生成的一串串複雜代碼組成,新比特幣經過預設的程序製造,隨着比特幣總量的增長,新幣制造的速度減慢,直到2140年達到2100萬個的總量上限。安全

 

       假若有A、B、C、D四我的在比特幣交易平臺上進行交易,A付給了B 10個比特幣,那麼他就要把這筆交易記錄廣播給其他三我的,其餘三我的就在本身的帳本上記錄這一條消息。而後B又付給C 8個比特幣,同時B也會將這條消息廣播給另外的三我的,D的交易記錄也一樣如此。這些交易記錄會記錄在一個塊裏——區塊,每一個區塊會存儲4000條左右交易記錄。這個塊打包後把這個塊鏈接到之前的塊上,這條鏈就叫作區塊鏈。打包這個塊就叫作挖礦。但這個系統須要解決下列幾個問題:網絡

1)交易記錄以誰的帳本爲準。好比因爲網絡延時問題C會先收到B支付C的交易信息,後收到A支付B的交易信息,而D剛好相反,那麼就須要一個帳本做爲基準。函數

2)爲何要記帳。咱們每一個人的硬盤資源是有限的,咱們爲何要花費資源去記錄別人的交易記錄呢。區塊鏈

3)如何防僞。好比A公佈了「A支付給B 10比特幣」這條記錄,但實際上並無付給B 10個比特幣,那麼這條記錄就是僞造的。網站

 

2.爲何記帳

       記帳會有獎勵。一個是手續費的獎勵:每一個用戶均可以記帳,那麼這條記錄的發起人就要支付一部分手續費做爲記帳的獎勵;另外一個是打包的獎勵:打包成功就會獲得系統給的比特幣獎勵。中本聰設計比特幣系統時設置了一條規則:每十分鐘打一個包,而且在最初的四年中,打包成功後會得到50個比特幣的獎勵,四年後獎勵變爲25,再過四年就變爲12.5個。因此比特幣總量就爲2100萬個。有了這兩個獎勵後人們就會去打包這些交易記錄,那麼都去打包,應該以誰的爲準呢?加密

3.帳本標準——工做量證實

       挖礦就是作數學題,去求解一個特定的數,誰求出這個數,誰才能去打包,也就是得到挖礦獎勵。這道數學題沒有任何一我的能夠用腦子算出來,只能依靠計算機。spa

       哈希函數也叫數字摘要或散列函數,它的意思是能夠把字符串通過運算轉換爲摘要的形式,這個算法正算很容易、反推很難。而哈希算法中有一種算法叫SHA256算法,是美國國家安全局發明的一種算法:若是把一個字符串輸入這個算法,就會輸出一個256位的二進制數。挖礦就是利用這個算法進行兩次SHA256運算,也就是SHA256(SHA256(字符串))。設計

       挖礦的輸入值應該由那些部分組成呢?前塊的頭部+帳單的信息+時間戳+我的簽名等+隨機數,把這些輸入算法中,輸出結果爲一個前n爲是零的256位二進制數。假設n爲30,爲知足這個條件須要的隨機數就是這個塊的解,求出這個隨機數後,將輸出的哈希值(256位二進制數)做爲新塊的頭部一塊兒打包鏈接到鏈上,也就是挖礦成功,得到獎勵。由於每一個人所記錄的交易信息不一樣,時間戳、簽名等都不一樣,計算隨機數的難度也會不一樣,但基本上算力更強的計算機更容易挖到礦。n的位數越多,計算越困難,爲了知足設計初期每十分鐘打包一次的速度,須要根據全球挖礦的計算機的算力進行n的調整。好比全球有10000臺進行挖礦的計算機每臺計算機每秒可進行14T(1.4*10^13)次哈希運算,十分鐘可進行8*10^19次運算約爲2^66次運算也就是說算出前66位都是0的機率接近1,在這種狀況下就會設置前66位爲0的規則。第一個算出前66位爲0的人就能夠打包這個塊,並以他所記的帳單爲標準。blog

4.如何防止僞造交易記錄

       咱們必須保證每條交易記錄都是由比特幣持有者發出,而非其餘人僞造。這就需每一個用戶都有一個電子簽名。用戶在註冊時系統會爲用戶生成一個隨機數,經過這個隨機數產生一個叫私鑰的字符串,私鑰又能夠產生公鑰,以及一個地址。私鑰由用戶保存,公鑰和地址他人可見,私鑰用來對字符串進行加密,公鑰能夠用來對加密後的密文進行解密,好比A發出了一條「A付給B 10個比特幣」的交易記錄,那麼他會把這條消息進行哈希運算獲得一個摘要,再把這個摘要用私鑰進行加密,以後把公鑰、「A付給B 10個比特幣」的交易記錄連同加密後的密文一同廣播出去。收到消息的人會去驗證這條消息的真僞,他們把交易記錄進行哈希運算獲得摘要一,把密文和公鑰進行解密獲得摘要二,若是摘要一和摘要二相同那麼就說明這條信息確實是A發出的,這個過程就叫作電子簽名。

       咱們如何保證不會出現餘額不足、雙重支付?好比A發出「A付給B 10個比特幣」的交易記錄,但A並無這麼多比特幣,或者A只有10個比特幣,但卻同時支付B和C 10個比特幣。這就須要餘額檢查:若是在當前全部交易記錄中計算出的A的餘額大於10個比特幣,那麼A發出的「A付給B 10個比特幣」這條交易記錄就會被人們接受,若是不知足條件,這條消息就不會被接受,一直到這條記錄被打包到一個區塊裏就會被系統接受。就解決了餘額不足的問題,那麼如何解決雙重支付的問題呢?A只有10個比特幣,但同時發出了兩條消息「A付給B 10個比特幣」、「A付給C 10個比特幣」,用戶們收到消息後就回去驗證餘額,若是接受了第一條消息後就會拒絕第二條消息。但有些用戶可能先接收到了第二條消息,那麼就會拒絕第一條消息。雖然用戶接受到了消息,但此時交易並不會被確認,知道這條消息被打包進一個塊裏。當這個塊被確認後,其餘用戶就會放棄本身記錄的消息,而後重新產生的鏈後進行打包,假如這個塊裏記錄的是「A付給B 10個比特幣」這條消息,那麼「A付給C 10個比特幣」這條記錄就會被放棄。因此咱們收到別人的付款時不能當即認爲錢已經到帳,應該等塊造成後才能確認。

       第三個問題,應該如何防止篡改交易記錄呢?咱們不可能去僞造別人的電子簽名,但能夠僞造消息記錄,好比A付給了B 10個比特幣,但他想刪掉這條記錄,應該怎麼防止呢?比特幣的另外一個原則——最長鏈原則:區塊鏈總以最長的分支做爲標準。好比有兩個礦工同時打包了一個新塊,那麼可能會有兩批人收到不一樣的新鏈(1和2),那麼無論他們知不知道另外一個分支的存在,他們都會各自在本身收到的鏈後進行打包,直到有一我的又打包出一個新塊並把這條鏈(好比1鏈)廣播出去,那麼全網就會接受更長的分支並把它做爲主鏈繼續打包。假若有一我的認準2鏈並在其後進行挖礦、打包,那麼他就須要算的比其餘全部人都要快,才能使2鏈變爲最長鏈,才能令人們接受這條鏈。除非你有全世界礦機50%以上的算力纔有可能去篡改交易記錄。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息