Andy
Andy

手民

Bitcoin論文零基礎入門・白皮書閱讀之四

Bitcoin需要專門一篇文章來寫。這篇閱讀筆記不像之前的重點摘要,我會嘗試從基礎開始建設起Bitcoin的理論框架,作爲練習。部分英語名詞無通用漢譯,就保留英語。

1. 數字

1、2、3、0、-1、1.2等等。

由於比特幣運行在數字計算機(Digital Computer,翻譯成「整數計算機」或許更好)上,嚴格來說只能處理整數和能用整數模擬的小數。任意無理數是處理不了的。

2. 乘法

這個大家應該都懂,2・3 = 6;6・24 = 144等等。

3. 因數分解

因數分解是乘法(概念2)的逆操作,比如6 = 2・3,144 = 6·24 = 2·2·2·2·3·3。後面的2和3也叫「因數」。

一個數字可以有多種因數分解方法。

4. 質數

質數是只有兩個因數(概念3)的數字。比如17 = 1・17,然後就再也拆不了了,因此17就是質數。

相反,16 = 16・1 = 8・2 = 4・4 = 2・2・2・2,有1、2、4、8、16五個因數,因此16就不是質數了。

5. 函數

現代意義的「函數」雖然有個「數」字,其實不是數字(概念1),而是關係。

比如攝氏度轉換爲華氏度的函數 F(C) = 9/5 ・ C + 32,「F」表達的是攝氏度與華氏度的關係,而非具體的某個溫度標值。

C=0的時候,F(C)就是32;那C=30,那F(C)就是86了。

可以把函數想象成轉換器,輸入一些數據,它就給你輸出另一些數據。就網上銀行,輸入用戶名密碼,輸出餘額;瀏覽器,輸入網址,輸出網頁。等等。

6. 單向函數

有些函數(概念5),知道了函數的定義,然後知道函數的輸出,就很容易猜到輸入。比如告訴你華氏度是86,很容易就能推算出攝氏度是30度。

另外有些函數,運算本身很容易,但是就算告訴你是怎麼算的,也告訴你算出來的結果,卻很難猜輸入是什麼,這種函數叫做單向函數。

「單向」不是非此即彼的屬性,而是有「逆向難度」區別。難度跟硬件也有關,對電子計算機難的問題,對量子計算機未必難,反之亦然。

7. 半質數因數分解

半質數就是兩個質數(概念4)的乘積,比如3和7都是質數,21就是半質數。

目前常用的一種單向函數(概念6),是兩個差不多大的質數的乘法(逆向就是兩個質數乘積的因數分解)。

比如,67和191都是質數,67・191 = 12797,這個乘法筆算都可以做到。

但相反,如果我告訴你,12797是兩個質數的乘積,請告訴我這是哪兩個質數,那就沒有快速的算法了(嚴格來說,沒有公開的、在電子計算機上的、多項式時間內的解法)。

8. hash函數

hash英語裏的意思是「切碎」,漢語無通譯,有音譯「哈希」的,有意譯「散列」或是「雜湊」的。

hash函數首先是個函數,給它輸入數據,它會還給你一個數。hash的特點是,輸入範圍無限制,但輸出是「定長」的,用通俗語言說,就是無論你輸入多大的數,它輸出的數是有固定上限和下限的,比如說0-65535。

9. Crytographic hash function

Crytographic hash function是一類單向函數(概念6),也是hash函數(概念8)。

Crytographic這個詞不好譯,通常的意思是「與密碼學有關的」,但在「Crytographic hash function」這個名字上,它是「適合在加密的時候使用」的意思。什麼叫「適合在加密的時候使用」?

第一,就是它作爲「單向函數」的可逆性很低,就算知道hash結果也無法反推出輸入。

第二,稍微更改輸入,它的輸出就非常不同。比如說,10000的hash是1234,10001的hash是4581。

10. 加密與解密

加密: 明文+加密算法+加密密鑰 = 密文

解密: 密文+解密算法+解密密鑰 = 明文

(密碼學經常用「鎖」的比喻,明文就是想要保護的東西,密文是個箱子,裏面裝了明文,上面有個鎖。要鎖上箱子,或者開鎖了箱子,就需要「鑰匙」。)

用凱撒密碼(所有字母按字母表順序往後推若干位)舉例。

假如說明文是「Hello」,算法是凱撒密碼,加密密鑰是1(所有字母往後1位),那密文就是Ifmmp。

密文是「Ifmmp」,算法是凱撒密碼的反向(所有字母往前推),解密密鑰是也1(所有字母往前1位),可以解出明文是Hello。

一般而言,優秀的加密算法,即使加密、解密算法公開,只要密鑰保密,一樣無法有效地破解。

11. 非對稱加密

凱撒密碼是「對稱加密」,就是說,加密用的鑰匙和解密用的鑰匙相同,如果不相同就根本無法解密。加密解密要是相同,就說明能加密的人必然能解密,能解密的人必然能加密。

有了「單向函數」(概念6),「非對稱加密」也是可能的,換句話說,加密用一個密鑰,解密用另一個密鑰。這兩個密鑰之間用「單向函數」聯繫,可以做到這個效果:知道解密密鑰的人可以輕易算出加密密鑰,但是知道加密密鑰的人算不出解密迷密鑰。換句話說:能加密的人未必能解密,相當於,你可以給你的朋友每人發一個一模一樣的密碼箱,他們可以把他們想對你說的話放在箱子裡,上鎖然後寄給你,但是,即使他們知道箱子的密碼(是一樣的),也沒辦法偷看別人箱子裡的東西。

由於解密密鑰通常保密、加密密鑰通常公開,慣例上,解密密鑰叫做「私鑰」,加密密鑰叫做「公鑰」。

12. 數字簽名

非對稱加密(概念11)有什麼用呢?可以用來做數字簽名。「加密」貨幣到底哪裏加密了?就在這。

下面是數字簽名機制的簡化流程:——

1. 你選兩個質數,比如67和191,兩個數字就是你的私鑰(區塊鏈錢包要你保存的「私鑰」,本質上就是兩個質數)。這兩個數字必須保密。

2. 你把這兩個質數做個運算,比如說相乘得12797,這就是你的公鑰。這個數字可以公告給全世界,它其實就是你在加密世界的「身份」。由於半質數因式分解(概念7)很困難,公佈公鑰並不會泄露私鑰。

3. 現在,你有一個文檔,比如說一則交易記錄,你想表達你對它的認可(簽名)。

4. 首先,你把這個文檔轉化成一個數字,(比如給字符編號,a是1,b是2,然後串起來),比方說我們用「hello」,那就是26進制的7-4-11-11-14,也就是十進制的3276872。

5. 然後,你要用只有你才知道的私鑰(67和191),對文檔(3276872)做數學操作(非常粗糙地假設是全部乘起來),得到一個新數字(41934130984),加在文檔上面。

6. 然後,你把附上了簽名(41934130984)的文檔(3276872 & 41934130984)發佈出去,這樣大家可以用數學操作,計算你的公鑰(12797)、驗證文檔(3276872)和簽名(41934130984)是否相符合(判斷3276872・12797 = 41934130984是否成立),從而確認你是不是簽了這個電子文檔。

其他人只有你的公鑰(12797),算不出私鑰(67和191),所以無法用同樣的簽名操作,僞造簽名。

(當然,實際的數學操作比乘法精妙多了,乘法根本沒有保密能力;兩個質數也不會直接作私鑰。但思路大致是這樣。)

13. 複式記賬

記帳有兩個思路:

1. 記錄餘額,每次交易之後,修改所有交易參與者的餘額,之後交易記錄可以扔掉,

2. 保存所有交易記錄,餘額是用交易記錄一筆一筆推算出來的。

第一種方法,大家個人大概都是這樣,能查到自己的銀行餘額,但不可能記下來從出生至今的每一筆支出收入。

第二種方法是企業經常用的,所有交易對手的每一筆款項出入都記錄在案,每個人的餘額都可以用交易記錄算出來。

比如甲乙二人,各有100元,然後有以下交易記錄:

甲->乙 30元

乙->甲 10元

乙->甲 35元。

那甲的餘額就是100-30+10+35 = 115;

乙的餘額就是100+30-10-35 = 85。

14. 密碼學貨幣

組合數字簽名(概念12)和複式記賬(概念13),就可以做出原始的密碼學貨幣了。

原理如下:

假設還是有甲乙兩個人,他們之前還是可以互相轉錢,假設現在甲要給乙30元:

那麼,甲首先寫一帳轉賬單據,內容是:「甲給乙30元」。

然後,甲用自己的私鑰簽名,轉帳單據變成「甲給乙30元+簽名碼」。

乙校驗甲的公鑰、轉賬單據、簽名碼三者是否符合,如何符合,就承認甲轉給了自己30元。

但是,這個貨幣還很有問題:

A. 乙雖然能認證「甲表態了要轉給我30元」,可是如何保證「甲真的有30元」(空頭支票問題)?

B. 一開始的錢怎麼發放?

15. 分佈式賬本

爲了解決問題A,Bitcoin提出的方案是:所有交易記錄必須通報所有人,所有人都可以計算所有人目前的餘額,如此才能保證所有人都確定,任何人轉賬的時候,賬上餘額足夠。

〔從所有交易記錄都公開的角度說,比特幣的隱私比傳統銀行系統糟糕多了。比特幣保護隱私是依靠隔離「公鑰」(電子身份)和「肉身」(物理身份)。或者說,任何人都可以開任意個比特幣賬戶,而無需任何人認證。〕

16. 樹

樹是一種數據結構。比如Matters的文章就是一個樹形結構,文章是樹的「根」,評論是文章的「子節點」,評論本身又可以有二級評論(子節點的子節點)。

17. Hash tree(又名Merkle tree)

Hash tree是一種樹(概念14)。它的特點是,每個葉子都會在內容中引用它的「上級」的cryptographic hash(概念7)。

比如說,假如Matters的內容是一個Merkle tree的話,會像這樣:

文章1[hash=12345]:大家好 [本文章無上游]

文章2[hash=88888]:你好! [本文章的上游是hash爲12345的文章]

文章3[hash=99999]: 你好呀! [本文章的上游是hash爲88888的文章]

留意,中括號中的內容(如[本評論的上游是……]),也是文章的一部分,計算整個文章的hash的時候,也會計算在內。因此,這就達到了牽一髮動全身的效果,如果有人篡改了文章2的內容,比如改成:

你去死吧! [本文章的上游是hash爲12345的文章]

那麼,文章2的hash就不會是88888了,那麼文章3的指代(上游是88888)也會失效。

所謂區塊鏈「不可篡改」,就來源於Merkle tree的這個特性。Merkle tree上的數據,距現在越遠,越難修改,因爲每篡改一個文檔,就必須重新計算它的hash,以及它下游的所有文檔的hash。

18. 賬單鏈

組合密碼學貨幣(概念14)、分佈式賬本(概念15)、和hash Tree(概念17),我們可以拼出一條賬單鏈:

有一羣人想互相轉賬,他們他們各自生成私鑰,並發佈公鑰讓大家知道。

每個要轉賬的人:

I. 先寫一張轉賬單〔我,公鑰12345,想轉賬給公鑰爲67890的人,金額100;本轉賬單的上一張爲hash 2383142〕;

II. 然後用自己(公鑰12345)的私鑰簽名;

III. 然後把轉賬單廣播給所有的人。

其他人接到了:

I. 先驗證簽名對不對,如果不對就扔掉;

II. 然後再驗證公鑰12345是不是真的有100塊錢,

如果有,那轉賬單成立,把轉賬單放進賬本,更新公鑰12345和公鑰67890的餘額;

如果餘額不足,那也把轉賬單扔掉。

這個賬單鏈的「鏈」,就是區塊鏈的「鏈」,是同一個原理。至於區塊是什麼,下面講。

19. 分佈式裁決機制

過去賬本只有一份(比如銀行存的),那自然它說了算。如果每個人手上都有一套交易記錄,那就必須處理大家存的賬本不一樣的情況。

每條交易記錄受數字簽名(概念10)的保護,整個交易記錄的賬本是個Merkle Tree(概念15),無法輕易回溯修改,爲什麼還會不一樣呢?

因爲雖然大多數人是好人,但總會有攻擊者想佔便宜。Merkle tree要篡改最新的一個文檔,是很容易的,因爲只用算一個hash,而不用重新計算文檔的下游(因爲沒有下游)。攻擊者雖然不能僞造別人的簽名,但是他知道自己的簽名,所以,它可以發一個真的轉賬單,比方說買個東西,等賣家發貨了,然後再從賬本上刪掉自己的轉賬單,假裝這個錢沒有花過。

此時,對於世界上所有其他人,賬本上寫着,他的錢花掉了。他的賬本上,他的錢沒花。

我們需要一個裁決機制。

一人一票,簡單多數好不好?

不好,因爲身份(公鑰)是很容易算的。假設有10000個人交易,我只要再開10000個馬甲,都由我控制投票,那我就可以發一張轉賬通知,花錢買點什麼,然後發動馬甲投票刪掉最後一條轉賬通知,這樣錢又回來了。

我們需要入門門檻比較高的「投票」。

20. Proof of work

Bitcoin的裁決機制是1997年Hashcash提出的proof of work的機制。

這個機制比較的不是投票人數,而是是cryptographic hash(概念7)的計算量。

機制是這樣的,首先,底子是賬單鏈(概念16):

I. 每個Bitcoin用戶都收集別的用戶廣播出來的轉賬單;

II. 收到的轉賬單都是有簽名的,Bitcoin用戶都要驗證;

III. (關鍵)每個Bitcoin用戶,收集了一定量的轉賬單,就打包成一個區塊(block),然後不斷嘗試這個區塊的內容加一個小尾巴(nonce),使其hash變化,直到滿足一定條件 ,hash的前20位都是0,這個前面都是0的hash,就是proof of work;

IIII. 算好了的block,就廣播給所有的Bitcoin用戶,其他用戶收到了block,驗證一下hash對不對,如果正確,就收入自己的賬本,視其中的交易爲確認的交易;

V. 如果同時存在多個版本的帳本,那就比較哪本賬本的block最多,因爲block最多的賬本,就是hash算力投入最大的賬本,也就是大家用自己CPU表示認可的賬本。

這裏的「區塊」(block)其實就是包裹一羣交易賬單的包裝而已。

21. Proof of work運算獎勵(挖礦)

Bitcoin的創新,或許在於Proof of work是有貨幣獎勵的。

剛纔概念18的第III步,打包轉賬單,Bitcoin的慣例是,這個區塊裏會多放一條轉賬單,內容是給算出本區塊正確hash的Bitcoin用戶一筆現金獎勵。就是說,假設有個Bitcoin用戶叫「甲」,他在拼區塊的時候,可能是這樣的:

甲轉賬20元給乙;

丁轉賬50元給戊;

……

創造100元給甲(挖礦獎勵)。

nonce:2312832123

hash:00000000000000000000002384123523408123

在白皮書中,挖礦獎勵一筆帶過(「by convention……」),但我覺得這可能是Bitcoin的一個關鍵的制度創新,因爲它會獎勵誠實的行爲。

22. 比特幣綜述

講到這裏,比特幣白皮書闡述的核心機制就介紹完了。下面是以上21個概念的關係:

CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…
加载中…

发布评论