怎樣向外文系女朋友解釋比特幣?

最近感覺身邊有點閑錢的人都在炒幣,沒閑錢的都在信用卡套現炒幣。

女朋友:「比特幣是啥幣?咋就值那麼多錢?」

我:「比特幣是一種基於電子簽名、工作量證明和密碼哈希演算法的去中心化數字貨幣。」

女朋友:「#$*#^@%_¥>」

我:「啥意思?」

女朋友:「這是一條基於電子簽名、工作量證明和和密碼哈希演算法的消息」

我:「...」

那麼問題來了,怎樣向外文系畢業,只學過高中數學的女朋友解釋區塊鏈或者比特幣的原理?

首先我們從大家更熟悉的東西說起,記賬和簽名。

·公共賬本

假設我和幾個朋友小A、小B、小C..生活在一起,有時候我們吃飯要AA,有時候我吃了小A的麵包,有時候小B又借了100塊錢給小C...由於資金往來很頻繁,我們每次都用現金結算很麻煩,於是我們想著,乾脆大家先把賬記下來,然後一段時間結算一次。於是我們就開始記賬了:

賬本1.0

誰來負責記賬呢?找其中一個人負責?或者找個中立的第三方?

這一些都必須建立在我們對某個中心的信任之上。如果我們不信任任何一個中心,不希望記賬的權利集中在某一個人或機構身上呢?

為了讓每個人都可以隨時記賬和查賬,不依賴任何第三方(即去中心化),我們把賬本放在網上(比如google doc),公共編輯。

·電子簽名

問題來了,萬一小A在上面亂寫怎麼辦,比如小A悄悄上去加一條記錄「小B付給小A10000元」,小B可就虧大了。於是我們需要引入簽名。每條賬目必須簽名才生效。

賬本2.0

由於賬目是記在網上,我們需要使用電子簽名。電子簽名是一串由0和1組成的長達256位的數字。例如:01100001000110101001....(256位)

那麼我們怎樣得到自己的電子簽名呢?這裡需要再引入兩個概念公鑰和私鑰。每個人首先要生成一組公鑰和私鑰,他們看上去都是一串0和1組成的數字。例如:

私鑰:0001011100100110... 公鑰:0110010010101...

私鑰自己保存,用於生成簽名,公鑰向大家公開,用於驗證簽名。這裡需要用的兩個函數:

第一個函數:f1(信息,私鑰)=簽名

這個函數的意思是,把信息(一條賬目就是一種信息)和私鑰輸入函數,即可得到簽名。注意,這個函數是不可逆向計算的,即你不可以通過簽名,反向計算出私鑰。另外,輸入的信息(賬目)不同,輸出的簽名也完全不同,所以你在不同的賬目後面簽名是不一樣的,別人不能把你在一條賬目後面的簽名複製到別的地方去。

那麼我們怎麼知道這個簽名真的是你簽的呢?那就要用到第二個函數:

f2(簽名,公鑰)=真 or 假

這個函數的意思是,任何人都可以用你公開的公鑰去驗證簽名的真假。把簽名和公鑰輸入函數,就會告訴你簽名的真假。

這兩個函數的細節就不講了,你可以確定的是,如果沒有私鑰的話,你想碰運氣試出能通過f2檢驗的真實簽名是不可能的。因為這裡面有2^256(2的256次方)種可能..

2^256這個數字真的bigger than bigger。我們一個一個碰運氣,用1億台世界上最快的計算機,一起算1億年,都遠遠算不完。你要是說「我運氣就是好,一擊命中」,這命中的概率,比「從地球上瞎開一槍正好打中火星上某個外星人的左眼的概率」還要小...下次有空詳細講下2^256這個數字有多大。

機智的人可能會問:我直接把這行賬目和簽名一起複制粘貼,交易不就翻倍了嗎?解決方案很簡單,我們在每一行賬目前面再加一個不允許重複的唯一id即可。所以我們的賬本又升級了:

賬本3.0

·有人欠錢跑路怎麼辦?

如果小A欠了一屁股債,然後在結算之前跑路了,怎麼辦?

為了避免這一情況,我們只需在賬本最初,記上每個人的總錢數即可。當某人的餘額為零了,他就不能再通過賬本向別人付錢了。即使記了帳,也被判無效。如果小A餘額為零了,他必須為別人打工,讓別人通過賬本向他支付報酬。這和現實世界中以貨幣為載體進行價值轉移的原理,其實是一模一樣的。

如果所有人都就賬本使用達成共識,並使用同一本賬本,理論上可以通過記賬實現一切價值轉移,不再需要貨幣。

·每人一個賬本

之前提到,為了讓每個人都可以隨時記賬和查賬,我們把賬本放在網上讓大家協同編輯。但是如果網站掛了怎麼辦?網站負責人把數據刪了怎麼辦?所以如果我們把賬本放在網上,歸根結底還是必須要信任網站管理者這個中心,並沒有實現真正的去中心化。

那麼,乾脆一個人一個賬本吧!當小A付給小B100元,小A就把這條交易信息簽上名,然後廣播出去給所有人,收到廣播的人就在自己的賬本上加這一條記錄即可。

·哈希函數

每個人都在自己的賬本上記賬的話,怎麼保證大家都記得一樣呢?如果不一樣以誰的為準呢?比特幣之父中本聰的方案聽起來很無厘頭:哪個賬本上的計算量最大就認為他是真實的賬本。

你可能有點懵逼了,計算量?記個賬而已需要計算啥?憑啥計算量最大就是真的?好了,先放一邊,我們再補充一個概念——哈希函數

哈希函數很神奇,我們往函數里輸入任意信息(比如我們的賬本)就會得到一串256位的1001001110001...的數字,這個數字我們叫做哈希值。往函數里輸入的值稍微改變一點(比如小A惡意篡改了賬本中的一條),輸出的哈希值將完全不一樣。而且這個函數是不可逆推的,意思是你不可能根據輸出的哈希值去反向計算出輸入的信息。

值得一提的是,並沒有嚴格的數學證明這個哈希函數不可逆向計算,但是現代信息安全基本都是基於哈希函數。

·工作量證明和區塊

有了哈希函數,我們再對賬本做點改進。我們要求每一個有效的賬本,最後必須帶上一個數字,使得將賬本輸入哈希函數後會得到一個前30位都是0的哈希值。由於哈希函數是不可逆的,你只能一個一個去試,平均要試10億次才能確保找到一個這樣的數。我們把這個數叫做「工作量證明」。如果有人篡改了賬目,工作量證明馬上會變,又得重新算。於是現在我們的賬本應該是這樣的:

賬本4.0

中本聰大神表示一切才剛剛開始。有了賬本中加入工作量證明數之後,我們要把賬本分成很多個區塊(block),每個區塊是一部分賬目和一個「工作量證明」。為了保證區塊順序,我們要求每個區塊還必須帶上上一個區塊的哈希值。那麼如果修改或順序變了,區塊上帶的哈希值就會變,那所有 「工作量證明」就完全變了,得全部重新算一次。這個賬本就是大名鼎鼎的區塊鏈(block chain)。

區塊鏈

·挖礦

前面說到所有人都可以參與建造區塊,參與建造區塊的人被稱為「礦工」。當他們收到廣播中的交易信息時,就把他們收集起來裝進一個區塊,然後開始拚命計算這個區塊的「工作量證明」(當然是用計算機算)。前面說了,礦工們平均要試10億次才能確保找到一個這樣的數,當第一個幸運兒找到之後,立即將這個區塊廣播出去,向大家宣告我找到了。其他人就只需要把這個區塊加進自己的鏈即可。礦工的這一系列計算被稱為「挖礦」。為了激勵挖礦,我們需要協議給礦工一些獎勵,這個獎勵就是比特幣。每個礦工完成「工作量證明」的同時,他可以在這個區塊中憑空增加一行特殊的賬目「我收到10個比特幣的獎勵」,且這條賬目不需簽名即可生效。你可能會意識到,每一個新區塊的產生,都會憑空產生一些新的比特幣。比特幣就是這樣挖出來的。

·為什麼工作量最大的賬本就是真實的賬本?

如果我不想要獎勵,也沒有力氣去算,那就只需要接受礦工發出來的區塊鏈,然後更新自己的賬本即可。但當你接收到兩條不同的鏈的時候,哪條是真實的?中本聰告訴我:很簡單,選計算量更大那條,也就是更長的那條。如果兩條一樣長,我們就等著,看他們變長,總有一條會更長的。

為什麼鏈越長工作量越大,就一定是真的呢?我們不妨換一個方向來思考,在工作量證明的前提下,怎樣能造假?即怎樣讓一條假的鏈,始終保持最長?

假設小A想偽造一個區塊給小B,寫著「小A付給小B100元」,但同時小A不願向其他人廣播這個區塊,以便讓其他人認為他沒付錢給小B,即他的資產沒有減少。

小A在向小B廣播偽造的區塊,而其他礦工也在各自建造區塊。那麼小B必定會收到兩條不一樣的區塊,一條來自小A一條來自其他礦工。小A為了騙到小B,她必須比所有人更快的算出工作量證明,以保證她的那條鏈增長得更快。為了讓小B一直相信他偽造的區塊鏈,小A必須在每個區塊都比其他礦工先算出工作量證明,不然其他礦工總會趕上她。為此她必須擁有整個區塊鏈網路中的50%以上的計算能力。

以上基本就是比特幣以及大部分數字貨幣的主要思想了。

·補充

比特幣協議中規定新增一個區塊的時間間隔需要被控制在大約10分鐘。隨著礦工的計算能力越來越高,為了保持出塊的時間間隔,只需增加哈希值開頭的0的個數即可,每增加一個0,需要計算的次數就翻一倍。現在很多新幣的出塊速度很塊,比如eth只要15s,xrp只有3.5s。

另外每個區塊的獎勵是遞減的,最開始每完成區塊的工作量證明獎勵50的比特幣,但協議規定每算出21萬個區塊,約4年,獎勵會減半,由於獎勵按幾何級數遞減,比特幣總量將不會超過2100萬。這也是促成比特幣稀缺、高價的原因之一。

好了,大概就講這些吧,待會兒女朋友就回來了,不知道她能不能看懂。當然,更大的可能是,她根本看不完這又臭又長的文章..

參考資料:

1、youtube.com/watch?

2、wenku.baidu.com/view/c6


推薦閱讀:

為什麼轉基因問題上反轉人士卻往往能在非專業的討論中看起來更為有理有據?
人進入四維空間以後會四維化呢還是以三維的形態死亡呢?
所謂可樂殺精有科學依據嗎?
最強看門人——安東尼·列文虎克(下)
什麼是卡農?

TAG:比特幣Bitcoin | 科普 |