比特幣第二次減半將至,為什麽比特幣總量設置為2100萬呢?這篇文章談笑中有幾分戲謔,但都是有的放矢,值得一讀。 {:.info}
比特幣總量2100萬個,這可能是剛接觸比特幣的小白們記得最清楚,也是最迷惑的數字。
中本聰沒在任何公開的言論中提到:為什麽選這個數字,於是網上出現了各種各樣的猜測和邏輯推理。
我們就來聊聊這個數:
最終產生的比特幣數量,準確的說是20999999.97690000個,比2100萬少一點。
比特幣產生的時間表:
下麵挑幾個重點分析一下這張表。
格林威治時間2009年1月3日18:15:05,創世區塊誕生。創世區塊的編號是0。從創世區塊開始的”階段1”,每個區塊產生50個新的比特幣或者說50億聰。
創世區塊:https://blockchain.info/block-height/0
格林威治時間2012年11月28日15:24:38,編號第210000個區塊產生。從這個區塊起的”階段2”,每個區塊包含的新比特幣數量減半為25個,這是曆史上第一次減半。今後每產生210000個區塊,比特幣數量都會依次減半。直到第33次減半時,每個塊產生0.0021個新比特幣直接減為0個。
210000塊:https://blockchain.info/block-height/210000
每4年減半是不太嚴格的說法。實際情況:比特幣大約每10分鍾產生一個區塊,而210000個10分鍾接近4年(4年等於210384個10分鍾。這應該是中本聰特意選取的數字)。
2016年將發生第二次減半,但現在討論這個有點早。我要說的是2016個塊的問題。
比特幣係統調節挖礦難度的原理是:根據前2016個塊產生的總時間,調整後2016個塊的挖礦難度,讓挖出這2016個塊的時間為14天。因為,每小時6個10分鍾乘以24小時再乘以14天=2016。所以,所謂10分鍾隻是平均值目標。由於目前算力上漲很快,實際上挖出2016個塊的速度往往少於14天。
難度調整的話題涉及到挖礦,以後再一並分析。
網絡上有很多種猜測,有些很靠譜,有些不靠譜但很歡樂。
It’s the first half of the answer: 42. 翻譯:因為21是終極答案42的一半。 (說明:英語裏,2100萬表示為:21 million。所以,老外一般直接問:為啥是21。)
當然,他是開玩笑的。不過,我個人最喜歡這個猜測,這也是reddit裏頂的人最多的。
這個梗來自電影《銀河係漫遊指南》裏終極答案的橋段。
Because we’re living in the 21st century! 翻譯:因為我們生活在21世紀!
太天真,不忍吐槽。
He chose a reward scheme and 10 minute blocks. When he did the math, it came to 21 million. He didn’t choose the 21 million, he just accepted the consequence of the parameters he chose. 翻譯:中本聰訂好10分鍾、50幣、4年減半的原則,結果自然出來了。他沒有選,而是接受了這個自然的結果。
這個答案也是有可能的。中本聰在比特幣中的很多選擇確實是撞大運的,但都是“基於經驗的撞大運”。
All gold mined in human history can be fit into a cube roughly 21 meters on each side. Satoshi created bitcoin with the idea of being sort of a digital analog of gold (finite supply, mining, etc), as well as the fact that it built upon Nick Szabo’s “Bit Gold” proposal, so I think that 21 million was sort of a clever nod to that. 翻譯:全世界所有黃金熔在一起,是一個邊長大約為21米的正方體。中本聰用這個概念,隱喻比特幣是一種虛擬黃金。
原來陰謀論不止中國有…
I was going to say: Satoshi likes to play Vegas blackjack. 翻譯:我覺得中本聰喜歡玩21點。
上帝玩骰子麽?
計算機雙精度浮點數最多存儲253精度的數。而比特幣按最小單位算的總精度是251,剛好夠用。(英文太長不貼了)
這個答案,出現在一篇很不錯的文章裏《中本聰的天才:比特幣以意想不到的方式躲開了一些密碼學子彈》
詳細:
比特幣有爭議的屬性之一就是它的固定的供應量。當前每10分鍾又25個新的比特幣被生產出來,並且這一數字每4年減半。總的來講,不會有超過2100萬個比特幣的存在。另一方麵,每個比特幣可以被劃分成1億份(每份叫做1“聰”),如果一美分都足夠買輛車的話,用美元來交易就麻煩重重了,但比特幣就算升值到和上麵假設的美元的狀況,也不會遇到那樣的問題。因此,總之,將永遠存在的貨幣單位的總數字是2,100,000,000,000,000,也就是2100萬億,或者說250.899。在選擇這個數值的方麵,中本聰比大多數人意識到的要幸運的多或者說聰明的多。首先,這個數字遠小於264-1,這是一台計算機裏麵可以以標準整數形式存放的最大整數,超過那個值的話,數值將像裏程表那樣歸零。 其次,然而,還有一個總“聰”數要設法低於的更小的閾值:可以用浮點的格式表示的可能的最大整數。整數不是計算機可以存儲的唯一一種數字;為了處理小數,計算機使用一種做浮點表示法的格式。浮點表示法本質上就是一個科學記數法的二進製版本。舉個例子,下麵是一個在你學習物理學的時候會遇到的值: 地球的質量: 5.972 1024 kg 太陽的質量: 1.989 1030 kg 光速: 2.998 108 m/s 一光年: 9.460 1015 m 質子的質量: 1.672 10-27 kg 普朗克長度: 1.616 10-35 m 我們可以注意到,科學記數法是如何使得你可以在合理的精度下表示所有的這些數值,盡管它們的大小相差極大。浮點表示法本質上就是二進製的科學記數法;當你存儲數字9.625的時候,你的計算機存放的是“1.001101 * 1011”(或者說,它存放的是01000000 00100011 01000000 00000000 00000000 00000000 00000000 00000000,這是高精度序列形式的同樣一回事)。在這個高精度形式中,係數(也就是不是指數的那部分)有52位(52bits)。這意味著高精度(更加精確的說法是“雙精度”)浮點數足以存貯高達253的數字,但不能再高了,如果超過了,你就得開始砍掉末尾的數字。比特幣的250.9這一以指數形式表現的總“聰”數,剛好低於這個最大值。 如果我們有了整數,我們為什麽還要關心浮點值呢?因為更多的高階編程語言(比如說Javascript)並不開放低階的“浮點”和“整數表示法”,而隻給程序員提供“數”的概念 – 當然以浮點的形式提供。如果中本聰當時選擇了2億1千萬而不是2100萬這個值的話,用很多語言裏比特幣編程就會比現在要麻煩得多了。 注意,Stefan Thomas不幸的在他寫BitcoinJS的時候沒有及時留意到這個,以至於那個庫使用了一個專門的‘大數big number’對象,而不是一個普通數來存儲教程輸出值;我自己分叉的的BitcoinJS(同時還加入了其他的改進)使用了普通數。
That explanation is close but not entirely compelling. IEEE double-precision floating-point format has 53 bits of significand precision, meaning it can address up to 253 − 1 satoshis without any rounding error. Well, that’s 9,007,199,254,740,991 satoshis, which is not anywhere close to 2,100,000,000,000,000 satoshis (or even 2,099,999,997,690,000 satoshis, which is the actual asymptotic limit). I think a much more compelling explanation is that a signed 32-bit integer can store values up to 231 − 1, which is 2,147,483,647. If you assume a fixed-point format with two decimal digits of fractional precision (which is typical for money), then a signed 32-bit integer can address up to 21,474,836.47 bitcoins, which we might as well round off to 21 million. My guess is that Satoshi derived the 21-million limit from here early in development and then later realized that this wouldn’t be enough currency units and so extended the number of decimal places from 2 to 8 and changed the variables from 32-bit to 64-bit. 翻譯:答案6的解釋很接近,但有點牽強。IEEE雙精度浮點數是53bits,能表示的最大數是9,007,199,254,740,991聰,而比特幣是2,099,999,997,690,000聰,差別還是很大的。
我覺得更好的解釋:有符號32位整數可存儲最大232-1的數,是2,147,483,647。如果比特幣是小數點後兩位的話,就是21,474,836.47個比特幣。也就是21-million。我猜中本聰在最初開發的時候用32位精度的整數,後來發現對於一種全球通用貨幣來說這個精度不夠,所以把小數點後2位延展成8位,從32位存儲改成64位存儲。
這是我覺得最靠譜的答案,因為從中本聰的過往言論可以看出,他不是一個完美主義者,而是一個實用主義者。