12-BTC-思考

聲明:本文是要點筆記,介紹和系列筆記均收錄在專題:區塊鏈技術與應用

哈希指針

指針保存的是本地內存的地址,那麼只是在本地這臺計算機上纔有意義,發送到其他計算機上就沒有意義了。那麼在發佈區塊的時候哈希指針是怎麼能夠通過網絡進行傳輸呢?

所謂的哈希指針只是一種形象的說法,實際系統中用的時候只有哈希,沒有指針。回顧一下之前看到的 block header 的數據結構,如下圖所示。第 25 行就是指向前一個區塊的哈希,沒有指針。block header 裏只有哈希值,沒有指針。

那麼怎麼才能找到前一個區塊的內容呢?全節點一般是把這些區塊存儲在一個(key,value)數據庫裏面。key 是區塊的哈希,value 就是區塊的內容。一個常用的 key value 數據庫是 levelDB。所謂的區塊鏈這種鏈表結構,實際上是在 level DB 裏面用哈希值算出來的。只要你掌握了最後一個區塊的哈希值,那麼你通過 levelDB 的查找,哈希值 key 對應的 value 就可以把最後一個區塊的內容取出來。然後這個區塊塊頭裏面,又有指向前一個區塊的哈希值。那麼再去查找 key 和 value,可以找到前一個區塊的內容,以此類推,一步一步往前找,最終能夠把整個區塊鏈都找出來。

所以說在實際系統當中,所謂的哈希指針,只有哈希,沒有指針,或者也可以認爲哈希值的本身就是指針。

有一些節點沒有保存完整的區塊鏈的信息,只保存了最近的幾千個區塊,如果需要用到前面的區塊的信息,可以問其他的全節點。哈希指針的性質保證了整個區塊鏈的內容是不可篡改的。

區塊戀

就是指,把一個私鑰分成幾份,有幾個人各自保管,只有最終大家都拿出自己的部分私鑰,才能合成完整的私鑰。

這樣存在的問題是:這些人中任何一個人把私鑰丟了錢就取不出來了。還有更大一個問題:這種截斷私鑰的做法會降低賬戶的安全性。因爲比特幣系統中每個賬戶的安全性跟所用的私鑰的長度是相關的。

爲什麼要用 256 位的私鑰?因爲這個長度的私鑰用暴力破解的方法是不可行的。就算把全世界的計算機集中起來破解 256 位的私鑰,也是不可能成功的。但是如果從中截斷,一對情侶中一個人分手之後想把錢取出來,他已經知道了其中一半的私鑰,只要把剩下的 128 位私鑰猜出來就行了。私鑰長度減少一半,並不意味着難度降低一半,難度由 2 的 256 次方降到了 2 的 128 次方,前者遠遠大於後者,破解難度降了很多。如果是四個合夥人的例子,有三個人瞞着另一個人要把錢取出來,那麼他們只需要嘗試 2 的 64 次方就可以了。

因此對於多個人的共享賬戶,不要用截斷私鑰的方法,而最好採用多重簽名,多重簽名中用到的每一個私鑰都是獨立產生的。而且多重簽名也提供一些別的靈活性,比如可以要求 N 個人當中任意給出 M 個簽名就可以了。

在區塊戀例子中,如果一對情侶分手了,那麼他們的比特幣將永久的保存在 UTXO 裏面,這對礦工是不友好的。礦工是不知道這筆錢永遠取不出來的,所以礦工要把這筆錢永久的保存在 UTXO 裏面,造成這個集合的膨脹。

分佈式共識

前面已經講過,從理論上實現分佈式系統的共識是不可能的,但實際當中又怎麼變的可能了呢?爲什麼比特幣系統能夠繞過分佈式共識中的那些不可能結論?嚴格來說,比特幣並沒有取得真正意義上的共識,因爲取得的共識隨時有可能被推翻,比如出現了分叉攻擊。你以爲已經取得了一個共識,分叉攻擊後,系統會回滾到前一個狀態,從理論上說甚至有可能回滾到創世紀塊。

按照分佈式系統理論的要求,共識一旦達成之後,就不應該再改了,所以從這方面來說比特幣並沒有繞過分佈式系統那些不可能的結論,因爲它並沒有達到真正意義上的共識。這說明理論和實際往往是有區別的。很多理論上的不可能結論對於實際當中是並不適用的,因爲這種不可能結論只是對某種特定的模型下是不可能的,實際當中把模型稍微改一改不可能結論就不成立了。

比特幣的稀缺性

礦工挖礦的原因是爲了獲得收益,挖礦的收益要大於開銷纔是有利可圖的。要吸引別人來挖礦,要麼增加挖礦的收益,要麼降低挖礦開銷。任何一個新發行的加密貨幣,都有一個冷啓動的問題。早期爲了吸引礦工來挖礦,可以給礦工更多的收益。比特幣的做法是:1、早期難度設置的比較低。2、早期的出塊獎勵比較高。

實際上,比特幣這種總量恆定的性質是不適合用來做貨幣的。後面講的以太坊就沒有出塊獎勵定期減半的做法,一些新型的貨幣甚至要自帶通脹的功能,每年要把貨幣的通行量提高一定的比例。因爲稀缺的東西是不適合用來做貨幣的,通貨膨脹會導致錢變得更不值錢了,但一個好的貨幣是要有通貨膨脹的功能的。

量子計算

隨着量子計算的發展,量子計算機計算力變得越來越強大,加密貨幣會不會變得不安全了?

這種擔心是沒必要的:

  1. 量子計算技術離實用還有很長一段距離,在比特幣的有生之年不一定能產生實質性的聯繫。如果量子計算在將來能強大到破壞加密體系的話,首先會衝擊的是傳統金融業。比如我們在網上進行的很多金融活動:網上銀行、網上轉賬、網上支付,都會變得不安全了。所以與其擔心量子計算對比特幣的衝擊,還不如擔心量子計算對傳統金融業的衝擊,因爲大多數的錢還是放在傳統金融業裏面的,加密貨幣的市值只佔了現代金融體系當中的很小一部分。

  2. 比特幣當中沒有把賬戶的公鑰直接暴露出來,而是用公鑰取哈希之後得到一個地址。比特幣當中用的非對稱加密體系,從私鑰是可以推導出公鑰的。所以只要把私鑰保管好,公鑰其實丟了也沒有關係。從公鑰顯然是不能推出私鑰的,否則就麻煩了。

假設將來量子計算技術發達了,能夠從公鑰中推出私鑰,那怎麼辦呢?比特幣在設計的時候又加了一層保護,沒有用公鑰本身,而是用公鑰的哈希。所以如果有人想偷你賬戶上的錢的話,首先是要用地址推導出你的公鑰,相當於把公鑰的哈希值進行逆運算,而這一點即使是用量子計算機也是沒有辦法完成的。

加密和取哈希是兩個不同性質的操作,加密的目的是爲了將來能夠解密,所以加密算法要保證信息的完整性,加密過程是不能丟失信息的,這樣解密的時候才能夠還原原來的輸入。但是取哈希的過程一般是會造成信息的損失的,哈希函數一般都是不可逆的,因爲有些信息在取哈希的過程中就已經丟失了。

比特幣系統中用的哈希算法是 SHA-256,算出的哈希值是 256 位,無論輸入有多大,即使有幾個 T,算出來的哈希值也是 256 位。這樣的運算過程顯然是不可逆的。如果可逆那可就變成了一個超級壓縮算法。

所以在比特幣系統中,如果要收款就沒必要把公鑰暴露出來,只暴露公鑰的哈希生成的地址就行了。將來要取錢的時候才需要公鑰和私鑰產生的簽名。假如一個壞人在網上監聽到了你取錢的交易,知道了你的公鑰,他要偷你的錢,就必須實時的從公鑰推導出私鑰來,然後要產生一個跟你競爭的交易。你要把錢轉你賬戶,他要把你錢轉給他賬戶,即使這個壞人擁有量子計算機也很難幾分鐘內把你的私鑰破解了,而且他發佈的交易要搶在你交易的前面。

所以安全起見,一個地址用過之後就不要再用了,每次取錢最好把錢一次取走,即使取不完,也最好把錢轉給另一個安全的賬戶。後面會講到,以太坊中的地址也是從公鑰當中推導出來的,但也不是公鑰本身,也是公鑰取哈希之後進行的轉換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章