《Master Bitcoin》學習筆記01

前言

  關於比特幣入門,其運行原理(理解性描述),什麼是挖礦,還有一些學習資料的整理,詳見此博客連接git

  第一章講比特幣的歷史,算是導入,上面的博客連接有歸納。github

  第二章舉了使用比特幣交易的例子,其中介紹了一個交易模型讓我印象深入算法

  這個模型中,有輸入和輸出,輸入(IN)是本身帳戶上可用的金額(這個金額能夠由一我的轉帳造成的輸出A,或者由多我的轉帳造成的輸出們組成的A,B,C),而最基本的輸出(OUT)分爲兩個部分,一個是轉帳給別人的,一個是找零給本身的,在進行下一次的交易的時候,這個輸出中給退還給本身的一部分能夠是上面的A或者A,B,C中的一個,而轉帳給別人的也是同理,使用比特幣的交易過程,就是比特幣全部權在地址(下面重點講)的不斷轉讓過程。安全

  一樣仍是上面這張圖,有個交易費項,這個交易費是給礦工的(補充了知識點:礦工除了挖到礦所得的獎勵外,在比特幣的交易中,還扣除了一些費用(按照整個比特幣網絡挖礦每4年獎勵減半,將在2140年獎勵歸零,我以爲2140年的電腦運算速度會很快,收取的手續費和如今挖礦相比應該差不了多少)服務器

  當一筆交易由礦工選中Lucky Number並講其放在區塊鏈中後,隨着區塊鏈的長度不斷變長,這筆交易愈來愈難被推翻,由於它在網絡中被更多礦工和用戶驗證,漸漸地被整個比特幣網絡認可。網絡

  第三章是如何安裝比特幣的完整客戶端,可是看到下載區塊鏈要不少天我就放棄用第三章的方法,而是用第三章末尾推薦的bitcoin exploer工具,這是一個命令行與服務器交互以得到比特幣信息的工具,對於新手來講很合適,這個工具在Windows下有現成的二進制可執行文件,但我下載不成功,轉在了Linux下用源碼安裝,這個連接裏包含了這個工具的安裝以及教程。app

重點:密鑰、地址、錢包(第四章)

加密體制簡介

  加密體制分爲:①以置換、替換爲表明的古典密碼體制(表明:凱撒密碼)=》②要求發送方和接收方都要有相同密鑰的對稱加密體制(表明:DES加密)=》③公鑰加密體制:有一對公鑰和私鑰,公鑰是公開的,網上全部人都知道的,用公鑰加密的信息,只有擁有私鑰的人才能解密(表明:RSA加密,橢圓曲線加密)。函數

  在公鑰加密體制中,有一個稱爲陷門的函數h,陷門的定義就是從x->y方向容易,可是從y->x方向難,根據兩個方向難度差距,定義了陷門函數的好壞,一個陷門函數,若是兩方向難度差距越大,陷門函數越好,這個密碼方案越難攻破,下面以RSA來舉例子工具

  若是想要攻破RSA就須要在知道公鑰(n, b)的基礎上,算出私鑰(p,q,a),由於n=p*q,而a=b(mod fi(n))故,只用知道n=p*q中的p和q,就能獲得私鑰,而n=p*q又叫大整數分解問題,如今沒有一個有效算法能解決該問題,因此它是安全的。學習

  可是Bitcoin中所用的不是RSA加密,而是橢圓曲線加密算法

橢圓曲線加密算法

  說是橢圓曲線其實不太準確,這個橢圓曲線和咱們高中學的那個橢圓曲線不是一個東西,雖然它們方程式長得差很少,橢圓曲線方程式爲:y2=x3+ax+b,畫出曲線圖像是下面這樣,可是實際上不是線,而是一系列的(x,y)都是整數的點集,這個點集構成一個循環羣,羣是自帶運算的,羣的兩個點爲A,B,定義A和B的運算「+」爲:過A,B點連一條直線(若是A=B,則該直線就是切線),這條直線一定與橢圓曲線交與除A、B以外的第三點C,C點關於x軸對稱的那點稱爲D點(D點必定在橢圓曲線上,由於橢圓曲線關於x軸對稱),D點就是目標點,此時有運算A+B=D【此處的+與整數裏的+不同,你也能夠把此處的+叫作「這個操做」,不過爲了方便,仍是說+好一點】,定義整數k和曲線上的整數點A的運算k*A爲執行A+A+...+A(k次),循環羣:下面那張只有點的圖,能夠由最初開始的知足y2=x3+ax+b的點G開始,經過不斷的k*G(k=1,2,...,n)生成,而k=n時G達到最大,即k=n+1時k*G=1*G,造成循環,這就是循環羣,下面一張動圖形象地描述了這個過程。

  上面的k就是私鑰,而點k*G是公鑰,我不打算從數學的角度來給予橢圓曲線加密算法的陷門函數是難解決的,咱們觀察這樣一個事實,從G點,咱們能輕易地經過k獲得目標點,但很難從目標點獲得G點,這個單項陷門函數顯然要比整數分解問題難不少,這篇文章裏用了一個很形象的比喻,長度爲256的密鑰,從公鑰中解出私鑰,解RSA消耗的能量能煮沸一湯勺水,而解橢圓曲線能把地球上的全部水都煮沸,RSA密鑰要達到一樣的效果,須要2380bits的。橢圓曲線和RSA效率高下立判,事實上,如今不少安全協議除非在設計中用到RSA的機制,不然都已經升級爲了橢圓曲線加密。

比特幣地址

  在上面橢圓曲線中,咱們獲得了公鑰,對這個公鑰進行Hash,就能獲得惟一標識的比特幣地址,在Hash處理中,用到了兩個Hash函數:①SHA-256,②RIPEMD160,經過下面這樣的方式構建比特幣地址(爲何要兩次HASH,我也不太清楚,不過我查到的資料說是RIPEMD160有缺陷,不能只用RIPEMD160,具體等看源碼再說)。

  HASH算法將任意長度的二進制值映射爲較短的固定長度的二進制值,這個小的二進制值稱爲哈希值。Hash函數有兩個特性:①數據一旦產生哈希值,那麼就不可能經過單一的哈希值解出原始的數據。(上面的加密體制只是不知道私鑰難解,知道密鑰易解,HASH沒有密鑰,不能解)②獨特性,兩個不一樣的數據是不能產生一樣的哈希值,事實上,數據就算改變一個bit,HASH獲得的結果也徹底不一樣,在bitcoin中,用於驗證接收者是否正確(由於比特幣的轉帳過程,須要輸入轉帳人的公鑰,並用本身的私鑰簽名(別人能用你的公鑰,從這個簽名中知道這是你,但不知道你的私鑰,方法就是加密的逆過程),從帳單就能知道是你(你本身的私鑰簽名)轉帳給別人(別人的公鑰)),此處咱們只關心公鑰作HASH用來肯定收帳者地址(轉帳,只用知作別人公鑰的HASH就好了)。

  SHA-256——將公鑰轉化爲256長的bit串  連接給出代碼描述

  RIPEMD160——將256長的bit串HASH成160長的bit串  自行百度或者bing吧,我打算看源碼的時候再看相關實現

  在進行Hash處理後,獲得的其實只是0,1比特串,如今須要將0,1比特串轉化爲咱們人可讀的形式,人的十個指頭衍生出的十進制是如今你們最熟悉的數字運算方式,可是除此以外,數據也能表示成2進制,8進制,16進制,好比11(10進制)=1011(二進制)=13(8進制)=B(16進制),Bitcoin的實現中,用到了BASE58的進制編碼方式

BASE6四、BASE5八、BASE58_CHECK

  BASE64就是64進制了,它的字符表示是:0-9,a-z,A-Z,+,/

  BASE58 的字符表示在BASE64的基礎上去掉了容易讓人誤解的0和O,l(L的小寫字母),I(i的大寫字母),+,/

  BASE58_CHECK 是爲了在傳輸過程當中發生錯誤而加入的驗證位,具體驗證以下:

  prefix就是加在HASH以後160bits字符串的前綴(加此前綴代表使用BASE58_CHECK驗證),而從checksum中抽取前面4個字節(共16bits),加在160bits的後面,這樣造成的就是BASE58_CHECK形式的編碼。

  使用編碼一是爲了人類可讀,二是爲了傳輸方便,下圖中的前綴聲明版本號,是由於,BASE58_CHECK不光用於比特幣地址的編碼,還用於比特幣的其餘編碼,如私鑰的版本號就和公鑰不同。

壓縮格式的公鑰——爲了節省空間

  從前面橢圓曲線加密方案中,咱們知道,公鑰P(x, y)是橢圓曲線上的一個點,而橢圓曲線是個只含x, y的二元方程,這就意味着,知道x,就能求出y,惟一一點缺陷就是不知道這樣求出來的y是正仍是負,這能夠在壓縮公鑰P前,經過指定P的前綴來判斷,因而,此時就將P壓縮成x,從P(256bits, 256bits)中節省了256bits,這樣隨着區塊鏈的不斷延長,就能節省大量的空間。

  可是,壓縮畢竟是比特幣出來好久才提出的方案,壓縮產生的公鑰經過HASH獲得的地址確定和以前的不同,那以前未壓縮下比特幣公鑰下的比特幣地址,就不能經過這種方式找到,爲了解決這個問題,引入了「壓縮格式的私鑰」,實際上並非壓縮私鑰,而是在私鑰的前面加上前綴來標識來識別該私鑰對應的公鑰爲壓縮格式的,未加前綴的就默認非壓縮格式,這樣,比特幣的擁有者(非其餘人)就能找到本身在那個公鑰下的比特幣,而其餘人的對該帳戶的轉帳卻不受影響。

比特幣錢包

  在最開始比特幣的設計中,將比特幣的錢包做爲一個私鑰集合,一次性地生成100個隨機密鑰,而後一筆交易用一個密鑰,這樣隨着交易的增多,即不利於錢包的轉移(將私鑰轉移)又難維護(私鑰安全性),這是最開始的非肯定性(非肯定性指的是隨機生成私鑰)錢包。

  如今是肯定性錢包逐漸取代非肯定性的錢包,這裏的肯定性指,經過一個肯定的種子來生成一系列,無窮的私鑰,肯定性錢包以下圖所示

圖一

  左圖中,密碼學上安全的僞隨機數發生器須要提供一個熵(這個熵是一串隨機數字,這串隨機數字越沒規律越好,個人理解是能夠用普通的隨機函數來生成),助記碼是爲了記住根種子而使用的,只是將跟種子的數字映射爲助記碼,幫助人記憶而已,經過SHA-512這個HASH函數,512的二進制串,左邊256bits對應的密鑰生成的公鑰,和256bits的編碼,在右圖的下一次生成私鑰時,又做了輸入,加索引號的額意義是,索引號有232 =40億種選擇,每一層都能有40億種選擇,我認爲能將密鑰生成看做無窮,生成私鑰的具體縮略圖以下。

  書中提到了上面那種方式是不安全的,由於公鑰是公開的,只要你的父鏈編碼被人知道了,別人很容易地就能知道,那條父鏈編碼下的全部子鏈,書中給出的改進方案是用私鑰替代公鑰生成私鑰鏈,這種方式又叫作硬化子密鑰,以下圖

最後,文章提出一種使用肯定性錢包的標準(但目前並不是全部錢包app都使用該標準),標準沒怎麼看懂,可是並不影響以後的閱讀,決定在深刻以後再作詳細分析

相關文章
相關標籤/搜索